芹菜V4未按预期进行路由任务



我正在将芹菜工人从芹菜V3更新为芹菜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')
)

意外行为是我使用芹菜V3和芹菜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!

我希望任务被注册工作者(芹菜V3行为)消费,因此为什么我将基于类的任务中的 Routing_key_key 性进行了硬编码。但是芹菜V4似乎忽略了基于类的任务中的 Routing_key 属性。

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

对此问题有任何想法吗?

谢谢!

routing_key作为类属性在v4中弃用。

您可以将其提供给调用任务到apply_async的Kwarg,也可以手动将路由任务类型配置为芹菜配置中的排队。请参阅文档


celery.task.base.Task的任务类已针对celery.app.task.Task弃用。

这是一种设计更改,新任务类别在使用任务时而不是在实例化时间时绑定配置。查看此评论

通过_get_exec_options绑定任务时,可以通过源查看routing_key。这里使用实例(self)而不是类设置选项。

我已经通过查看芹菜源代码来收集了这一点,但是如果文档中没有提及贬值,我想它们已经过时了。

也许在他们的github上填补问题,并使用新范式中提供的一种选项是未来的最佳选择。


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

正确,元数据不再在类对象上。它是通过config或懒惰的任务实例设置的。

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

相关内容

  • 没有找到相关文章

最新更新