Kafka學習筆記 -- 讀取資料
消費者從屬於消費者群組。一個群組裡的消費者 訂閱的是同一個主題 , 每個消費者接收主題一部分分割槽的訊息
消費者橫向擴充套件
1個消費者
- 主題T1有4個分割槽,然後建立消費者C1,C1是消費者群組G1裡唯一的消費者,C1訂閱T1
- 消費者C1將接收主題T1的全部4個分割槽的訊息
2個消費者
- 如果群組G1新增一個消費者C2,那麼每個消費者將 分別從兩個分割槽接收訊息
- 假設C1接收分割槽0和分割槽2的訊息,C2接收分割槽1和分割槽3的訊息
4個消費者
- 如果群組G1有4個消費者,那麼每個消費者可以分配到一個分割槽
5個消費者
- 如果群組G1有5個消費者, 超過主題的分割槽數量 ,那麼有1個消費者就會被 閒置 ,不會接收到任何訊息
總結
- 往群組裡增加消費者是 橫向伸縮消費能力 的主要方式
- 消費者經常會做一些高延遲的操作,比如把資料寫到資料庫或HDFS,或者使用資料進行比較耗時的計算
- 有必要 為主題建立大量的分割槽 ,在負載增長時可以加入更多的消費者
- 不要讓 消費者的數量超過主題分割槽的數量 ,多餘的消費者只會被 閒置
消費者群組橫向擴充套件
- Kafka設計的主要目標之一,就是要讓Kafka主題裡的資料能夠滿足企業各種應用場景( 不同的消費者群組 )的需求
- 在這些場景裡,每個應用程式可以獲取到 所有的訊息 ,而不只是其中的一部分
- 只要保證每個應用程式有自己的消費者群組,就可以讓它們獲取到主題所有的訊息
- 不同於傳統的訊息系統, 橫向伸縮Kafka消費者和消費者群組並不會對效能造成負面影響
消費者群組+分割槽再均衡
分割槽再均衡
- 分割槽再均衡: 分割槽的所有權從一個消費者轉移到另一個消費者
- 分割槽再均衡非常重要,它為消費者群組帶來了 高可用性 和 伸縮性 (可以放心地新增或移出消費者)
- 在分割槽再均衡期間, 消費者無法讀取訊息 ,造成整個群組一小段時間內不可用
- 當分割槽被重新分配給另一個消費者時,消費者當前的讀取狀態會丟失,它有可能需要去重新整理快取,在它重新恢復狀態之前會拖慢應用程式
心跳
- 消費者通過向被指派為 群組協調器 的Broker( 不同的群組可以有不同的協調器 )傳送 心跳 來維持它們 和群組的從屬關係 以及它們 對分割槽的所有權關係
- 只要消費者以 正常的時間間隔 傳送心跳,就被認為是 活躍 的,說明它還在讀取分割槽裡的訊息
- 消費者傳送心跳的時機
- 輪詢訊息 (為了獲取訊息)
- 提交偏移量
- 如果消費者停止傳送心跳的時間足夠長,會話就會過期,群組協調器認為它已經死亡,就會觸發一次再均衡
- 如果一個消費者發生崩潰,並停止讀取訊息,群組協調器會等待幾秒鐘,確認它死亡了才會觸發再均衡
- 在這幾秒的時間內,死掉的消費者不會讀取分割槽裡的訊息
- 在清理消費者時,消費者會 通知 協調器它將要離開群組,協調器會 立即 觸發一次再均衡,儘量 降低處理停頓