启动celery worker并为广播队列启用它

时间:2017-05-23 18:02:20

标签: python rabbitmq celery

我正在尝试启动芹菜工作者,所以它只能侦听单个队列。这不是问题,我可以这样做:

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队列的芹菜后,没有出现...

1 个答案:

答案 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