設計分散式訊息佇列 (Distributed Message Queue)

Hard★★★★★Draft

FromSystem Design Interview

Concepts practiced📨 訊息佇列 (Message Queue)📨 發布/訂閱與訊息模型 (Pub/Sub & Delivery)📨 串流處理 (Stream Processing)🧩 複製 (Replication)🧩 分片 (Partitioning / Sharding)🛡️ 冪等設計 (Idempotency)

Convention: read the requirements & constraints first, sketch your own design, then expand the reference to compare.

📚 From the Books

設計分散式訊息佇列 (Distributed Message Queue)ProblemHardRealtime

設計一個支援長期保存、可重複消費的分散式訊息佇列(Kafka 這類事件串流平台的能力)。難點在於:吞吐(靠 partition 水平擴展)、耐久(靠複製)、傳遞語意(at-most / at-least / exactly-once 可設定)三者要同時成立。

📋 Requirements

🧠 Core Ideas

TIP

topic / partition / broker / consumer group 這組原語(見發布訂閱):topic 切成多個 partition 分散到 broker → 吞吐可擴展;每個 partition 是一條可持久化的 append-only log;consumer group 各自維護 offset,group 間扇出、group 內一 partition 給一 consumer。

⚖️ Reference Design

儲存:WAL + segment
  • 訊息以 WAL(write-ahead log) 持久化:append-only、純循序讀寫,充分利用磁碟循序效能與 OS 快取。
  • 每則訊息附單調遞增 offset;日誌切成 segment,只寫 active segment,舊 segment 轉唯讀、超過保存期就截斷。
  • 訊息從 producer → 佇列 → consumer 全程不改,最小化複製;偏好 batching(小型 I/O 是高吞吐大敵)。
Producer / Consumer flow
  • Producer 把 routing 與 buffer 包進 client library:路由到 partition 的 leader replica、記憶體緩衝後以大批次送 → 降延遲、提吞吐。
  • Consumer 多選 pull 模型(自己控速、適合批次),空拉用 long polling 解。
  • Consumer rebalancing:coordinator(某 broker)收 heartbeat、管 offset;consumer 增減/崩潰時選 group leader 產生 partition 分派計畫並廣播。
複製與傳遞語意
  • 每個 partition 多複本,leader 收寫、follower 拉取;ISR(in-sync replicas) 是與 leader 同步的複本集。
  • ACK=all / 1 / 0 是耐久性換延遲的旋鈕(見複製)。
  • 傳遞語意:at-most once(可能丟)、at-least once(可能重複,靠 idempotency 去重)、exactly-once(最難、金融場景)。詳見串流處理的容錯段。
協調與擴展
  • ZooKeeper / etcd 存 metadata(topic 設定、複本分佈)與 consumer state(offset),並做 broker leader election。
  • 增加 partition 直接了當(舊訊息留舊 partition,新訊息分佈到全部);減少 partition 複雜——被除役的 partition 要等保存期過才截斷。
  • 進階:訊息過濾放 metadata/tag(別讓 broker 解 payload、尤其含敏感資料時)、延遲/排程訊息用專用延遲佇列或階層式時間輪。

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading