
為什么不直接使用 Celery/RQ/Huey/TaskTiger?
不幸的是,WakaTime 使用 Celery 已經快 10 年了。在那段時間里,我經歷了許多嚴重的錯誤,其中一些在被引入多年后仍然存在。Celery 曾經相當不錯,但功能膨脹使項目難以維護。同樣在我看來,將代碼分成三個獨立的 GitHub 存儲庫會使代碼庫難以閱讀。
然而,主要原因是: Celery 延遲任務無法擴展。
如果您使用 Celery 延遲任務,隨著您的網站最終增長,您將開始看到此錯誤消息:
QoS: Disabled: prefetch_count exceeds 65535
當這種情況發生時,工作人員會停止處理所有任務,而不僅僅是延遲的任務!隨著 WakaTime 的增長,我們開始更頻繁地遇到這個錯誤。
我嘗試了RQ、Huey和TaskTiger,但它們缺少功能并且處理任務比 Celery 慢。對于像 WakaTime 這樣的網站來說,分布式任務隊列是必不可少的,我已經厭倦了遇到 bug。出于這個原因,我決定盡可能構建最簡單的分布式任務隊列,同時仍然提供 WakaTime 所需的所有功能。
介紹 WakaQ
WakaQ是一個新的 Python 分布式任務隊列。使用它在后臺運行代碼,使您的網站保持快速和快速,并讓您的用戶保持快樂。
WakaQ 很簡單
它只有 1,264 行代碼!
$ find . -name '*.py' -not -path "./migrations*" -not -path "./venv*" | xargs wc -l | grep " total" | awk '{print $1}' | numfmt --grouping
1,264
從第一行代碼到在 WakaTime 完全取代 Celery只用了一周時間。這說明了它的簡單性。
每個隊列都是使用Redis 列表實現的。延遲任務使用Redis 排序集實現自己的隊列。廣播任務共享一個Redis Pub/Sub queue。
WakaQ 具備所有必要的功能
- 隊列優先級
- 延遲任務(在 timedelta eta 之后運行任務)
- 計劃的 cron 定期任務
- 廣播任務(在所有工作人員上運行任務)
- 任務軟硬超時限制_
- 可選擇在軟超時時重試任務
- 通過在達到max_mem_percent時重新啟動工作程序來防止內存泄漏
- 超級最小且可維護
超出范圍的功能包括速率限制、排他鎖定、存儲任務結果和任務鏈接。這些很容易添加到您的應用程序的任務代碼中,并且您可能無論如何都希望根據您的應用程序的需求來實現這些。
WakaQ 可以使用了
WakaQ是穩定的,可以在生產中使用。WakaQ 目前為WakaTime網站的 prod 中的所有后臺任務提供支持,包括但不限于:
- 發送代碼統計電子郵件報告
- 更新我們的 LetsEncrypt SSL 證書
- 預緩存儀表板、回購徽章和可嵌入圖表
- 我們不想阻止網絡請求的其他任何事情
它是在BSD 許可下發布的,因此您可以在開源和閉源項目中使用它。如果您發現任何錯誤,請打開一個問題,但在請求新功能之前請三思而后行 。
原文標題:Building a Distributed Task Queue in Python
原文作者: Alan Hamlett
原文鏈接:https://wakatime.com/blog/56-building-a-distributed-task-queue-in-python




