前一篇 講 message queue 的演進 timeline——從 ActiveMQ 到 NATS 每一代解什麼極限。這篇接著講判斷依據

  • 什麼具體 case 推著團隊從 RabbitMQ 改 Kafka?
  • 什麼 case 反而會從 Kafka 改回 RabbitMQ / Redis Streams?
  • 沒撞到對應極限就換 broker,會付出什麼成本?

這不是抽象比較,是「我該不該動 broker」的決策框架。


換 broker 的真實成本

開頭先講為什麼換 broker 是一個大決定

  • 應用層改寫:producer / consumer 的 client library 換、訊息格式可能要調、ack 機制不同
  • 訊息保證模型重學:RabbitMQ 的「ack 機制 + DLQ」跟 Kafka 的「offset commit + Consumer Group」mental model 完全不同
  • 運維鏈路重做:監控指標、alert rule、disaster recovery、容量規劃全部要重寫
  • 團隊重訓:所有 engineer 都要重新學

不是隨便就能換的。所以選錯成本高,有 case-by-case 的判斷依據才能少走冤枉路。


從 RabbitMQ 改 Kafka 的真實 driver

這幾個訊號出現了,你的場景才真的需要 Kafka:

Driver 1:Throughput 撞 RabbitMQ 的 disk I/O 極限

具體數字:單個 RabbitMQ broker(中型機器)能穩定處理約 20-50K msg/s。超過這個範圍會看到 disk I/O 飽和、memory 用爆、ack latency 上升。

什麼 case 會撞這個:

  • 大型網站的 user activity tracking(每秒幾十萬使用者操作)
  • 物聯網 / 監控系統 telemetry(千萬 device 各自上報)
  • 日誌聚合(k8s cluster 的全部容器 log)

到了這個量級,Kafka 的 sequential disk write + zero-copy 讓單機到 100K-1M msg/s 不費力。這是真正非 Kafka 不可的場景。

Driver 2:需要重新消費歷史訊息

RabbitMQ 是「ack 之後刪除」的設計。雖然它有 lazy queue / persistence,但**「Consumer 從一週前 offset 開始重新讀」這個 use case 在 RabbitMQ 上幾乎做不到**。

什麼 case 需要這個:

  • 新加一個 downstream service(例如新增搜尋 index),需要讀過去所有事件補資料
  • 偵錯:某個 downstream 處理錯了,要從 offset N 開始重跑
  • 資料倉儲 ETL:每天從 message stream 重新抓昨天的資料

Kafka 的 log-based 模型 + retention period(可配置幾天到永久)天生支援這個。RabbitMQ 換 Kafka 經常就是被這個 driver 推的。

Driver 3:多 consumer group 各自獨立 fan-out

RabbitMQ 用 fanout exchange + 多個 queue 也能 fan-out,但每個 queue 是獨立資源——你想加第 4 個 consumer group 就要建第 4 個 queue + 重新從上游 publish 進來。

Kafka 的設計是「同一個 topic、多個 consumer group 各自有自己的 offset」——加 consumer group 不需要動 producer、不需要動 topic。這個對「事件被多個 downstream 消費」的場景天生友善。

什麼 case 觸發:

  • Event-driven architecture(一個事件多個 service 各自反應)
  • 大型 SaaS 的 user.created 事件被 marketing / billing / analytics / notification 同時消費

Driver 4:需要跟大數據生態整合

Kafka 跟 Spark / Flink / Hadoop / 各種 sink connector 是緊密生態的一員。RabbitMQ 整合這些工具要寫一堆 glue code。

什麼 case 觸發:

  • 公司開始建 data warehouse / lakehouse,需要從 message stream 抓資料
  • 即時分析需求(Flink stream processing)

反方向:從 Kafka 改回 RabbitMQ / Redis Streams 的 case

這個方向更少人講,但實際上 2022+ 越來越多——因為很多公司當年盲目跟 Kafka,後來發現用不到

Driver 1:實際 throughput 遠低於 Kafka 的 sweet spot

具體數字:Kafka 真正的 sweet spot 是 50K msg/s 以上。如果你的實際 throughput 是 1K-10K msg/s——

  • Kafka 的 partitioning / consumer rebalance 機制變成 cognitive overhead
  • ZooKeeper / KRaft 運維成本完全不對等
  • Latency 反而比 RabbitMQ 差(Kafka 為 throughput 優化,輕量 case p99 經常 10-50ms,RabbitMQ 1-5ms)

