2013-09-23 60 views
2

我打算將芹菜用於我們的項目之一,我需要一些關於設計的建議。芹菜 - 設計和最佳實踐需要幫助

該應用會做什麼? 基本上,我希望能夠在同一時間,具有以下特點來運行多個進程:

  1. 一些方法來找出工作重複 - 如果一個進程運行了很長一段時間使用相同的參數,那麼理想情況下我們不應該再次提交流程。我不認爲芹菜目前支持這一點。我們正計劃通過在應用程序本身內部添加一些鎖定機制來規避此問題。這將要求我們在我們的應用程序中添加鎖定邏輯,僅用於我們不想做的芹菜。我們正在考慮的另一個解決方案是創建傳遞給我們即將提交的作業的參數(有效內容)的哈希簽名,並根據當前正在或正在隊列中的作業的哈希來檢查該哈希簽名。我猜測應該很容易找出隊列中所有正在運行的作業和作業(我們將保持任務狀態),然後使用我們傳遞給作業的數據/有效載荷來創建散列。
  2. 確定作業優先級的一些方法 - 儘管我們在所有工作人員上運行相同的代碼庫,但有些作業可能需要較長時間(根據我們傳遞的參數)。現在,我們想要做的是,如果我們將param A傳遞給作業,它應該比我們想用param B運行的作業具有更高的優先級。同樣,如果我傳遞一個名爲「immediate」的param,它應該被執行在另一個之前2.我想到的一個方法是讓所有工人都聽所有的工作;但作業調度員會在提交作業時將countdown = xx標誌添加到任務中。使用參數A的作業比使用參數B提交的作業具有更低的倒計時值。具有參數「立即數」的作業將沒有倒數值。我也在考慮讓1名工作人員專注於「直接」隊列。

我想知道如果你們之前做過類似的事情,我會非常感激的建議。

回答

0

芹菜非常適合你的問題,但你必須做一些工作。

1部分:

如果你正在處理的長時間運行的進程,其中相同的任務參數可以重新入隊,你是對的,你需要某種分佈式鎖定機制,和芹菜沒有內置在這方面的機制。

我推薦在py-redis包中使用redis.Lock,假設Redis在您的堆棧中,這是一個簡單的機制,可以爲應用開發人員提供很多控制。你想鎖定多長時間?如果工人死亡,您想要釋放鎖定多久?你的鎖定TTL是否可以降低,並且你的工作人員每隔一秒左右更新鎖定?所有這些都是隨時可以使用的,並且將參數作爲密鑰散列就可以作爲一個關鍵。如果你真的是偏執狂,那麼使用一個有許多比特的散列並添加大量的熵。

第2部分:

爲了實現你的優先目標,使用多個隊列。對於您的直接隊列,運行專門工作人員在該隊列上進行偵聽然後運行(如果有意義的話)從立即隊列和低優先級隊列中消耗的一組工作人員。這將提高資源利用率併爲每個主機提供更高的密度。

作爲一個慣例:使用更多隊列而不是更少。這使您可以根據硬件,時間,內存或CPU劃分工作負載。您可以靈活:電子郵件隊列備份? 「呃,它會在幾分鐘內清除。」最後,實施和工具簡單。