【发布时间】:2017-10-23 19:53:14
【问题描述】:
我正在尝试启动 celery worker,所以它只听单个队列。这不是问题,我可以这样做:
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 的情况下启动worker(但如上所述将Broadcast 留在celeryconfig.py 中)并列出rabbitmq 队列,我可以看到广播队列已创建并命名如下:
bcast.43fecba7-786a-461c-a322-620039b29b8b
同样,如果我在 worker 中定义这个队列(如上所述使用 -Q)或在 celeryconfig.py 中像这样简单的 Queue:
from kombu import Queue
CELERY_QUEUES = (Queue('my_queue'),)
我可以像这样在 rabbitmq 中看到这个队列:
my_queue
在定义队列时,我在 Broadcast 调用中添加了什么并不重要 - 这似乎是内部 celery 名称,而不是传递给 rabbitmq。
所以我猜当工人开始时,然后my_queue 被创建,一旦完成它就不能被创建Broadcast。
我可以让一个工作人员监听任何队列(不仅是 my_queue),我将从删除 -Q 参数开始。但是如果能够有一个进程只监听那个特定的队列就好了,因为我在那里投入的任务很快,而且我希望尽可能地降低延迟。
--- 编辑 1 ---
花了一些时间解决这个问题,似乎上面提到的bcast 队列并没有始终如一地出现。重置rabbitmq并在没有-Q选项的情况下运行celerybcast队列没有出现......
【问题讨论】:
-
建议:将“my_queue”替换为新的广播队列名称,并使用“-Q new_broadcast_queue_name”启动您的工作进程,试一试。
-
你用的是哪个 celery 版本?