一種十年前的 Elixir 任務處理方法正在重新獲得關注,開發者們開始探索主流解決方案的替代方案。討論的焦點是使用 GenStage(Elixir 內建的生產者-消費者框架)構建自定義任務執行器,而不是僅僅依賴已建立的庫。
這次討論突出了 Elixir 生態系統中一個持續存在的挑戰:市場採用率。儘管具有技術優勢,開發者在企業環境中提出基於 Elixir 的解決方案時仍然面臨阻力。一位開發者分享了他們構建生產環境 Pub/Sub 通知系統的經驗,該系統已經成功執行多年,但仍然遇到來自客戶的質疑,這些客戶更傾向於使用 Java、.NET、Python 或 PHP 等更傳統的技術。
GenStage 架構元件:
- Producer:生成訊息/任務(示例中的 UUID )
- Consumer:處理從生產者拉取的任務
- Supervisor:管理程序生命週期和重啟
- Built-in Buffer:在處理前將專案儲存在記憶體中
Oban 主導生產部署
雖然自定義 GenStage 實現具有學習價值,但社群強烈傾向於在生產環境中使用 Oban。這個成熟的任務處理庫提供開源和專業版本,後者提供工作流、速率限制和併發控制等高階功能。然而,一些開發者對免費版本的功能限制表示擔憂,特別是在構建可能受益於專業版功能的開源專案時。
討論揭示了商業解決方案的全面性與自定義實現的靈活性之間的實際張力。雖然 Oban 能夠有效處理大多數生產需求,但對特定架構模式感興趣或進行學習練習的開發者發現理解底層 GenStage 機制很有價值。
** Oban 版本對比:**
- 開源版:基礎作業處理、排程、錯誤處理
- 專業版:高階功能,包括工作流、速率限制、併發控制和多工作程序協調
PostgreSQL 整合機會
圍繞基於 PostgreSQL 的任務處理出現了一個有趣的發展方向。開發者們正在探索與 PostgreSQL 擴充套件(如 pgmq 和 pg_cron)的整合,類似於 pgflow 使用的方法。這個方向與以資料庫為中心的任務處理的更廣泛趨勢保持一致,利用 PostgreSQL 的高階功能進行佇列管理和排程。
「我很希望看到一個為 Elixir 構建的解決方案,圍繞 Postgres pgmq 和 pg_cron 擴充套件,類似於 pgflow 正在做的事情」
PostgreSQL 方法在已經大量投資 PostgreSQL 基礎設施的環境中提供了潛在優勢,特別是那些使用 Supabase 即時功能的環境,這些功能由 Elixir 驅動並監控 PostgreSQL 的預寫日誌。
PostgreSQL 整合選項:
- pgmq 擴充套件:訊息佇列功能
- pg_cron 擴充套件:排程功能
- pgflow 方法:以資料庫為中心的作業處理
- FOR UPDATE SKIP LOCKED:透過行級鎖定實現併發作業處理
教育價值和長期程式碼穩定性
重新審視十年前的 GenStage 程式碼展示了 Elixir 的穩定性和其併發模型的持久相關性。開發者注意到原始實現隨著時間的推移保持得多麼好,這表明基礎的 Elixir 模式仍然穩健且易於維護。這種穩定性與許多其他技術棧中看到的快速演進形成對比。
教育方面特別引起了學習 Elixir 分散式計算能力的開發者的共鳴。能夠用相對簡單的程式碼構建複雜的任務處理系統展示了 Elixir 在併發和分散式應用程式方面的優勢。
正在進行的討論反映了 Elixir 社群的更廣泛主題:技術卓越與採用挑戰並存、自定義解決方案與成熟庫之間的平衡,以及 PostgreSQL 整合模式的持續演進。隨著開發者繼續探索這些方法,經過驗證的穩定性與現代需求的結合繼續推動 Elixir 任務處理解決方案的創新。
參考:Writing A Job Runner (in Elixir) (Again) (10 years later)