2011-08-22 30 views
20

Estoy usando apio con RabbitMQ. Últimamente, he notado que se están haciendo muchas colas temporales.Cola temporal hecha en apio

Experimenté y descubrí que cuando una tarea falla (es decir, una tarea genera una excepción), se forma una cola temporal con un nombre aleatorio (como c76861943b0a4f3aaa6a99a6db06952c) y la cola permanece.

Algunas propiedades de la cola temporal como se encuentra en rabbitmqadmin son los siguientes -

auto_delete: True consumidores: 0 duradera: Falso mensajes: 1 messages_ready: 1

Y uno de esos cola temporal se realiza cada vez que falla una tarea (es decir, genera una excepción). ¿Cómo evitar esta situación? Porque en mi entorno de producción se forma una gran cantidad de tales colas.

+0

¡Es una observación interesante! A mí también me gustaría saber. –

+1

Hola Elver. Pude resolver el problema. Por favor, eche un vistazo a la respuesta (una por mí también). Espero eso ayude. – Siddharth

Respuesta

11

Bueno, Philip está ahí. La siguiente es una descripción de cómo lo resolví. Es una configuración en apleryconfig.py.

Sigo usando CELERY_BACKEND = "amqp" como dijo Philip. Pero además de eso, ahora estoy usando CELERY_IGNORE_RESULT = True. Esta configuración asegurará que las colas adicionales no se formen para cada tarea.

Ya estaba usando esta configuración, pero aún cuando una tarea falla, se forma la cola adicional. Luego me di cuenta de que estaba usando otra configuración que debía eliminarse, que era CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True. Lo que hizo esto fue que no almacenó los resultados para todas las tareas, sino que solo lo hizo para los errores (tareas que fallaron) y, por lo tanto, una cola adicional para una tarea que falló.

+0

¡Guau! Esto lo resolvió para mí. Ni siquiera me di cuenta de que esto era un problema ya que estaba configurando ignore_result = True en cada descriptor de la tarea. Pero agregué CELERY_IGNORE_RESULT = True y CELERY_STORE_ERRORS_EVEN_IF_IGNORED = False y viola - ¡no más colas adicionales esperando después del procesamiento! Todavía podría considerar el redis como un back-end alternativo, pero es realmente agradable haber encontrado esta solución. ¡Gracias! – chaimp

+0

@jeffp - Me alegra oír eso. También he usado Redis últimamente con Apio, no creo que sea un problema con eso. El apio en sí mismo forma y mantiene la cola. Entonces esta configuración es importante. – Siddharth

+1

De hecho, descubrí otra cosa el día anterior que creo que será muy útil para cualquiera que lea esto: es necesario tener más de un trabajador y enrutar diferentes tareas a cada trabajador. Es aconsejable aprender sobre apical-multi y usarlo. La documentación no lo hace obvio, pero es la clave para usar efectivamente los recursos del sistema disponibles y no dejar que la cola se respalde. – chaimp

16

Parece que está usando el amqp como resultados de back-end. Desde el docs aquí están las trampas de usar esa configuración particular:

  • Cada nueva tarea crea una nueva cola en el servidor, con miles de tareas que el agente puede estar sobrecargado con colas y esto afectará
    el rendimiento de manera negativa. Si está utilizando RabbitMQ entonces cada
    cola será un proceso de Erlang por separado, por lo que si usted está planeando
    mantener muchos resultados al mismo tiempo puede que tenga que aumentar el límite de Erlang
    proceso, y el número máximo de descriptores de archivos su sistema operativo
    permite
  • resultados antiguas no se limpian automáticamente, por lo que debe asegurarse de consumir los resultados o de lo contrario el número de colas se finalmente salirse de control. Si está ejecutando RabbitMQ 2.1.1 o más alto, puede aprovechar el argumento x-expires en las colas, , que caducará las colas después de un cierto límite de tiempo después de que hayan sido sin usar. La caducidad de la cola se puede establecer (en segundos) mediante la configuración CELERY_AMQP_TASK_RESULT_EXPIRES (no habilitada de manera predeterminada).

Por lo que he leído en el changelog, esto ya no es el backend por defecto en las versiones> = 2.3.0 porque los usuarios estaban recibiendo poco en la parte trasera por este comportamiento. Sugeriría cambiar los resultados back-end si esta no es la funcionalidad que necesita.

+0

CELERY_AMQP_TASK_RESULT_EXPIRES ha quedado obsoleto, CELERY_TASK_RESULT_EXPIRES es el nuevo nombre de configuración. El valor predeterminado ahora es guardarlo por 1 día, configurarlo en 0 significa guardar para siempre. – cbron

3

El CELERY_TASK_RESULT_EXPIRES dicta el tiempo de vida de las colas temporales. El valor predeterminado es 1 día. Usted puede modificar este valor.

0

La razón por la que esto sucede es porque celery workers remote control está habilitado (está habilitado por defecto).

Se puede desactivar mediante el establecimiento de la configuración CELERY_ENABLE_REMOTE_CONTROL en False Sin embargo, tenga en cuenta que va a perder la capacidad de hacer cosas como add_consumer, cancel_consumer etc usando el backend celery command

0

amqp crea una nueva cola para cada tarea. Si desea evitarlo, puede usar el backend rpc que mantiene los resultados en una sola cola.

En su configuración, ajuste

CELERY_RESULT_BACKEND = 'rpc' 
CELERY_RESULT_PERSISTENT = True 

Puede leer más sobre this on celery docs.