2012-11-25 46 views
2

我有一個將某些操作委託給芹菜任務的應用程序。這些操作必須由不同的工作人員執行,具體取決於某些參數。我曾考慮過使用隊列來實現它。我的想法是這樣的:工作人員尋址策略

  1. 客戶端請求從一個特定的消息queue1
  2. 如果worker1(用於queue1專門負責)已經積極的行動,它將如果沒有工人聽來處理請求
  3. queue1,全體工人(worker-main)將實例化worker1。該請求將被廢棄爲worker1。一段時間後
  4. worker1將自行關閉,而不使用

我芹菜的理解是有限的,我有幾個問題。

  1. 如何實現芹菜worker-main:這是一名傾聽所有隊列的員工,但優先級低於其他任何員工。也就是說,只有在請求不被其他工作人員採用時纔會起作用。
  2. woker-main如何創建worker1一旦創造者,worker1必須關聯到queue1,具有比worker-main更高的優先權?
  3. 請求是否可以從worker-main轉發到worker1答覆應直接發送給客戶。
  4. worker1可以關閉嗎?

可以看到架構的圖形化描述,我想在下面的圖片來實現:

multi-worker

回答

1

在你可以鏈接在一起「工人主」和「worker1」順序工作流程,以便「工作人員主管」始終按照步驟1處理作業,但只要返回並且如果檢測到「worker1」已經啓動就不做任何事情。

因此,任務首先命中「worker main」,「worker main」檢查worker1正在運行的服務器的正常運行,並且如果該服務器未運行,則將其拉起,等待它完全運行並且然後返回。以下是我測試過的一個proof of concept,瞭解如何在Celery中建立連續工作流程的鏈接,有更多真實世界體驗的人可能會有更好的解決方案。它還包含錯誤處理,以防在我的情況下讓工人失敗。

請注意,在這種方法中沒有隊列的概念。此外,可以給worker1和worker2不同的方法名稱,而不是區分參數,客戶端可以執行參數解析,然後選擇芹菜方法來執行。

+0

我不確定這是我需要的。在我的情況下,芹菜任務必須正在運行,並且必須在**任務內從**創建工人。沒有用戶干預*和*沒有shell命令。工作人員的人數可能會增長很多,最終會增加到數百名工人,每個工作人員都會聽到不同的隊列。正如你所說的,尋址不一定是基於隊列的:我只需要一種方法將消息發送給某個工作人員,並且讓全體工作人員意識到工人失蹤並在飛。 – dangonfast

+0

另外:我不是在談論一個單一的任務。客戶端可以向工作人員請求不同的任務(目前我有30多個不同的任務需要由工作人員執行)。所有這些任務請求必須被'worker-main'嗅探,並且如果'worker1'('worker2',...)沒有運行,它必須被實例化,並且任務請求被轉發。 – dangonfast