簡體   English   中英

啟動celery worker並將其啟用廣播隊列

[英]start celery worker and enable it for broadcast queue

我正在嘗試啟動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什么內容無關緊要-這似乎是內部芹菜名稱,沒有傳遞給Rabbitmq。

因此,我猜想何時啟動worker,然后創建my_queue ,一旦完成,就無法將其設置為Broadcast

我可以有一個工作程序,它可以偵聽任何隊列(不僅是my_queue ),我可以通過刪除-Q參數來開始。 但是最好有一個僅監聽特定隊列的進程,因為我在那兒丟的任務很快,而且我想盡可能降低延遲。

---編輯1 ---花了一些時間解決此問題,並且上述bcast隊列似乎並不一致。 重置Rabbitmq並在不使用-Q選項的情況下運行celery之后, bcast隊列未出現...

使用代理發送消息時,客戶端和工作進程必須在相同的配置值上達成共識。 如果必須更改配置,則需要清除現有消息並重新啟動所有消息,以便它們同步。

啟動廣播隊列時,可以設置交換類型並配置隊列。

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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM