技術極簡主義:一切皆用 Postgres

本文由 Stephan Schmidt @ KingOfCoders 發表於 Hacker News 並引發熱議 [1]:使用 Postgres 替代 Kafka、RabbitMQ、ElasticSearch、Mongo 和 Redis 是一種切實可行的方式,這樣做可以極大降低系統複雜度,並將敏捷性發揮到極致。

一切皆用 Postgres

如何簡化複雜度並快速前進:用 PostgreSQL 完成所有任務

歡迎,HN(Hacker News)讀者們。技術是關於取捨的藝術。全面使用 PostgreSQL 完成所有工作,也是一種策略與權衡。顯然,我們應根據需求選用合適的工具。很多情況下,這個工具就是 Postgres

在輔助許多初創企業的過程中,我觀察到很多人過度複雜化他們的系統,這樣做的公司遠超過那些選擇了過於簡單工具的公司。如果你們擁有超過一百萬用戶,超過五十名開發者,並且你們確實需要 Kafka、Spark 和 Kubernetes,那麼請便。如果你的系統數量比開發者還多,只用 Postgres 就是一個明智之選。

附言:全面使用 Postgres 並不意味着單臺服務器搞定一切 ;-)

簡單來說,一切皆可用 Postgres 解決

請神容易送神難,讓複雜度溜進家裏,再送走就沒那麼容易了。

然而,我們有極致簡化 [2] 的方案

在初創公司中簡化技術棧、減少組件、加快開發速度、降低風險並提供更多功能特性的方法之一就是 “一切皆用 Postgres”。Postgres 能夠取代許多後端技術,包括 Kafka、RabbitMQ、ElasticSearch,Mongo 和 Redis ,至少到數百萬用戶時都毫無問題。

使用 Postgres 替代 Redis 作爲緩存,使用 UNLOGGED Table[3] 並用 TEXT 類型存儲 JSON 數據,並使用存儲過程來添加並強制執行過期時間,正如 Redis 所做的那樣。

使用 Postgres 作爲消息隊列,採用 SKIP LOCKED[4] 來代替 Kafka(如果你只需要消息隊列的能力)。

使用加裝了 TimescaleDB[5] 擴展的 Postgres 作爲數據倉庫。

使用 PostgreSQL 的 JSONB[6] 類型來存儲、索引、搜索 JSON 文檔,從而替代 MongoDB。

使用加裝 pg_cron[7] 擴展的 Postgres 作爲定時任務守護程序,在特定時間執行特定任務,例如發送郵件,或向消息隊列中添加事件。

使用 Postgres + PostGIS 執行 地理空間查詢 [8]。

使用 Postgres 進行全文搜索 [9],加裝 ParadeDB 替代 ElasticSearch。

使用 Postgres 在數據庫中生成 JSON[10],免去服務器端代碼編寫,直接供 API 使用。

使用 GraphQL 適配器 [11],也可以讓 PostgreSQL 提供 GraphQL 服務。

我已明言,一切皆可 Postgres

關於作者 Stephan

作爲一名 CTO、臨時 CTO、CTO 教練以及開發者,斯蒂芬在許多快速成長的初創公司的技術部門中都留下了自己的足跡。他在 1981 年左右,因爲想編寫視頻遊戲,就在一家百貨公司自學了編程。斯蒂芬在烏爾姆大學(University of Ulm)學習計算機科學,專攻分佈式系統和人工智能,並且還學習了哲學。90 年代互聯網進入德國時,他作爲幾家初創公司的首位編程員工。他創辦過一家獲風險資本投資的初創公司,在其他獲得風險資本投資的快速成長的初創公司中負責架構、流程和成長挑戰,曾在 ImmoScout 擔任管理職位,並且是一家 eBay Inc. 公司的 CTO。在他的妻子成功出售了她的初創公司後,他們搬到了海邊,斯蒂芬開始從事 CTO 輔導工作。你可以在 LinkedIn 上找到他,或者在 Twitter 上關注 @KingOfCoders。

譯者評論

譯者:馮若航,創業者與 PostgreSQL 專家,下雲倡導者,開源 PG RDS 替代,開箱即用的 PostgreSQL 發行版 —— Pigsty 作者。

使用 Postgres 完成一切工作並不是一種空想,而是一種正在流行起來的最佳實踐。對此我感到非常欣慰:早在 2016 年時我便看到了這裏的潛力 [12] 並選擇躬身入局,而事情的發展正如所願。

我曾任職的探探,便是這條道路的先鋒 —— PostgreSQL for Everything。這是一個由瑞典創始團隊打造的中國互聯網 App —— 使用 PostgreSQL 的規模與複雜度在中國首屈一指。探探的技術架構選型參照了 Instagram —— 或者說更爲激進,幾乎所有業務邏輯都使用 PostgreSQL 存儲過程實現(甚至包括 100ms 的推薦算法!)。

探探整個系統架構圍繞 PostgreSQL 而設計並展開。幾百萬日活,幾百萬全局 DB-TPS,幾百 TB 數據的量級下,數據組件只用了 PostgreSQL 。直到接近千萬日活,纔開始進行架構調整引入獨立的數倉,消息隊列和緩存。在 2017 年,我們甚至沒有使用 Redis 緩存,250 萬 TPS 完全是由一百多臺服務器上的 PostgreSQL 直接扛下的。消息隊列也是用 PostgreSQL 實現的,早中期的數據分析也是由一套十幾 TB 的專用 PG 集羣負責。我們早已經踐行了 —— “一切皆用 PostgreSQL 的理念”,並從中獲益良多。

這個故事還有下半段 —— 隨後的 “微服務改造” 帶來了海量的複雜度,最終讓系統陷入泥潭。這讓我從另一個角度更加確信這一點 —— 我非常懷念一切皆用 PostgreSQL 時那種簡單可靠高效敏捷的狀態。

PostgreSQL 並不是一個簡單的關係型數據庫,而是一個數據管理的抽象框架,具有囊括一切,吞噬整個數據庫世界的潛力。在十年前,這僅僅是一種潛力與可能性,在十年後,它已經兌現成爲真正的影響力。而我很高興能見證這個過程,並推動這一進程。

PostgreSQL is for Everything!

References

[1] Just use Postgres for everything: https://news.ycombinator.com/item?id=33934139
[2] 技術極簡主義宣言: https://www.radicalsimpli.city/
[3] UNLOGGED Table: https://www.compose.com/articles/faster-performance-with-unlogged-tables-in-postgresql/
[4] SKIP LOCKED: https://www.enterprisedb.com/blog/what-skip-locked-postgresql-95
[5] Timescale: https://www.timescale.com/
[6] JSONB: https://scalegrid.io/blog/using-jsonb-in-postgresql-how-to-effectively-store-index-json-data-in-postgresql/
[7] pg_cron: https://github.com/citusdata/pg_cron
[8] 地理空間查詢: https://postgis.net/
[9] 全文搜索: https://supabase.com/blog/postgres-full-text-search-vs-the-rest
[10] 在數據庫中生成 JSON: https://www.amazingcto.com/graphql-for-server-development/
[11] GraphQL 適配器: https://graphjin.com/
[12] PG 與 MySQL 相比優勢何在?: https://www.zhihu.com/question/20010554/answer/94999834

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/yI06zdqnW5uWnqvKmgM-9g