Celery: Múltiples enlaces a la misma cola: solo se crea el último enlace en RabbitMQ

Creado en 31 oct. 2016  ·  3Comentarios  ·  Fuente: celery/celery

Lista de Verificación

  • [X] He incluido el resultado de celery -A proj report en la edición.
    (si no puede hacer esto, al menos especifique el Apio
    versión afectada).
  • [x] He verificado que el problema existe en la sucursal master de Apio.
software -> celery:3.1.0 (Cipater) kombu:3.0.37 py:2.7.10
            billiard:3.3.0.23 py-amqp:1.4.9
platform -> system:Darwin arch:64bit imp:CPython
loader   -> celery.loaders.default.Loader
settings -> transport:amqp results:redis://localhost:6379/0

CELERY_QUEUES:
    (<unbound Queue Test_Queue -> <unbound Exchange test_exchange(topic)> -> myapp.tasks.some_tasks.#>,
 <unbound Queue Test_Queue -> <unbound Exchange test_exchange(topic)> -> myapp.tasks.more_tasks.#>)
RABBITMQ_MANAGEMENT_URL: 'localhost:15672'
CELERY_IMPORTS:
    ('myapp.tasks.some_tasks', 'myapp.tasks.more_tasks')
CELERY_ROUTES:
    (<myapp.routers.DefaultRouter object at 0x1077952d0>,)
BROKER_URL: 'amqp://guest:********<strong i="13">@localhost</strong>:5672//'
CELERY_RESULT_BACKEND: 'redis://localhost:6379/0'

pasos para reproducir

  1. Cree 2 enlaces en un intercambio de temas con diferentes claves de enrutamiento, pero apúntelos a la misma cola en CELERY_QUEUES.
CELERY_QUEUES = (
    Queue("Test_Queue", default_exchange, routing_key="myapp.tasks.some_tasks.#"),
    Queue("Test_Queue", default_exchange, routing_key="myapp.tasks.more_tasks.#"),
)
  1. Crea una instancia de un trabajador de apio
  2. Navegue a la consola de administración de RabbitMQ http: // localhost : 15672 /
  3. Haga clic en la pestaña Colas, luego en la cola que creó en su configuración
  4. Ver que solo existe 1 enlace
    screen shot 2016-10-31 at 5 52 03 pm

Comportamiento esperado

  1. Debería haber un segundo enlace con la clave de enrutamiento myapp.tasks.some_tasks.#
  2. Esto se puede replicar en la consola de celery amqp:
celery amqp
queue.bind Test_Queue test_exchange Key1
queue.bind Test_Queue test_exchange Key2

Comportamiento real

  1. Solo se crea el último enlace de un nombre de cola determinado en rabbitmq

Comentario más útil

CELERY_QUEUES es un mapeo de queue_name a queue, por lo que ya que está definiendo dos colas
con el mismo nombre, solo se utilizará uno de ellos.

Para definir una cola con múltiples enlaces en Kombu, debe usar:

from kombu import Exchange, Queue, binding
default_exchange = Exchange('default', type='direct')

CELERY_QUEUES = (
    Queue('Test_Queue', [
         binding(default_exchange, routing_key='myapp.tasks.some_tasks.#'),
         binding(default_exchange, routing_key='myapp.tasks.more_tasks.#'),
    ]),
)

Todos 3 comentarios

CELERY_QUEUES es un mapeo de queue_name a queue, por lo que ya que está definiendo dos colas
con el mismo nombre, solo se utilizará uno de ellos.

Para definir una cola con múltiples enlaces en Kombu, debe usar:

from kombu import Exchange, Queue, binding
default_exchange = Exchange('default', type='direct')

CELERY_QUEUES = (
    Queue('Test_Queue', [
         binding(default_exchange, routing_key='myapp.tasks.some_tasks.#'),
         binding(default_exchange, routing_key='myapp.tasks.more_tasks.#'),
    ]),
)

¡Excelente! Acabo de probarlo y se han creado instancias de ambos enlaces. ¿Vale la pena agregar esto a los documentos de enrutamiento? Puedo crear una solicitud de extracción en algún momento de esta noche o mañana

¡Seguro! Sería una gran idea tenerlo en los documentos :)

¿Fue útil esta página
0 / 5 - 0 calificaciones