Kafka 核心設計原理
Kafka 核心設計原理
Kafka 設計架構
- Message System -> Streaming Platform (但業界現在仍以Message 爲主 )
- 特點
- 低延遲
- 高吞吐
- 水平擴展 (支持在線擴展)
- 順序性
- 多場景 (離線,實時)
- 架構:
- Producer
- Broker
- Consumer
- Zookeeper (嚴格上說,不屬於Kafka架構,但是爲了支持分佈式集羣,必須使用ZK)
- 在架構設計時,應該保證Consumer的消費能力大於Producer。
- Producer在發送數據時,會有一個待發送隊列(在內存中),達到一定數據量後,批量向Broker推送。
- Topic & Parition & Segment
- Record
- Key - Value
- Timestamp(流處理中使用)
- Topic
- 邏輯概念
- 發佈 - 訂閱 均基於Topic
- Partition
- 一個Topic 包含一個或多個Partition
- 每個Partition 物理上對應一個文件夾
- 均勻分佈在各個Broker上
注: 數據寫入是Append-Only的。有Paper表明,磁盤的順序訪問速度甚至大於內存的隨機訪問速度。
- Segment
- Partition可以認爲是文件夾,Segment就可以認爲是文件。
- 刪除時,刪除Segment,速度較快。
- Producer
- 消息發送
- 同步
- 異步
- 消息順序性
- Queue
- Retry
- 消息路由 - Partition
- 同一用戶採用同一Key,對Key取Hash,就可保證同一用戶的數據都進同一Partition
- Consumer API
- Low Level API / Assign (存在種種問題)
- 指定Partition
- 指定起始消費Offset
- 指定消息長度
- High Level API / Subscribe
- 引入了Consumer Group,解決問題
- Consumer Group
- 以Partition劃分,任何一個Partition只會被一個Consumer消費
- Rebalance
Kafka Rebalance 機制:
- 每加入/刪除一個Consumer,就會觸發Revoke
- 自治式 Rebalance
- 集中式 Rebalance:基於Coordinate
Kafka 高可用原理
- CAP 理論:分佈式系統中,一致性、可用性、分區容忍性最多隻可同時滿足兩個
- 一般分區容忍性都要求有保障,因此很多時候是在可用性與一致性之間做權衡
- ISR (In-Sync Replicas):
- 數據被所有Follower同步後,才Commit
- Follower一定時間不同步數據,會被踢除ISR。
- 當Follower同步速度提升到一定程度,又會被加入ISR中。
- Failover
- 舊主掛掉,隨機選新主。
- 舊主恢復,不會變成Leader。會將自己最後一次Commit之後的數據全部刪除,再同步。
Kafka Consumer Exactly Once
- 兩階段提交
- At least once + 下游冪等處理
- Offset 更新與數據處理放在同一事務中