gpt4 book ai didi

python - 为什么 CELERY_ROUTES 既有 "queue"又有 "routing_key"?

转载 作者:IT老高 更新时间:2023-10-28 21:58:42 32 4
gpt4 key购买 nike

我对 AMQP 的理解是,消息只有以下几个组成部分:

  1. 邮件正文
  2. 路由键
  3. 交流

队列附加到交换。消息不能对队列有任何了解。他们只是发布到一个交换器,然后根据交换器类型和路由键,将消息路由到一个或多个队列。

在 Celery 中,推荐的任务路由方式是通过 CELERY_ROUTES 设置。从文档中,CELERY_ROUTES 是...

A list of routers, or a single router used to route tasks to queues. http://celery.readthedocs.org/en/latest/configuration.html#message-routing

它包括一个例子......

To route a task to the feed_tasks queue, you can add an entry in the CELERY_ROUTES setting:

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

但是等一下——根据 AMQP,消息只带有一个路由键! “队列”到底在做什么?

此外,还有默认队列的概念。如果您调用的任务未被 CELERY_ROUTES 捕获,它会退回到 CELERY_DEFAULT_QUEUE。但同样——在 AMQP 中,消息不知道队列。那不应该是默认路由键吗?

最佳答案

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

If you have another queue but on another exchange you want to add, just specify a custom exchange and exchange type:

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'),
)

因此,通过这种方式,您可以在同一个交换机上绑定(bind) 2 个不同的队列。在仅使用交换和 key 路由任务之后,您可以使用 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

关于python - 为什么 CELERY_ROUTES 既有 "queue"又有 "routing_key"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29786019/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com