如果您熟悉 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中文網其他相關文章!

每天學習Python兩個小時是否足夠?這取決於你的目標和學習方法。 1)制定清晰的學習計劃,2)選擇合適的學習資源和方法,3)動手實踐和復習鞏固,可以在這段時間內逐步掌握Python的基本知識和高級功能。

Python在Web開發中的關鍵應用包括使用Django和Flask框架、API開發、數據分析與可視化、機器學習與AI、以及性能優化。 1.Django和Flask框架:Django適合快速開發複雜應用,Flask適用於小型或高度自定義項目。 2.API開發:使用Flask或DjangoRESTFramework構建RESTfulAPI。 3.數據分析與可視化:利用Python處理數據並通過Web界面展示。 4.機器學習與AI:Python用於構建智能Web應用。 5.性能優化:通過異步編程、緩存和代碼優

Python在開發效率上優於C ,但C 在執行性能上更高。 1.Python的簡潔語法和豐富庫提高開發效率。 2.C 的編譯型特性和硬件控制提升執行性能。選擇時需根據項目需求權衡開發速度與執行效率。

Python在現實世界中的應用包括數據分析、Web開發、人工智能和自動化。 1)在數據分析中,Python使用Pandas和Matplotlib處理和可視化數據。 2)Web開發中,Django和Flask框架簡化了Web應用的創建。 3)人工智能領域,TensorFlow和PyTorch用於構建和訓練模型。 4)自動化方面,Python腳本可用於復製文件等任務。

Python在數據科學、Web開發和自動化腳本領域廣泛應用。 1)在數據科學中,Python通過NumPy、Pandas等庫簡化數據處理和分析。 2)在Web開發中,Django和Flask框架使開發者能快速構建應用。 3)在自動化腳本中,Python的簡潔性和標準庫使其成為理想選擇。

Python的靈活性體現在多範式支持和動態類型系統,易用性則源於語法簡潔和豐富的標準庫。 1.靈活性:支持面向對象、函數式和過程式編程,動態類型系統提高開發效率。 2.易用性:語法接近自然語言,標準庫涵蓋廣泛功能,簡化開發過程。

Python因其簡潔與強大而備受青睞,適用於從初學者到高級開發者的各種需求。其多功能性體現在:1)易學易用,語法簡單;2)豐富的庫和框架,如NumPy、Pandas等;3)跨平台支持,可在多種操作系統上運行;4)適合腳本和自動化任務,提升工作效率。

可以,在每天花費兩個小時的時間內學會Python。 1.制定合理的學習計劃,2.選擇合適的學習資源,3.通過實踐鞏固所學知識,這些步驟能幫助你在短時間內掌握Python。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版
中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具