設計一個支援長期保存、可重複消費的分散式訊息佇列(Kafka 這類事件串流平台的能力)。難點在於:吞吐(靠 partition 水平擴展)、耐久(靠複製)、傳遞語意(at-most / at-least / exactly-once 可設定)三者要同時成立。
📋 Requirements
- 功能:producer 送訊息、consumer 消費;訊息可重複消費或只消費一次;歷史資料可截斷;訊息 KB 級;能依加入順序傳遞;傳遞語意可設定。
- 非功能:可設為高吞吐或低延遲;可擴展、分散式;持久(落盤 + 跨節點複製)。
🧠 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
- 吞吐靠 partition 水平擴展、耐久靠複製 + ISR/ACK、順序靠 partition 內 FIFO + message key。
- 底層用 WAL + segment 吃循序磁碟效能;producer 端 batching、consumer 端 pull + long polling。
- 傳遞語意是遺失 vs 重複 vs 成本的取捨;能去重就 at-least-once + 冪等。
- 這題把 messaging 類的 發布訂閱、串流處理、複製、分片串成一個完整設計。
No notes yet — jot your takeaways or Q&A here.