Celery将任务路由到错误的工作服务器

时间:2013-12-16 22:26:00

标签: python rabbitmq celery

所以我有两个工作服务器(celeryd)在同一个rabbitmq服务器中使用两个虚拟主机。我将一个变量传递给我的messagecenter.py文件,以指定它应该用于发布任务的代理URL。经过一段时间的调试后,我发现一旦celery建立了与代理url的连接 - 它不会与之前的vhost断开连接并连接到新的vhost。我不确定芹菜中的交换和绑定是如何起作用的。所以任何帮助都非常感谢。

messagecenter.py /

from celery import Celery

MESSAGE_SETTINGS = {
    "WORKER1": "amqp://user1:pass1@server-name:5672/vhost1",
    "WORKER2": "amqp://user2:pass2@server-name:5672/vhost2"
}

class MessageCenter(object):
    def __init__(self, config):
        self._config = config
        self._celery = Celery()

    def produce_task(self, name, uuid, params):
        self._celery.conf.update(
            BROKER_URL = self._config[name])
        self._celery.send_task(uuid, params) 

我传入'WORKER1'或'WORKER2'以及必要的参数来发布任务,即send_task。我希望有一种方法可以将我的任务正确地路由到不同的服务器。任何帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

找到解决方案here

所以我在工作服务器上更改了我的celeryconfig以包含两个交换(每个交换都有自己的绑定和routing_keys)。然后我从生产者处传递了那些作为参数(即send_task('task_name',[params],queue ='myQueue',routing_key ='myRoutingKey'))

仅供参考,以下是我在其中一台服务器上的celeryconfig的样子:

BROKER_URL = "amqp://server_URL/cel_host"

CELERY_APP = 'proj.tasks'

CELERY_IMPORTS = ('proj.tasks', )

CELERY_ROUTES = {
        'proj.tasks.send_email': {
            'queue': 'email_tasks',
            'routing_key': 'email.import',
        },
}