web-dev-qa-db-ja.com

CELERY_ROUTESに「queue」と「routing_key」の両方があるのはなぜですか?

AMQPについての私の理解は、メッセージには次のコンポーネントのみがあるということです。

  1. メッセージ本文
  2. ルーティングキー
  3. 交換

キューは交換に添付されます。メッセージはキューの知識を持つことができません。メッセージはエクスチェンジに投稿されるだけで、エクスチェンジタイプとルーティングキーに基づいて、メッセージは1つ以上のキューにルーティングされます。

Celeryでは、タスクをルーティングする方法としてCELERY_ROUTESを使用することをお勧めします。ドキュメントから、CELERY_ROUTESは...

ルーターのリスト、またはタスクをキューにルーティングするために使用される単一のルーター。 http://celery.readthedocs.org/en/latest/configuration.html#message-routing

そして、例が含まれています...

タスクをfeed_tasksキューにルーティングするには、CELERY_ROUTES設定にエントリを追加できます。

CELERY_ROUTES = {
    'feeds.tasks.import_feed': {
        'queue': 'feed_tasks',
        'routing_key': 'feed.import',
    },
}

しかし、ちょっと待ってください-AMQPによると、メッセージにはルーティングキーしか付属していません。 「キュー」はそこで何をしているのですか?

さらに、デフォルトのキューというこの概念があります。 CELERY_ROUTESでキャッチされないタスクを呼び出すと、CELERY_DEFAULT_QUEUEにフォールバックします。しかし、繰り返しになりますが、AMQPでは、メッセージはキューについて知りません。代わりに、それがデフォルトのルーティングキーではないのですか?

35
Adam Easterling

Celeryでは、キューに移動するときに少し混乱がありますが、キューパラメーターがCelery Kombu Queueオブジェクトを参照しており、AMQPキューを直接参照していないことを覚えておく必要があります。これを読んでこれを理解できます。 ドキュメントから抽出 。もちろん、セロリがキューを作成して同じ名前で交換するという事実は、キューパラメータの使用の混乱の原因です。常にドキュメントでは、この段落を読むことができます:

別のキューがあり、追加したい別のエクスチェンジがある場合は、カスタムエクスチェンジとエクスチェンジタイプを指定するだけです。

CELERY_QUEUES = (
    Queue('feed_tasks',    routing_key='feed.#'),
    Queue('regular_tasks', routing_key='task.#'),
    Queue('image_tasks',   exchange=Exchange('mediatasks', type='direct'),
                       routing_key='image.compress'),
)

したがって、このようにして、同じ交換で2つの異なるキューをバインドできます。交換とキーのみを使用してタスクをルーティングした後、Routersクラスを使用できます

class MyRouter(object):

    def route_for_task(self, task, args=None, kwargs=None):
        if task == 'myapp.tasks.compress_video':
            return {'exchange': 'video',
                    'exchange_type': 'topic',
                    'routing_key': 'video.compress'}
        return None

詳細はこちら http://celery.readthedocs.org/en/latest/userguide/routing.html#routers

16
Mauro Rocco

そこでキューを宣言するポイントは、セロリがそれらのキューを作成し、RabbitMQで構成をセットアップすることです。

下位レベルのAMQPクライアントの場合、最初にキューを宣言し、次に交換を宣言してから、最後に交換をキューにバインドする必要があります。後でメッセージを投稿するときは、取引所に投稿するだけです。

セロリはこの構造を使用して自動的に行うようです。

1
olekeh