簡體   English   中英

為什么CELERY_ROUTES同時具有“隊列”和“routing_key”?

[英]Why do CELERY_ROUTES have both a “queue” and a “routing_key”?

我對AMQP的理解是消息只有以下組件:

  1. 消息體
  2. 路由密鑰
  3. 找的零錢

隊列附加到交易所。 消息不能具有任何隊列知識。 它們只是發布到交換機,然后根據交換類型和路由密鑰,消息被路由到一個或多個隊列。

在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上,當你去Queues時會有一些混亂,你必須記住的一件事是隊列參數是指Celery Kombu隊列對象而不是直接到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客戶端,您需要首先聲明隊列,然后是交換,然后最終將交換綁定到隊列。 稍后發布消息時,您只需發布到交易所。

似乎芹菜使用這種結構自動完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM