2013-07-05 32 views
4

據我所知,芹菜既是消費者的生產者也是消費者。這不是我想要達到的。我希望Celery充當消費者,根據我發送給我選擇的AMQP經紀人的消息來執行某些任務。這可能嗎?芹菜和定製消費者

或者我需要通過向我的堆棧中添加胡蘿蔔來製作湯嗎?

+0

湯和胡蘿蔔?你能舉個例子嗎? – DRC

回答

3

芹菜經紀人充當郵件存儲,並將它們發佈到一個或多個工人是認購者,

這樣:芹菜pulishes消息發送到代理(RabbitMQ的,REDIST,芹菜本身通過Django的數據庫等。 )這些消息是由工作人員根據經紀人的協議檢索的,它記住了它們(通常它們是持久的,但可能依賴於您的經紀人),並由您的工作人員執行。

任務結果可用於正在執行的工作任務,您可以配置store those results的位置,您可以使用this method檢索它們。

你可以發佈芹菜傳遞參數的任務給你的「接收函數」(你定義的任務,文檔有一些examples,通常你不想在這裏傳遞大的東西(比如查詢集),但只有最小值允許您的信息檢索需要在執行任務時什麼

一個簡單的例子是:

您註冊一個任務

@task 
def add(x,x): 
    return x+y 

,你從另一個模塊機智撥打H:

from mytasks import add 

metadata1 = 1 
metadata2 = 2 
myasyncresult = add.delay(1,2) 
myasyncresult.get() == 3 

編輯

後您的編輯,我看到大概要從其他其他來源的構建的消息芹菜,你可以看到here消息格式,則默認爲醃製對象的尊重這種格式,所以你將這些消息發佈在你的rabbitmq經紀人的正確隊列中,你有權從你的工作人員那裏獲取這些消息。

+0

當然,但是我可以通過從其他應用排隊消息來啓動芹菜工作嗎?換句話說:芹菜可以訂閱經紀人並根據出列的消息啓動某些任務嗎? –

+0

如果水平放大是您的擔心,那是肯定可行的!你只需要將狀態推到一個共享的後端作爲db(例如用於檢索你的模型?)或者只對傳遞的數據進行操作。 – DRC

+0

感謝您的編輯。由於Celery'自動'會通過訂閱隊列來照顧他們,所以我正在尋找的消息格式非常多? –

1

芹菜使用message broker architectural pattern。許多實施/經紀人運輸可以與芹菜一起使用,包括RabbitMQDjango database

Wikipedia

消息代理爲消息驗證,消息轉換和消息路由的架構模式。它介於應用程序之間的通信,最大限度地減少應用程序彼此之間應該具有的相互認識,以便能夠交換消息,從而有效地實現解耦。

保留結果是可選的,並且需要結果後端。您可以使用不同的代理和結果後端。 Celery Getting Started指南包含更多信息。

您的問題的答案是是的您可以觸發具體任務傳遞參數,而不需要將Carrot添加到組合中。

+0

好吧,看起來很有前途。因此,我可以在不同的環境中運行外部應用程序,以便將消息排隊到Celery消費的RabbitMQ,Celery會通知Celery調用任務X? –

+0

如果其他環境使用Python,那麼它很簡單,幷包含在基本文檔和示例中。如果您使用其他語言,則可以查看[HTTP回調任務(Webhooks)](http://docs.celeryproject.org/en/latest/userguide/remote-tasks.html)。 – AndrewS

+0

是的。但事情是,我不想使用Webhooks。據我所知,Celery既是消費者的消費者,也是生產者。我只想使用Celery作爲消費者,並且擁有一個外部生產者,負責將任務交給Celery。 –