2013-05-03 38 views
0

我遇到了一個用例,我想控制芹菜工作人員如何以及何時從rabbitmq處理任務以進行處理。離職將與芹菜背景下發生的外部事件同步,但我擔心芹菜是否給我任何靈活性來控制任務的出隊?我試圖調查及以下幾種可能性:從基於外部事件(事件隊列)的隊列中消費

  • 利用basic.get代替basic.consume,其中basic.get基於外部事件觸發。但是,我看到芹菜默認爲basic.consume(推)語義。我可以在不直接修改內核的情況下重寫此行爲嗎?

  • 自定義遠程控制外部事件觸發時的工作人員。但是,從文檔來看,我不太清楚遠程控制命令如何幫助我控制任務的出隊。

我非常想繼續使用芹菜,並可能遠離在AMQP上編寫自定義隊列處理解決方案。

回答

0

使用遠程控制命令,您可以從給定隊列消耗pause or resume消息。

celery.control.cancel_consumer('celery') 

上面的命令指示的所有工人停止食用從默認芹菜隊列(出列)消息

celery.control.add_consumer('celery') 

遠程命令接受目的地參數,它允許發送到特定工人的請求

+0

感謝您的意見。遙控命令的確看起來像是一個合理的選擇。但是,看起來像工作人員仍然會使用'prefetch_count> 1'來執行任務,這種做法會打敗我的目的。有沒有辦法通過'prefetch_count = 1'來啓用這些消費者?具體來說,我想要a)添加使用者b)從指定的隊列中取出單個任務c)禁用該隊列的使用者,直到進一步發生外部事件 – 2013-05-04 17:20:41

+0

爲工作者配置預取計數CELERYD_PREFETCH_MULTIPLIER = 1 – mher 2013-05-05 09:46:13

0

另外兩個需要考慮的奇特選項:(1)在兔子層中定義一個自定義交換類型。這允許您創建路由規則來控制哪些任務發送到哪些隊列。 (2)定義一個定製的芹菜介體。這允許您控制從隊列到工作池的哪些任務移動。