tutorial python celery amqp

python - tutorial - ¿Por qué CELERY_ROUTES tiene tanto una "cola" como una "routing_key"?



celery worker (2)

El punto de tener la cola declarada allí, es que apio cree esas colas y configure la configuración con RabbitMQ.

Para un cliente AMQP de nivel inferior, primero debe declarar la cola, luego el intercambio y, finalmente, vincular el intercambio a la cola. Más tarde, cuando publiques mensajes, solo publicarás en el intercambio.

Parece que el apio usa esta estructura para hacerlo automáticamente.

Mi comprensión de AMQP es que los mensajes solo tienen los siguientes componentes:

  1. El cuerpo del mensaje
  2. La clave de enrutamiento
  3. El intercambio

Las colas están unidas a los intercambios. Los mensajes no pueden tener ningún conocimiento de colas. Simplemente publican en un intercambio y, luego, según el tipo de intercambio y la clave de enrutamiento, los mensajes se enrutan a una o más colas.

En Celery, la forma recomendada de enrutar tareas es a través de la configuración CELERY_ROUTES . De los documentos, CELERY_ROUTES es ...

Una lista de enrutadores, o un solo enrutador utilizado para enrutar tareas a colas. http://celery.readthedocs.org/en/latest/configuration.html#message-routing

Y incluye un ejemplo ...

Para encaminar una tarea a la cola feed_tasks, puede agregar una entrada en la configuración CELERY_ROUTES :

CELERY_ROUTES = { ''feeds.tasks.import_feed'': { ''queue'': ''feed_tasks'', ''routing_key'': ''feed.import'', }, }

Pero espere un minuto: según AMQP, los mensajes solo vienen con una clave de enrutamiento. ¿Qué diablos está haciendo allí la "cola"?

Además, existe esta noción de una cola predeterminada. Si invoca una tarea que no es capturada por CELERY_ROUTES , se vuelve a CELERY_DEFAULT_QUEUE . Pero nuevamente: en AMQP, los mensajes no se conocen acerca de las colas. ¿No debería ser esa la clave de enrutamiento predeterminada?


Es cierto que en Celery hay un poco de confusión cuando vas a las colas, una cosa que debes tener en cuenta es que el parámetro de la cola se refiere a un objeto de cola Celery Kombu y no directamente a una cola de AMQP, puedes entender esto leyendo esto Extracto de los documentos . Por supuesto, el hecho de que el apio crea la cola y el intercambio con el mismo nombre es el origen de la confusión del uso del parámetro de cola. Siempre en los documentos puedes leer este párrafo:

Si tiene otra cola pero en otro intercambio que desea agregar, simplemente especifique un intercambio personalizado y un tipo de intercambio:

CELERY_QUEUES = ( Queue(''feed_tasks'', routing_key=''feed.#''), Queue(''regular_tasks'', routing_key=''task.#''), Queue(''image_tasks'', exchange=Exchange(''mediatasks'', type=''direct''), routing_key=''image.compress''), )

Así, de esta manera, podrías unir 2 colas diferentes en el mismo intercambio. Luego de enrutar la tarea usando solo el intercambio y la clave, se podría usar la clase Routers

class MyRouter(object): def route_for_task(self, task, args=None, kwargs=None): if task == ''myapp.tasks.compress_video'': return {''exchange'': ''video'', ''exchange_type'': ''topic'', ''routing_key'': ''video.compress''} return None

Más aquí http://celery.readthedocs.org/en/latest/userguide/routing.html#routers