[推薦] You Don't Need Kafka, Just Use Postgres Considered Harmful
Source
Summary
文章主張「用 Postgres 取代 Kafka」的觀點有害無益,因為二者設計目的不同,應依據事件串流需求選擇 Kafka 的專長(如容錯、低延遲與連接器),而非強求單一工具導致複雜度上升與未來擴展困境。
-
不同工具的定位:Postgres 是關聯式資料庫,適合管理查詢關聯資料;Kafka 是事件串流平台,專為即時資料管道、微服務通訊等設計,二者目的迥異。
-
反對「Postgres 足夠」的論點:此類文章常強調 Kafka 運行困難或昂貴,尤其在小規模時,但忽略了 Kafka 在小規模下的可靠性與功能優勢。
-
工作佇列的挑戰:用 Postgres 建置佇列(如 SELECT … FOR UPDATE SKIP LOCKED)可能導致 MVCC 膨脹和 WAL 堆積,需進行長時間效能測試。
-
Kafka 的日誌語義:Kafka 提供持久化有序事件日誌,支持重播、時間保留和精確一次語義,遠超簡單佇列,難以在 Postgres 上複製。
-
容錯與高可用性:Kafka 叢集多節點複製資料,單節點故障影響小;Postgres 寫入單一主節點,故障需手動介入或外部工具。
-
消費者群組:Kafka 輕鬆實現多消費者負載分擔與故障轉移;在 Postgres 上需自建領導者選舉或再平衡協議,複雜度高。
-
低延遲處理:Kafka 支持毫秒級延遲,適合詐欺偵測或即時搜尋;Postgres 輪詢或 LISTEN/NOTIFY 易受鎖競爭影響。
-
連接器生態:Kafka Connect 提供豐富的來源/目的地連接器,簡化資料整合;Postgres 無類似生態,需自製連接器。
-
開發體驗:Kafka 擁有成熟客戶端、模式管理和監控工具;用 Postgres 建事件串流需重構這些,增加不必要複雜度。
-
建議使用方式:小規模也應選對工具;常用變更資料擷取 (CDC) 和出箱 (outbox) 模式,讓 Postgres 與 Kafka 互補,保持一致性並降低運維負擔。