Celery: 同じキューへの複数のバインディング:最後のバインディングのみがRabbitMQで作成されています

作成日 2016年10月31日  ·  3コメント  ·  ソース: celery/celery

チェックリスト

  • [X] celery -A proj reportの出力を問題に含めました。
    (これができない場合は、少なくともセロリを指定してください
    影響を受けるバージョン)。
  • [x]この問題がCeleryのmasterブランチに対して存在することを確認しました。
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'

再現する手順

  1. 異なるルーティングキーを使用してトピック交換で2つのバインディングを作成しますが、それらを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. セロリ労働者をインスタンス化する
  2. RabbitMQ管理コンソールに移動しますhttp:// localhost :15672 /
  3. [キュー]タブをクリックしてから、設定で作成したキューをクリックします
  4. バインディングが1つだけ存在することを確認してください
    screen shot 2016-10-31 at 5 52 03 pm

予想される行動

  1. ルーティングキーmyapp.tasks.some_tasks.# 2番目のバインディングが必要です
  2. これは、セロリのamqpコンソールで複製できます。
celery amqp
queue.bind Test_Queue test_exchange Key1
queue.bind Test_Queue test_exchange Key2

実際の動作

  1. 指定されたキュー名の最後のバインディングのみがrabbitmqで作成されます

最も参考になるコメント

CELERY_QUEUESはqueue_nameからqueueへのマッピングであるため、2つのキューを定義しているため
同じ名前の場合、そのうちの1つだけが使用されます。

昆布で複数のバインディングを持つキューを定義するには、以下を使用する必要があります。

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

全てのコメント3件

CELERY_QUEUESはqueue_nameからqueueへのマッピングであるため、2つのキューを定義しているため
同じ名前の場合、そのうちの1つだけが使用されます。

昆布で複数のバインディングを持つキューを定義するには、以下を使用する必要があります。

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

素晴らしい! テストしたところ、両方のバインディングがインスタンス化されました。 これはルーティングドキュメントに追加する価値がありますか? 今夜または明日いつかプルリクエストを作成できます

もちろん! それはドキュメントにそれを持っていることは素晴らしい考えでしょう:)

このページは役に立ちましたか?
0 / 5 - 0 評価