芹菜,将Django项目中的所有任务路由到特定队列

芹菜,将Django项目中的所有任务路由到特定队列,django,rabbitmq,celery,Django,Rabbitmq,Celery,我有一台机器,它运行同一个Django项目的两个副本,我们称它们为a和B,我想用芹菜来处理后台任务 我设置了主管来启动两个工作人员,每个项目一个,但鉴于两个项目中的任务名称相同,有时任务由错误的工作人员运行 我的下一步是使用-Q queueName参数为每个工作者使用不同的队列。使用rabbitmqctl list\u队列我可以看到两个队列都已创建。我用来发给工人的命令是 python3 -m celery worker -A project -l INFO -Q q1 --hostname=c

我有一台机器,它运行同一个Django项目的两个副本,我们称它们为a和B,我想用芹菜来处理后台任务

我设置了主管来启动两个工作人员,每个项目一个,但鉴于两个项目中的任务名称相同,有时任务由错误的工作人员运行

我的下一步是使用
-Q queueName
参数为每个工作者使用不同的队列。使用
rabbitmqctl list\u队列
我可以看到两个队列都已创建。我用来发给工人的命令是

python3 -m celery worker -A project -l INFO -Q q1 --hostname=celery1@ubuntu

问题是,如何将所有任务从项目A路由到队列A,如何将所有任务从项目B路由到队列B?是的,我看到您可以向
任务
装饰器添加一个参数来选择队列,但我正在寻找全局设置或类似的设置

编辑1:我尝试使用
芹菜\u默认\u队列
,但不起作用,设置被忽略。我还尝试创建一个哑路由器,如下所示:

class MyRouter(object):
    def route_for_task(self, task, args=None, kwargs=None):
        return 'q1'

CELERY_ROUTES = (MyRouter(), )

它是有效的(显然每个项目返回不同的队列),但我很困惑,为什么忽略了
芹菜\u默认\u队列
设置?

我认为您必须在settings.py中定义rouing

CELERY_ROUTES = {

    'services.qosservice.set_qos_for_vm': {'queue': 'qos_celery'},

    'services.qosservice.qos_recovery': {'queue': 'qos_celery'},

    'services.qosservice.qos_recovery_compute': {'queue': 'qos_celery_1'},

}
在我的前枫树。_vm的任务集_qos_将路由到qos_芹菜队列,任务qos_恢复_计算队列将路由到qos_芹菜1

更多详情:


希望它能帮助你

最后,它比我想象的要容易。我只需要设置默认队列和默认路由键(以及可选的默认交换,只要它是
direct
exchange)


我有一些不清楚的概念,但在遵循这些概念之后,它们变得更加清晰,我能够解决问题。

您可以将任务路由定义为

CELERY_ROUTES = {
    'services.qosservice.*': {'queue': 'qos_celery'},
}
*
是芹菜支持的通配符


参考资料:

我必须列出所有任务吗?难道没有什么东西像通配符吗?天哪,你无法想象在同一个问题上苦苦挣扎后,我差点砸到自己的头。现在更让人困惑的是,芹菜4.4有一组不同的变量(芹菜任务默认队列、芹菜任务默认交换、芹菜任务默认路由密钥),还有一些过时的文档,这让人很难理解芹菜版本应该做些什么。不管怎样,你的解决方案成功了,谢谢!非常感谢。同一问题持续数小时,日志中出现错误的“已接收未注册的任务类型…”。在时间轴上,最终构建了一个单独的vm,因为两个django应用程序的ID指向不同的OBJ,导致了各种各样的悲伤,但只是有时候。在这里着陆后不久。
CELERY_DEFAULT_QUEUE = 'q2'
CELERY_DEFAULT_EXCHANGE = 'q2'
CELERY_DEFAULT_ROUTING_KEY = 'q2'
CELERY_ROUTES = {
    'services.qosservice.*': {'queue': 'qos_celery'},
}