目錄
- 什么是消費者組?
- 消費者組如何工作?
- 位移(Offset)
- 消費者組的核心機制:重平衡(Rebalance)
- 觸發條件
- 重平衡影響
在消息隊列(如 Kafka)的世界里,消費者組是實現高效消息消費、負載均衡和高可用的核心機制。它并非單個消費者,而是由多個消費者組成的協同群體,能共同處理主題中的消息,既避免重復消費,又能應對流量波動。
什么是消費者組?
消費者組是指共同訂閱同一個主題(Topic) 的多個消費者的集合。每個消費者組都有一個唯一的標識(Group ID),組內的消費者通過協作分工,共同消費主題中的消息。
其核心特點包括:
- 組內消費者共享消費進度,由消息隊列的協調器(Coordinator) 統一管理。
- 主題中的每個分區(Partition) 只能被同一消費者組內的一個消費者消費(避免重復消費)。
- 消費者組之間相互獨立,不同組可以同時消費同一主題的消息(實現多場景消費)。
理想情況下,Consumer 實例的數量應該等于該 Group 訂閱主題的分區總數。
Kafka 僅僅使用 Consumer Group 這一種機制,卻同時實現了傳統消息引擎系統的兩大模型:如果所有實例都屬于同一個 Group,那么它實現的就是消息隊列模型;如果所有實例分別屬于不同的 Group,那么它實現的就是發布 / 訂閱模型。
消費者組如何工作?
消費者組的運行邏輯圍繞 “分區分配” 和 “消費進度同步” 展開,具體流程如下:
- 加入組:新消費者啟動時,會向協調器發送 “加入組” 請求,協調器收集組內所有消費者信息。
- 分配分區:協調器選擇一個消費者作為 “領導者(Leader)”,由其制定分區分配方案(如按范圍分配、輪詢分配等),確保每個分區只分配給組內一個消費者。
- 消費消息:消費者按分配到的分區消費消息,并定期向協調器提交消費偏移量(Offset)(記錄已消費到的位置)。
- 重平衡(Rebalance):當組內消費者數量變化(新增 / 下線)、主題分區數量變化時,協調器會觸發重平衡,重新分配分區,保證消費繼續。
位移(Offset)
消費者在消費的過程中需要記錄自己消費了多少數據,即消費位置信息。在 Kafka 中,這個位置信息有個專門的術語:位移(Offset)。
在新版本的 Consumer Group 中,Kafka 社區重新設計了 Consumer Group 的位移管理方式,采用了將位移保存在 Kafka 內部主題的方法。這個內部主題就是讓人既愛又恨的 __consumer_offsets。
將 Consumer 的位移數據作為一條條普通的 Kafka 消息,提交到 __consumer_offsets 中。可以這么說,__consumer_offsets 的主要作用是保存 Kafka 消費者的位移信息。
消費者組的核心機制:重平衡(Rebalance)
Rebalance 就是讓一個 Consumer Group 下所有的 Consumer 實例就如何消費訂閱主題的所有分區達成共識的過程。在 Rebalance 過程中,所有 Consumer 實例共同參與,在協調者組件的幫助下,完成訂閱主題分區的分配。但是,在整個過程中,所有實例都不能消費任何消息,因此它對 Consumer 的 TPS 影響很大。
觸發條件
重平衡是消費者組應對變化的關鍵機制,但也可能帶來問題,需要重點理解:
- 觸發條件:
- 消費者組內新增或移除消費者(如節點宕機、新實例啟動)。
- 訂閱主題的分區數發生變更。Kafka 當前只能允許增加一個主題的分區數。當分區數增加時,就會觸發訂閱該主題的所有 Group 開啟 Rebalance。
- 訂閱主題數發生變更。Consumer Group 可以使用正則表達式的方式訂閱主題,比如 consumer.subscribe(Pattern.compile(“t.*c”)) 就表明該 Group 訂閱所有以字母 t 開頭、字母 c 結尾的主題。在 Consumer Group 的運行過程中,你新創建了一個滿足這樣條件的主題,那么該 Group 就會發生 Rebalance。
假設目前某個 Consumer Group 下有兩個 Consumer,比如 A 和 B,當第三個成員 C 加入時,Kafka 會觸發 Rebalance,并根據默認的分配策略重新為 A、B 和 C 分配分區,如下圖所示
重平衡影響
重平衡期間,所有消費者會暫停消費,等待 Rebalance 完成。導致消息處理延遲。
頻繁重平衡會嚴重影響消費效率,需盡量避免。