繁体   English   中英

Celery v4没有按预期路由任务

[英]Celery v4 not routing tasks as expected

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

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

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

    def run(**params):
        whatever ...

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

# 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

这是我的队列定义:

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

意外行为是我在使用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!

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

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

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

谢谢!

在v4中不推荐使用routing_key作为类属性。

您可以将调用任务作为kwarg提供给apply_async ,也可以手动将路由任务类型配置为celery config中的队列。 查看文档


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

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

翻翻你可以看到源routing_key的任务时,使用结合设置_get_exec_options 这里的选项是使用实例( self )而不是类设置的。

我通过查看芹菜源代码收集了这个,但如果在文档中没有提及弃用,我猜他们已经过时了。

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


还有文档中的任务routing_key将从任务元数据中读取,因此基于类的任务不再具有此元数据?

更正,元数据不再在类对象上。 它在调用时通过配置或懒惰通过任务实例设置。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM