Celery v4没有按预期路由任务

Spi*_*Xel 10 python django celery

我正在将我的芹菜工人从芹菜v3更新到celery v4,我的所有任务都是基于类的任务.我已手动注册任务,因为它是升级文档中指示的内容.

问题是在任务路由中,我有以下任务:

class RegisterTask(Task):
    routing_key = 'app_server.register'

    def run(**params):
        whatever ...
Run Code Online (Sandbox Code Playgroud)

我正在运行两个芹菜工作者,一个在默认队列中,另一个在寄存器队列中,如下所示:

# Default Worker
celery -A app_server worker --loglevel=info --concurrency=1

# Register Worker
celery -A app_server worker -Q app_server_register --loglevel=info --concurrency=1
Run Code Online (Sandbox Code Playgroud)

这是我的队列定义:

CELERY_TASK_DEFAULT_QUEUE = 'app_server_default'
CELERY_TASK_DEFAULT_ROUTING_KEY = 'app_server.default'

CELERY_TASK_QUEUES = (
    Queue('app_server_default', routing_key='app_server.default'),
    Queue('app_server_register', routing_key='app_server.register')
)
Run Code Online (Sandbox Code Playgroud)

意外行为是我在使用Celery V3和Celery V4调用任务时看到的差异.

# Celery V3
RegisterTask().delay(**params)
# task is consumed by the register worker!

# Celery V4
RegisterTask().delay(**params)
# task is consumed by the default worker!
Run Code Online (Sandbox Code Playgroud)

我希望任务由注册工作者使用(celery v3行为),因此我为什么在基于类的任务中硬编码routing_key属性.但Celery V4似乎忽略了基于类的任务中的routing_key属性.

[我也使用redis作为经纪人,如果有任何重要的话]

关于这个问题的任何想法?

谢谢!

sta*_*cks 3

routing_key因为类属性在 v4 中已被弃用。

您可以将其作为 kwarg 提供给调用时的任务 apply_async,也可以在 celery 配置中手动将路由任务类型配置到队列。请参阅文档


celery.task.base.Task不推荐使用 的Task 类celery.app.task.Task

这是一个设计更改,其中新的任务类更喜欢在使用任务时而不是在实例化时绑定配置。看到这个评论

查看源代码,您可以看到routing_key是在使用 绑定任务时设置的_get_exec_options这里的选项是使用实例 ( self) 而不是类来设置的。

我通过查看 celery 源代码收集了这一点,但如果文档中没有提及弃用,我猜它们已经过时了。

也许在他们的 github 上填写一个问题并使用新范例中提供的选项之一是未来的最佳选择。


另外,在文档中,任务routing_key将从任务元数据中读取,因此基于类的任务不能再拥有此元数据了?

正确,元数据不再位于类对象上。它是通过配置或在调用时通过任务实例延迟设置的。

配置文件应该是静态路由的转到,而任务调用上的设置应该用于覆盖配置的默认值。