首頁  >  文章  >  後端開發  >  確保芹菜的公平加工—第一部分

確保芹菜的公平加工—第一部分

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-16 09:10:03605瀏覽

Ensuring Fair Processing with Celery — Part I

如果您熟悉 Python,您很可能聽說過 Celery。它通常是非同步處理任務的首選,例如影像處理或傳送電子郵件。

與一些人交談時,我開始注意到許多開發人員一開始都覺得 Celery 令人印象深刻,但隨著他們的專案規模和複雜性的增加,他們的興奮開始消退。雖然有些人出於正當原因放棄了 Celery,但其他人可能只是沒有深入探索其核心,無法根據自己的需求進行客製化。

在這篇部落格中,我想討論一些開發人員開始尋找替代方案甚至建立自訂後台工作框架的原因之一:公平處理。在使用者/租戶提交不同規模任務的環境中,一個租戶的繁重工作量影響其他租戶的風險可能會造成瓶頸並導致挫折感。

我將引導您了解在 Celery 中實現公平處理的策略,確保平衡的任務分配,以便沒有任何一個租戶可以支配您的資源。

問題

讓我們深入探討多租戶應用程式面臨的常見挑戰,特別是那些處理批次的應用程式。想像一下,您有一個系統,用戶可以將其圖像處理任務排隊,允許他們在短暫等待後收到處理後的圖像。此設定不僅可以使您的 API 保持回應,還可以讓您根據需要擴展工作線程以有效地處理負載。

一切都運作順利 - 直到一個租戶決定提交大量圖像進行處理。您擁有多名工作人員,他們甚至可以自動擴展以滿足不斷增長的需求,因此您對您的基礎設施充滿信心。然而,當其他租戶嘗試對較小的批次(可能只是幾張圖像)進行排隊並突然發現自己面臨長時間的等待而沒有任何更新時,麻煩就開始了。在您不知不覺中,支援請求開始湧入,用戶抱怨您的服務速度緩慢甚至沒有回應。

這種情況太常見了,因為 Celery 預設會依照接收到的順序處理任務。當一個租戶因大量湧入的任務而讓您的工作人員不堪重負時,即使是最好的自動擴展策略也可能不足以防止其他租戶出現延誤。因此,這些使用者體驗到的服務水準可能達不到承諾或預期的水準。

使用 Celery 進行速率限制

確保公平處理的一個有效策略是實施速率限制。它允許您控制每個租戶在特定時間範圍內可以提交的任務數量。這可以防止任何單一租戶壟斷您的工人,並確保所有租戶都有公平的機會來處理他們的任務。

Celery 具有內建的任務等級速率限制功能:

您可以透過執行以下命令來執行工作執行緒:

現在,執行app.py腳本觸發20個任務:

如果您設法在本地運行它,您會注意到每個任務之間存在延遲,以確保執行速率限制。現在您可能認為這並不能真正幫助我們解決問題,您完全正確。 Celery 的內建速率限制對於我們的任務可能涉及呼叫具有嚴格速率限制的外部服務的場景非常有用。

這個範例強調了內建功能對於複雜場景來說可能過於簡單。然而,我們可以透過更深入地探索 Celery 的框架來克服這個限制。讓我們看看如何為每個租戶設定適當的速率限制並自動重試。

我們將使用 Redis 來追蹤每個租用戶的速率限制。 Redis 是 Celery 的熱門資料庫和代理,因此讓我們利用這個可能已經在您的堆疊中的元件。

讓我們導入幾個函式庫:

現在我們將為我們的速率限制任務實作一個自訂基底任務類別:

這個自訂類別將追蹤特定租用戶使用 Redis 觸發的任務量,並將 TTL 設定為 10 秒。如果超出速率限制,任務將在 10 秒後重試。所以基本上我們的預設速率限制是 10 秒內完成 10 個任務。

讓我們定義一個模擬處理的範例任務:

這裡我們定義了一個流程任務,你可以看到我可以在任務層級更改custom_rate_limit。如果我們不指定 custom_rate_limit,則會指派預設值 10。 現在我們的速率限制已更改為 10 秒內完成 5 個任務。

現在讓我們為不同的租戶觸發一些任務:

我們為租用戶 ID 1 定義 20 個任務,為租用戶 ID 2 定義 10 個任務。

所以我們完整的程式碼將如下所示:

讓我們運行我們的工作執行緒:

現在,執行 app.py 腳本觸發任務:

如您所見,工作人員處理了第一個租戶的 5 個任務,並為所有其他任務設定了重試。然後它會執行第二個租戶的 5 個任務,並為其他任務設定重試,然後繼續進行。

這種方法可讓您定義每個租用戶的速率限制,但正如您在我們的範例中看到的,對於運行速度非常快的任務,對速率限制過於嚴格最終會讓工作人員在一段時間內無所事事。微調速率限制參數至關重要,並且取決於特定的任務和數量。不要猶豫,不斷嘗試,直到找到最佳平衡。

結論

我們探討了 Celery 的預設任務處理如何導致多租戶環境中的不公平,以及速率限制如何幫助解決此問題。透過實施特定於租戶的速率限制,我們可以防止任何單一租戶壟斷資源,並確保更公平地分配處理能力。

這種方法為在 Celery 中實現公平處理提供了堅實的基礎。然而,還有其他值得探索的技術來進一步優化多租戶應用程式中的任務處理。雖然我最初計劃在一篇文章中涵蓋所有內容,但事實證明這個主題非常廣泛!為了確保清晰度並保持本文的重點,我決定將其分為兩部分。

在本系列的下一部分中,我們將深入研究任務優先級作為增強公平性和效率的另一種機制。這種方法可讓您根據不同的標準為任務分配不同的優先級,確保即使在高需求時期也能及時處理關鍵任務。

敬請期待下期!

以上是確保芹菜的公平加工—第一部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn