【问题标题】:Why do CELERY_ROUTES have both a "queue" and a "routing_key"?为什么 CELERY_ROUTES 既有“queue”又有“routing_key”?
【发布时间】:2018-08-19 15:16:01
【问题描述】:

我对 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 中,消息不知道队列。那不应该是默认路由键吗?

【问题讨论】:

    标签: python celery amqp


    【解决方案1】:

    确实在 Celery 上去 Queues 的时候会有点混乱,有一点你必须记住的是 queue 参数是指一个 Celery Kombu Queue Object 而不是直接指向一个 AMQP 队列,这个你可以理解通过阅读此extract from the docs。 当然,celery 创建同名队列和交换器的事实是队列参数使用混乱的根源。 您始终可以在文档中阅读此段:

    如果您有另一个队列但要在另一个交换器上添加,只需指定自定义交换器和交换器类型:

    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

    【讨论】:

    • 不确定:调用 Queue() 实例化...绑定而不是队列?
    • 在某种程度上你可以说kombu中的Queue对象对应于一个AMQP队列绑定到一个具有特定路由键的交换。
    【解决方案2】:

    在其中声明队列的目的是让 celery 创建这些队列并使用 RabbitMQ 设置配置。

    对于较低级别的AMQP客户端,需要先声明队列,再声明exchange,最后将exchange绑定到队列。稍后在发布消息时,您只需发布到交易所。

    似乎 celery 使用这种结构来自动完成。

    【讨论】:

      猜你喜欢
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 2011-06-06
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多