Celery: Mehrere Bindungen an dieselbe Warteschlange: Nur die letzte Bindung wird in RabbitMQ erstellt

Erstellt am 31. Okt. 2016  ·  3Kommentare  ·  Quelle: celery/celery

Checkliste

  • [X] Ich habe die Ausgabe von celery -A proj report in die Ausgabe aufgenommen.
    (wenn Sie dies nicht können, dann geben Sie zumindest den Sellerie an
    betroffene Version).
  • [x] Ich habe überprüft, dass das Problem für den master Zweig von Celery besteht.
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'

Schritte zum Reproduzieren

  1. Erstellen Sie 2 Bindungen für einen Themenaustausch mit unterschiedlichen Routing-Schlüsseln, verweisen Sie sie jedoch auf dieselbe Warteschlange in 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. Instanziieren Sie einen Selleriearbeiter
  2. Navigieren Sie zur RabbitMQ-Verwaltungskonsole http://localhost :15672/
  3. Klicken Sie auf die Registerkarte Warteschlangen und dann auf die Warteschlange, die Sie in Ihren Einstellungen erstellt haben
  4. Sehen Sie, dass nur 1 Bindung existiert
    screen shot 2016-10-31 at 5 52 03 pm

Erwartetes Verhalten

  1. Es sollte eine zweite Bindung mit dem Routing-Schlüssel myapp.tasks.some_tasks.#
  2. Dies kann in der Sellerie-Amqp-Konsole repliziert werden:
celery amqp
queue.bind Test_Queue test_exchange Key1
queue.bind Test_Queue test_exchange Key2

Tatsächliches Verhalten

  1. Nur die letzte Bindung eines bestimmten Warteschlangennamens wird in Rabbitmq erstellt

Hilfreichster Kommentar

CELERY_QUEUES ist eine Zuordnung von Warteschlangenname zu Warteschlange, da Sie also zwei Warteschlangen definieren
mit demselben Namen wird nur einer von ihnen verwendet.

Um eine Warteschlange mit mehreren Bindungen in Kombu zu definieren, sollten Sie Folgendes verwenden:

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.#'),
    ]),
)

Alle 3 Kommentare

CELERY_QUEUES ist eine Zuordnung von Warteschlangenname zu Warteschlange, da Sie also zwei Warteschlangen definieren
mit demselben Namen wird nur einer von ihnen verwendet.

Um eine Warteschlange mit mehreren Bindungen in Kombu zu definieren, sollten Sie Folgendes verwenden:

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.#'),
    ]),
)

Groß! Habe es gerade getestet und beide Bindungen wurden instanziiert. Lohnt es sich, die Routing-Dokumente hinzuzufügen? Ich kann heute Abend oder morgen eine Pull-Anfrage erstellen

Sicher! Das wäre eine gute Idee, es in den Dokumenten zu haben :)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen