所以我有两个工作服务器(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。我希望有一种方法可以将我的任务正确地路由到不同的服务器。任何帮助将受到高度赞赏。
答案 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',
},
}