2012-03-28 13 views
11

¿Cómo se evita que Apio ejecute una tarea periódica antes de que se complete la ejecución anterior?Cómo garantizar que una tarea de apio esté evitando la superposición de las ejecuciones de la tarea de apio

Tengo un clúster de servidores, vinculado a un servidor de base de datos común, ejecutando las tareas de Apio, y estoy descubriendo que cada servidor ocasionalmente puede ejecutar la misma tarea simultáneamente así como diferentes servidores ejecutando la misma tarea simultáneamente. Esto está causando muchas condiciones de carrera que corrompen mis datos de maneras dolorosamente sutiles.

He estado leyendo Celery's docs, pero no encuentro ninguna opción que lo permita explícitamente. Encontré un similar question, pero la solución sugerida parece un truco, ya que depende del marco de caché de Django y, por lo tanto, no todos los servidores de un clúster pueden compartirlo, lo que permite que varios servidores sigan ejecutando la misma tarea al mismo tiempo.

¿Hay alguna opción en Celery para registrar qué tareas se están ejecutando actualmente en la base de datos y no volver a ejecutar hasta que se borre el registro de la base de datos?

estoy usando el módulo de Django-apio, ya pesar de que proporciona páginas/admin/djcelery/taskstate/y/admin/djcelery/workerstate /, he visto Nunca cualquier tarea o trabajadores de larga ejecución aparecer allí.

Respuesta

2

Si yo fuera usted configuraría una cola especial para cualquier trabajo que no se pueda ejecutar simultáneamente. Luego, simplemente puede iniciar un trabajador por separado solo para esa cola.

3

La forma estándar es usar el bloqueo compartido a través del mecanismo de caché estándar django. Ver this recipe de la documentación oficial

+0

Y como menciono, no es un mecanismo robusto en una configuración de clúster ... ¿Por qué no hay ninguna opción que use la base de datos? – Cerin

+0

Utilice el backend de memcached y obtendrá la funcionalidad de clúster –

+1

@AlexLebedev, ese es un buen punto, pero * si y solo si * las máquinas del clúster comparten el servidor. Por ejemplo, no es impensable ejecutar memcached localmente y usar un backend de memoria caché localhost en cada caja. Lógicamente obvio, pero solo quería señalarlo para que nadie pensara "oh, estoy usando memcached, problema resuelto". – mrooney

Cuestiones relacionadas