2011-08-31 31 views
5

Me preguntaba acerca de las mejores prácticas para sincronizar varias instancias azure que ejecutan el mismo rol. Más precisamente, quiero evitar que varias funciones de los trabajadores trabajen en la misma unidad de trabajo.Sincronización entre roles Azure

Las colas azules no parecen ayudar en este asunto. Una opción es usar una tabla SQL con bloqueos y procedimientos almacenados; pero usar la sincronización sql en Azure parece un poco incómodo.

¿Alguna idea?

Editar, mi detallada (pero simplificado problema) es el siguiente:

  • Hay n objetivos.
  • Se debe realizar una unidad de trabajo en cada objetivo en un intervalo específico (digamos 30 segundos, pero es diferente para cada objetivo).
  • Tengo m trabajadores (alojado en h instancias).
  • El procesamiento de una unidad de trabajo puede tardar entre 10 segundos y 1 hora.

La idea es que tengo un planificador que pone las unidades de trabajo en una cola de Azure, y cada uno de los m trabajadores a leer estos y procesarlos.

El problema:

  • worker1 comienza a trabajar en unidad1 (que es con respecto a destino1) - éste tomará mucho tiempo, por ejemplo, 10 minutos
  • transcurren 30 segundos
  • la planificador pone otra unidad de trabajo para target1, digamos unit13
  • worker2 comienza a trabajar en unit13, en contra de la misma destino1 - no es bueno

Tengo algunas ideas, pero que no parecen nublado suficiente, por lo que me interesa vea qué soluciones aplicaría para este problema.

+2

¿Por qué crees que las colas no funcionarán aquí? Las colas son la forma tradicional de coordinar el trabajo que se debe hacer una vez. Hay algunos matices seguros, pero el caso del 90% es con colas. – dunnry

+0

Estoy de acuerdo con la respuesta de David, las colas son generalmente una buena opción. Aunque hay momentos en los que no puedes hacer colas. Pero si ese es el caso, describa su problema en detalle e intentaremos brindarle una mejor respuesta. –

+0

Mientras tanto, publiqué una idea para UserVoice para Azure: http://entlib.uservoice.com/forums/101257-windows-azure-integration-pack/suggestions/2050987-distributed-synchronization?ref=title algo que podría ser útil para aquellos casos en los que las Colas simplemente no funcionarán –

Respuesta

4

Acabo de escribir un par de publicaciones en el blog sobre el uso de arrendamiento de blob para hacer este tipo de cosas. Ver http://blog.smarx.com/posts/managing-concurrency-in-windows-azure-with-leases y http://blog.smarx.com/posts/building-a-task-scheduler-in-windows-azure.

+0

Muchas gracias por la respuesta. En realidad, mi idea original era usar colas para la distribución de tareas y blobs para la sincronización, pero estaba usando una biblioteca diferente. También tomaré el tuyo y lo probaré. – Flavius

2

dunnry es puntual: las colas funcionan perfectamente para evitar que varias instancias funcionen en el mismo elemento de trabajo. Cuando llame al GetMessage, el mensaje que recupera ahora es invisible para el período de tiempo que especifique (valor predeterminado: 30 segundos). En ese intervalo de tiempo, ningún otro lector puede recuperar este mensaje de cola.

Dicho esto: debe asegurarse de que su procesamiento sea idempotente. En el caso en que su procesamiento demore más tiempo que el intervalo de invisibilidad, el mensaje vuelve a ser visible. En este punto, el lector original no puede borrar el mensaje, y algún otro lector puede leer el mensaje (volviendo a ser invisible).En este caso, es posible que reproceses el mismo mensaje. Deberá configurar cuidadosamente la ventana de tiempo de espera para evitar esto como regla general.

Nota: Cada CloudQueueMessage tiene una propiedad DequeueCount, por lo que puede determinar si el mensaje se ha visto más de una vez (y también puede tratar con mensajes tóxicos).

+0

Una pequeña aclaración: el propietario del último recibo pop es el único que puede eliminar el mensaje de la cola. Por lo tanto, incluso en el caso de que un mensaje fuera 'visible' nuevamente, aún podría ser eliminado por el lector original, siempre que no se haya eliminado en el intervalo (lo que generaría un nuevo recibo pop). – dunnry

0

CloudFX tiene una clase PrimaryInstanceManager que se puede utilizar para algunos de estos escenarios.

Cuestiones relacionadas