換回 RabbitMQ 之後:運維簡單、p99 降低、團隊心智負擔下降。

Driver 2:Routing 邏輯複雜,Kafka topic-only 模型不夠用

Kafka 的訊息路由是「producer 寫進 topic / partition、consumer 訂閱 topic」——非常簡單,但如果你需要 conditional routing(這個訊息要進 queue A 而不是 queue B、根據 routing key 動態決定),Kafka 要在 consumer 層自己寫 filter。

RabbitMQ 的 Topic Exchange / Direct Exchange / Header Exchange 三種 routing 模式,broker 層就能處理 conditional routing——對 routing 複雜的場景簡單一個級距。

什麼 case 觸發:

  • E-commerce 的 order 事件,根據國家 / 地區走不同處理 pipeline
  • Notification 系統的 channel routing(email / SMS / push 各走各的 queue)

Driver 3:團隊規模 / 知識結構不適合 Kafka

Kafka 的 mental model(partition / offset / consumer group / rebalance / replication factor)對小團隊是真實負擔。5 人的 backend team 用 Kafka 的維護成本,可能比業務本身還貴

什麼 case 觸發:

  • 早期 startup
  • 中型公司但 backend team 規模沒大
  • 沒有專職 SRE / Platform team

換成 RabbitMQ 或 Redis Streams 之後,運維 surface 大幅縮小。

Driver 4:Latency 敏感場景

Kafka 不是低延遲架構——它為 throughput 優化。如果你的 use case 需要 p99 < 5ms——

  • 即時 bidding(廣告競標)
  • 即時遊戲訊息
  • 高頻 trading 訊號

Kafka 通常達不到。RabbitMQ 或 NATS 能做到。

我自己 local docker 跑過 4 個 broker 的對比 bench(HTTP load test, 1000 events/broker),latency 排序是 NATS(p50 7.9ms)< Redis(7.71ms)< RabbitMQ(9.58ms)< Kafka(10.76ms)。Kafka 比 NATS 慢 36%——而這還是 Kafka 在 single-broker / 沒競爭資源的最佳狀態。Production 高負載下 Kafka latency gap 通常更大。詳見 #14 Broker 選型 「我自己跑了一輪」段。


沒撞到極限就換 broker 的代價

「我們公司也用 Kafka」這種同儕壓力導致的選型最常見也最痛。沒撞到對應 driver 就換 broker,會付出:

  • 完整重寫 producer / consumer code(少則一週多則一個月)
  • 運維鏈路重做(監控 / alert / 容量規劃)
  • 團隊重訓(所有 engineer 都要學新 mental model)
  • debug 變慢(半年內團隊對新 broker 不夠熟)

這些成本沒有對應的 leverage 回報的話,是純損失

判斷準則:

「如果我的場景沒撞到當前 broker 的具體極限——換新 broker 是 cost、不是 leverage。」


決策樹

你目前用什麼?
│
├─ RabbitMQ
│   ├─ 撞了 throughput / 重新消費 / fan-out / 大數據生態 → 評估 Kafka
│   └─ 沒撞牆 → 不要動
│
├─ Kafka
│   ├─ 實際 throughput < 10K msg/s → 評估 RabbitMQ / Redis Streams
│   ├─ Routing 複雜 broker 層處理不了 → 評估 RabbitMQ
│   ├─ Latency p99 > 10ms 影響業務 → 評估 NATS / RabbitMQ
│   ├─ 團隊維運成本壓垮 → 評估 RabbitMQ / managed Kafka(Confluent / MSK)
│   └─ 撞 Kafka 自己的極限沒解 → 留下,調整或上 managed
│
└─ 其他(Redis Streams / NATS / managed)
    └─ 大致跟著場景走,撞牆才換

反思

換 broker 的根本判準不是「哪個比較好」,是「我目前的 broker 撞了什麼極限」。

撞了極限就換、沒撞就不要動。Kafka 不是強者宣言,是特定場景的解。RabbitMQ 不是過時,是 general-purpose 場景的常駐選擇。「現在我們公司都用 Kafka」不是技術決策,是 cargo cult。

下一篇講具體選型——把場景 → broker 的對應整理成 cheat sheet,10 分鐘做出判斷。