AMQPについての私の理解は、メッセージには次のコンポーネントのみがあるということです。
キューは交換に添付されます。メッセージはキューの知識を持つことができません。メッセージはエクスチェンジに投稿されるだけで、エクスチェンジタイプとルーティングキーに基づいて、メッセージは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では、メッセージはキューについて知りません。代わりに、それがデフォルトのルーティングキーではないのですか?
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
そこでキューを宣言するポイントは、セロリがそれらのキューを作成し、RabbitMQで構成をセットアップすることです。
下位レベルのAMQPクライアントの場合、最初にキューを宣言し、次に交換を宣言してから、最後に交換をキューにバインドする必要があります。後でメッセージを投稿するときは、取引所に投稿するだけです。
セロリはこの構造を使用して自動的に行うようです。