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

时间:2016-04-19 22:52:55

标签: django rabbitmq celery

我有一台机器运行同一个Django项目的两个副本,我们称之为 A B ,我想使用Celery来处理后台任务。

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

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

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

python3 -m celery worker -A project -l INFO -Q q2 --hostname=celery2@ubuntu

问题是,如何将所有任务从项目A 路由到队列A ,以及从项目B 到<的所有任务em>队列B ?是的,我已经看到你可以在task装饰器中添加一个参数来选择队列,但我正在寻找一个全局设置或类似的东西。

编辑1 :我尝试过使用CELERY_DEFAULT_QUEUE但它不起作用,设置会被忽略。我也试过创建一个愚蠢的路由器,如下所示:

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

CELERY_ROUTES = (MyRouter(), )

它有效(显然在每个项目中返回不同的队列),但我很困惑,为什么CELERY_DEFAULT_QUEUE设置被忽略了?

3 个答案:

答案 0 :(得分:1)

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

CELERY_DEFAULT_QUEUE = 'q2'
CELERY_DEFAULT_EXCHANGE = 'q2'
CELERY_DEFAULT_ROUTING_KEY = 'q2'

我有一些概念不清楚,但在跟随official RabbitMQ's tutorials后,他们变得更加清晰,我能够解决问题。

答案 1 :(得分:1)

您可以将任务路由定义为

CELERY_ROUTES = {
    'services.qosservice.*': {'queue': 'qos_celery'},
}

*是芹菜支持的通配符。

参考:http://docs.celeryproject.org/en/latest/userguide/routing.html#automatic-routing

答案 2 :(得分:0)

我认为你必须在settings.py

中定义路由
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'},

}

在我的例子中。任务set_qos_for_vm将路由到qos_celery队列,任务qos_recovery_compute队列将路由到qos_celery_1。

更多细节:http://docs.celeryproject.org/en/latest/userguide/routing.html#id2

希望对你有帮助