結論先講

每多一個服務就多一份維護成本。 Redis 確實快(5,346 RPS),ES 搜尋確實強(2.6 倍),Kafka 事件流確實穩。但你在 Day 1 就把它們全裝上去,你得到的不是高效能系統,是一個你維護不動的怪獸。正確做法是漸進式添加——只在痛點出現時才加對應服務,而且每次只加一個。


各服務的實測數據

Redis — 讀取加速器

指標數據篇章
KV 讀取5,346 req/s[[micro-service/20-storage-redis-es|#20]]
Cache 加速效果(讀多場景)+650%[[micro-service/20-storage-redis-es|#20]]
記憶體佔用(典型)50-200MB[[micro-service/20-storage-redis-es|#20]]

Redis 是 ROI 最高的加速方案——加幾行 code 就能把讀取效能提升 6.5 倍。但它是記憶體資料庫,資料量大時成本會爆炸。只放熱資料,設好 TTL。

Elasticsearch — 搜尋專家

指標數據篇章
搜尋速度 vs PG LIKE2.6 倍[[micro-service/56-search-mysql-pg-elk|#56]]
中文分詞 + 模糊搜尋原生支援[[micro-service/56-search-mysql-pg-elk|#56]]
記憶體需求最少 512MB[[micro-service/56-search-mysql-pg-elk|#56]]

ES 在搜尋場景無可取代,但它的維護成本高——索引同步、Mapping 管理、叢集健康監控都需要人力。在此之前,PG 的 pg_trgm + GIN index 可以撐到中等搜尋量

PG JSONB vs MongoDB

PG JSONB 讀取只比 MongoDB 慢 4%,但寫入 MongoDB 快 8.6 倍([[micro-service/20-storage-redis-es|#20]])。如果你已經有 PG,JSONB 就能處理大部分半結構化需求,不需要多維護一個 MongoDB。

Kafka — 事件流處理

Kafka 適合事件驅動、服務解耦、流處理([[micro-service/35-event-driven-basics|#57]]),但維護複雜度高。小規模場景 BullMQ 或 RabbitMQ 就夠了。除非每天處理百萬級事件,否則不需要 Kafka。


漸進式添加路線圖

階段 1:PG 打天下

[PG] ← 你的所有資料

適用:0-100 個用戶、MVP、新專案啟動

PG 能做到的事比你想像的多:

  • 關聯式資料 → 正常 table
  • 半結構化資料 → JSONB 欄位
  • 全文搜尋 → pg_trgm + GIN index
  • 快取 → Materialized View
  • Queue → LISTEN/NOTIFYpg_boss

在這個階段,你的瓶頸不是資料庫,是產品方向。不要花時間在架構上。

階段 2:PG + Redis

[PG] ← 寫入 + 複雜查詢
[Redis] ← 熱資料快取、Session、Rate Limiting

什麼時候加 Redis

  • 同一個 API 被重複呼叫,讀寫比超過 10:1
  • 首頁或排行榜等高頻讀取頁面開始變慢
  • 需要 Rate Limiting 或分散式鎖
  • 用戶數超過 200P95 回應時間超過 500ms

加 Redis 的成本很低(Docker 一行指令),效果很大(+650%)。這是最值得做的第一步擴展。

階段 3:PG + Redis + ES

[PG] ← 核心資料
[Redis] ← 快取
[ES] ← 搜尋

什麼時候加 ES

  • 搜尋量占總請求 20% 以上
  • 需要中文分詞、模糊搜尋、自動補全
  • PG pg_trgm 已經調到極限還是太慢
  • 搜尋功能的 P95 回應時間超過 1 秒

加 ES 的成本明顯高於 Redis——你需要處理資料同步(PG → ES)、索引管理、至少 512MB RAM。確定你真的需要再加。

階段 4:PG + Redis + ES + Kafka

[PG] ← 核心資料
[Redis] ← 快取
[ES] ← 搜尋
[Kafka] ← 事件流、服務解耦、異步處理

什麼時候加 Kafka

  • 多個服務之間需要可靠的事件傳遞
  • 每天事件量超過 100 萬筆
  • 需要事件重放(event replay)能力
  • BullMQ / RabbitMQ 已經撐不住

大部分應用永遠不會走到這一步。如果你只有 3-5 個微服務,RabbitMQ 甚至 BullMQ 就夠了。


常見錯誤

錯誤為什麼是錯的正確做法
Day 1 裝 Redis + ES + Kafka維護成本 > 效能收益從 PG only 開始
所有資料都放 Redis記憶體成本爆炸只放熱資料、設 TTL
用 MongoDB 取代 PG讀取只快 4%,失去關聯查詢PG JSONB 就夠
小流量就上 ESES 最少吃 512MB先用 PG pg_trgm
用 Kafka 當 Message Queue殺雞用牛刀小規模用 BullMQ / RabbitMQ

判斷清單

在你決定加任何服務之前,問自己這三個問題:

  1. PG 原生方案試過了嗎? JSONB、pg_trgm、Materialized View、LISTEN/NOTIFY
  2. 瓶頸確認了嗎? 跑過壓測、看過 slow query log、確認真的是這個點
  3. 團隊能維護嗎? 每個服務都需要監控、備份、升級、故障處理

三個都是 Yes 才加。

詳細數據見 [[micro-service/20-storage-redis-es|#20]]、[[micro-service/56-search-mysql-pg-elk|#56]]、[[micro-service/35-event-driven-basics|#57]]



下一篇

Infra 結論:架構模式與部署策略 — 儲存層搞定了,最後看架構和部署。

本系列文章

完整 68 篇目錄見 系列首頁

← 上一篇:DB 結論:資料庫選型與優化優先順序 → 下一篇:Infra 結論:架構模式與部署策略最終推薦