2011-08-10 23 views
8

Estoy buscando un marco distribuido tipo cron para Python, y encontré Aplery. Sin embargo, el documento dice "Debe asegurarse de que solo un programador se ejecute para un programa a la vez, de lo contrario terminaría con tareas duplicadas", Celery está usando aplery.beat.PersistentScheduler que almacena el horario en un archivo local.Planificador de apio distribuido

Entonces, mi pregunta, ¿existe otra implementación distinta de la predeterminada que puede poner el cronograma "en el clúster" y coordinar la ejecución de tareas para que cada tarea solo se ejecute una vez? Mi objetivo es ser capaz de ejecutar apio-cebo con horarios idénticos en todos los hosts del clúster.

Gracias

Respuesta

0

creo que podría haber algún malentendido sobre lo que hace celerybeat. Celerybeat no procesa las tareas periódicas; solo los publica. Pone las tareas periódicas en la cola para que las procesen los trabajadores. Si ejecuta un único proceso de celerybeat y múltiples procesos apilados, la ejecución de la tarea se distribuirá en el clúster.

+1

entiendo que, lo que yo quiero es ser capaz de ejecutar múltiples instancias celerybeat, así que puedo evitar el riesgo de que si el host que ejecuta apio de cebo disminuye, la programación se detenga. Es decir. un programador agrupado. –

+1

Ok, entonces la respuesta es no. Consulte https://github.com/ask/celery/issues/251 –

+0

Ok, gracias. Lástima que nunca llegó a 2.3 ... –

0

Tuvimos el mismo problema cuando teníamos tres servidores ejecutando Celerybeat. Sin embargo, nuestra solución fue ejecutar Celerybeat en un solo servidor para que no se crearan tareas duplicadas. ¿Por qué querrías que Celerybeat se ejecutara en varios servidores?

Si le preocupa que apriete el apio, solo cree un script para supervisar que el proceso de Celerybeat todavía se está ejecutando.

$ ps aux | grep celerybeat 

Esto le mostrará si el proceso Celerybeat se está ejecutando. Luego, cree un script donde, si ve que el proceso está inactivo, envíe un correo electrónico a los administradores del sistema. Here's a sample setup donde solo estamos ejecutando Celerybeat en un servidor.

+3

No es realmente una respuesta aquí. Esto es más como una solución. El problema surge durante la implementación, supongamos que necesita distribuir la aplicación en varios nodos homogéneos; tener cuidado de que solo un nodo ejecute el planificador significa tener un procedimiento de implementación para todos los nodos y otro procedimiento de implementación solo para el "nodo del planificador" – Sdra

1

tl; dr: No Celerybeat no es adecuado para su caso de uso. Debe ejecutar solo un proceso de celerybeat, de lo contrario, sus tareas se duplicarán.

Sé que esta es una pregunta muy antigua. Trataré de hacer un pequeño resumen porque tengo el mismo problema/pregunta (en el año 2018).

Algunos antecedentes: estamos ejecutando la aplicación Django (con apio) en el clúster de Kubernetes. El clúster (instancias EC2) y los Pods (~ contenedores) se escalan automáticamente: simplemente dicho, no sé cuándo y cuántas instancias de la aplicación se están ejecutando.

Es su responsabilidad ejecutar solo un proceso del celerybeat; de lo contrario, sus tareas se duplicarán. [1] Había una solicitud de función en el repositorio de apio: [2]

Exigir al usuario para asegurarse de que sólo una instancia de celerybeat existe a través de su grupo crea una aplicación sustancial carga (ya sea creando un único punto de falla o animando a los usuarios para que desplieguen su propio mutex distribuido).

celerybeat debe proporcionar un mecanismo para evitar la concurrencia inadvertida , o la documentación debe sugerir un enfoque de mejores prácticas .

Después de un tiempo, esta solicitud de función fue rechazada por el autor de Aplery por falta de recursos. [3] I   recomiendo leer todo el hilo en el Github. La gente allí recomendar estos proyectos/soluciones:

no probé nada de lo anterior (que no quiero otra dependencia en mi aplicación y no me gustan las tareas de bloqueo/es necesario lidiar con el fail-over, etc./).

Terminé usando CronJob en Kubernetes (https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/).

[1]celerybeat - multiple instances & monitoring

[2]https://github.com/celery/celery/issues/251

[3]https://github.com/celery/celery/issues/251#issuecomment-228214951