簡體   English   中英

Celery 任務/工人分配邏輯

[英]Celery task / worker assignment logic

你好 stackoverflow 的人!

我想討論一下,看看有什么更好的方法可以解決我的問題。

我有一個應用程序,它使用多種協議(FTP(S)、SFTP、S3、電子郵件)向客戶端發送文件。

每個目錄都有一個芹菜任務。 一個目錄可以發送到多個客戶端,也可以發送到多個目的地。 例如 dir1 -> client1 -> FTP 和 EMail(2 個任務,可以並行運行),dir2 -> client1 AND client2 -> 相同的 FTP 主機名,不同的遠程目錄(2 個任務,不能並行運行)。

這工作正常,但是有時我會導致客戶端網絡擁塞,由於多個工作人員到同一目的地的多個連接,一些客戶端不知道(或想要實現)QOS。

我想要一個邏輯,不允許任務連接到同一時間運行的相同協議或主機名。 例如,一個被發送到 2 個 S3 存儲桶的目錄應該運行一次,完成后第二個將啟動。 或者兩個不同的目錄被發送到同一個 FTP 服務器。

我最初的想法是實現一個 celery_worker 隊列遠程控制。 每個帳戶,協議一個隊列。 並設置具有並發 1 偵聽隊列的 worker。

想知道你們中是否有人遇到過類似的挑戰,以及你們是如何解決的。

您提出的解決方案相當脆弱(您真的不應該依賴 celery 並發設置來控制/阻止並發執行)並且可能無法解決所有潛在的競爭條件(例如,如果 taskA 和 taskB 在不同的隊列中但需要訪問不支持並發訪問的資源)。

有很多方法(從非正式的建議到像 celery-once 這樣的成熟的庫)來防止並發執行一個給定的任務。 它們不會直接解決您自己的問題,但基本原理是相同的:具有一些與任務通信的共享鎖機制 - 嘗試獲取鎖,只有在獲取鎖后才運行,然后當然會釋放它。 如果您使用 Redis 作為結果后端,它的讀/寫成本相當低,而且它的“過期”功能非常有用,但您也可以只使用 SQL 數據庫。

暫無
暫無

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

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