Celery: Várias ligações para a mesma fila: apenas a última ligação está sendo criada no RabbitMQ

Criado em 31 out. 2016  ·  3Comentários  ·  Fonte: celery/celery

Lista de controle

  • [X] Incluí a saída de celery -A proj report na edição.
    (se você não for capaz de fazer isso, pelo menos especifique o aipo
    versão afetada).
  • [x] Eu verifiquei que o problema existe no ramo master do aipo.
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'

Passos para reproduzir

  1. Crie 2 ligações em uma troca de tópico com chaves de roteamento diferentes, mas aponte-as para a mesma fila em 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. Instancie um trabalhador de aipo
  2. Navegue até o console de administração RabbitMQ http: // localhost : 15672 /
  3. Clique na guia Filas e, em seguida, na fila que você criou em suas configurações
  4. Veja que existe apenas 1 ligação
    screen shot 2016-10-31 at 5 52 03 pm

Comportamento esperado

  1. Deve haver uma segunda ligação com a chave de roteamento myapp.tasks.some_tasks.#
  2. Isso pode ser replicado no console amqp do aipo:
celery amqp
queue.bind Test_Queue test_exchange Key1
queue.bind Test_Queue test_exchange Key2

Comportamento real

  1. Apenas a última ligação de um determinado nome de fila é criada no rabbitmq

Comentários muito úteis

CELERY_QUEUES é um mapeamento de queue_name para queue, então, uma vez que você está definindo duas filas
com o mesmo nome, apenas um deles será usado.

Para definir uma fila com várias ligações em Kombu, você deve 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 comentários

CELERY_QUEUES é um mapeamento de queue_name para queue, então, uma vez que você está definindo duas filas
com o mesmo nome, apenas um deles será usado.

Para definir uma fila com várias ligações em Kombu, você deve 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! Apenas testei e ambas as ligações foram instanciadas. Vale a pena adicionar isso aos documentos de roteamento? Posso criar uma solicitação de pull hoje à noite ou amanhã

Certo! Seria uma ótima ideia tê-lo na documentação :)

Esta página foi útil?
0 / 5 - 0 avaliações