我正在尝试启动芹菜工作者,所以它只能侦听单个队列。这不是问题,我可以这样做:
python -m celery worker -A my_module -Q my_queue -c 1
但是现在我也希望这个my_queue
队列成为广播队列,所以我在celeryconfig中这样做:
from kombu.common import Broadcast
CELERY_QUEUES = (Broadcast('my_queue'),)
但是一旦我这样做,我就不能再开始工作了,我从rabbitmq得到了错误:
amqp.exceptions.PreconditionFailed: Exchange.declare: (406) PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'my_queue' in vhost 'myvhost': received 'fanout' but current is 'direct'
如果我没有-Q
启动工作人员(但如上所述在Broadcast
中保留celeryconfig.py
)并且我列出了rabbitmq队列,我可以看到广播队列已创建并命名如下:
bcast.43fecba7-786a-461c-a322-620039b29b8b
同样,如果我在worker中定义此队列(如上所述使用-Q
),或者在Queue
中定义为celeryconfig.py
,如下所示:
from kombu import Queue
CELERY_QUEUES = (Queue('my_queue'),)
我可以在rabbitmq中看到这样的队列:
my_queue
在上面定义队列时我对Broadcast
调用的内容并不重要 - 这似乎是内部芹菜名称,而不是传递给rabbitmq。
所以我猜测工人何时开始,然后创建my_queue
,一旦完成,就无法Broadcast
。
我可以让一个工作人员监听任何队列(不仅仅是my_queue
),我将从删除-Q
参数开始。但是能够拥有一个只侦听特定队列的进程会很好,因为我在那里投入的任务很快,而且我希望尽可能地减少延迟。
---编辑1 ---
花了一些时间来解决这个问题,上面提到的bcast
队列看起来并不一致。重置rabbitmq并运行没有-Q
选项bcast
队列的芹菜后,没有出现...
答案 0 :(得分:3)
使用代理发送消息时,客户端和工作人员必须就相同的配置值达成一致。如果您必须更改配置,则需要清除现有消息并重新启动所有消息以使它们保持同步。
启动广播队列时,您可以设置交换类型并配置队列。
from kombu.common import Broadcast
from kombu import Exchange
exchange = Exchange('custom_exchange', type='fanout')
CELERY_QUEUES = (
Broadcast(name='bcast', exchange=exchange),
)
现在你可以用
开始工作了celery worker -l info -A tasks -Q bcast