Celery: Beberapa binding ke antrian yang sama: Hanya binding terakhir yang dibuat di RabbitMQ

Dibuat pada 31 Okt 2016  ·  3Komentar  ·  Sumber: celery/celery

Daftar periksa

  • [X] Saya telah menyertakan output celery -A proj report dalam masalah ini.
    (jika Anda tidak dapat melakukan ini, maka setidaknya tentukan Seledri
    versi terpengaruh).
  • [x] Saya telah memverifikasi bahwa ada masalah pada master cabang Seledri.
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'

Langkah-langkah untuk mereproduksi

  1. Buat 2 binding pada pertukaran topik dengan kunci perutean yang berbeda tetapi arahkan ke antrean yang sama di 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. Buat contoh pekerja seledri
  2. Arahkan ke konsol admin RabbitMQ http://localhost :15672/
  3. Klik ke tab Antrian, lalu antrian yang Anda buat di pengaturan Anda
  4. Lihat bahwa hanya ada 1 pengikatan
    screen shot 2016-10-31 at 5 52 03 pm

Perilaku yang diharapkan

  1. Harus ada pengikatan kedua dengan kunci perutean myapp.tasks.some_tasks.#
  2. Ini dapat direplikasi di konsol amqp seledri:
celery amqp
queue.bind Test_Queue test_exchange Key1
queue.bind Test_Queue test_exchange Key2

Perilaku sebenarnya

  1. Hanya pengikatan terakhir dari nama antrian yang diberikan yang dibuat di rabbitmq

Komentar yang paling membantu

CELERY_QUEUES adalah pemetaan dari queue_name ke antrian, jadi karena Anda mendefinisikan dua antrian
dengan nama yang sama, hanya satu yang akan digunakan.

Untuk menentukan antrian dengan banyak binding di Kombu, Anda harus menggunakan:

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

Semua 3 komentar

CELERY_QUEUES adalah pemetaan dari queue_name ke antrian, jadi karena Anda mendefinisikan dua antrian
dengan nama yang sama, hanya satu yang akan digunakan.

Untuk menentukan antrian dengan banyak binding di Kombu, Anda harus menggunakan:

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

Besar! Baru saja mengujinya dan kedua binding telah dipakai. Apakah ini layak ditambahkan ke dokumen perutean? Saya dapat membuat permintaan tarik kapan saja malam ini atau besok

Tentu! Itu akan menjadi ide bagus untuk memilikinya di dokumen :)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat