我有一台机器,它运行同一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发送到?是的,我看到您可以向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
设置被忽略了?
最后,它比我预期的要容易。我只需要设置默认队列和默认路由密钥(以及可选的默认交换机,只要它是direct
交换机)。
CELERY_DEFAULT_QUEUE = 'q2'
CELERY_DEFAULT_EXCHANGE = 'q2'
CELERY_DEFAULT_ROUTING_KEY = 'q2'
我有一些概念不清楚,但在遵循RabbitMQ的官方教程后,它们变得更加清晰,我能够解决这个问题。
您可以将任务路由定义为
CELERY_ROUTES = {
'services.qosservice.*': {'queue': 'qos_celery'},
}
*
是芹菜支持的通配符。
参考:http://docs.celeryproject.org/en/latest/userguide/routing.html#automatic-路由
我认为您必须在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_celecer队列,任务qos_recovery_compute队列将路由到qos_celery_1。
更多详细信息:http://docs.celeryproject.org/en/latest/userguide/routing.html#id2
希望它能帮助你