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



我有一台机器,它运行同一Django项目的两个副本,我们称它们为aB,我想使用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

希望它能帮助你

相关内容

  • 没有找到相关文章

最新更新