PgQue:零膨脹的 Postgres 隊列系統
AI 生成摘要
PgQue 是一個純 PL/pgSQL 實作的經戰場驗證之 PgQ 引擎,旨在為任何 Postgres 平台提供高效能、零膨脹的訊息隊列,且不需要安裝 C 擴充功能。
背景
PgQue 是一個基於 PostgreSQL 的輕量級隊列系統,旨在解決傳統資料庫隊列常見的效能衰退問題。它重新實現了 Skype 早期開發的 PgQ 架構,透過純 SQL 與 PL/pgSQL 編寫,使其能運行於 RDS、Aurora 或 Supabase 等託管型資料庫服務。與常見的 SKIP LOCKED 模式不同,PgQue 採用快照批次處理與資料表輪轉技術,試圖消除因頻繁刪除與更新所產生的磁碟空間膨脹。
社群觀點
在 Hacker News 的討論中,社群對於「零膨脹」(Zero-bloat)這一術語的定義展開了辯論。部分習慣使用共享記憶體隊列的開發者認為,將隊列邏輯建立在資料庫內部本身就是一種系統層面的負擔,對於追求極致效能的人來說,這類設計可能被視為多餘的開銷。然而,熟悉 PostgreSQL 內部運作的開發者則指出,在 Postgres 的語境下,「膨脹」特指因更新或刪除操作產生的無效元組(Dead Tuples),這些殘留資料會導致 VACUUM 壓力增加並拖慢索引效能。因此,PgQue 透過技術手段避免產生無效元組,在資料庫管理員眼中確實解決了核心的維運痛點。
關於效能表現,社群對其延遲數據提出了疑問。雖然 PgQue 宣稱單次呼叫的延遲僅在微秒級別,但其設計機制決定了端到端的傳遞延遲通常落在 1 到 2 秒之間。這引發了關於適用場景的討論,有觀點認為,如果應用程式需要毫秒級的即時分發,PgQue 顯然不是正確的選擇;但若優先考量的是在高負載下的穩定性,且不希望為了隊列功能而額外維護 Kafka 或 RabbitMQ 等複雜的分布式系統,那麼這種延遲權衡是完全可以接受的。
此外,開發者們對於 PgQue 提供的持久性與事務保證表示肯定。特別是在實作發件箱模式(Outbox Pattern)或小規模的扇出(Fan-out)需求時,能夠直接利用現有的資料庫基礎設施,而不必引入新的中間件,對於簡化架構具有極大的吸引力。這種「反擴充」(Anti-extension)的設計理念,讓開發者無需安裝 C 語言擴充功能或重啟資料庫即可部署,降低了在受限環境下的使用門檻。
延伸閱讀
在討論中被提及的相關工具與對標技術包括 PGMQ、River、pg-boss、Oban 以及 graphile-worker。這些工具多數採用 SKIP LOCKED 模式,與 PgQue 的批次輪轉架構形成對比。此外,pg_cron 被推薦作為驅動 PgQue 定時任務的首選工具。
相關文章
其他收藏 · 0
收藏夾