我有一台机器运行同一个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
设置被忽略了?
答案 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
希望对你有帮助