kafka入門 第六篇 消費者組到底是什么?


消費組,即Consumer Group ,應該算是kafka比較有創意的設計了。那么何謂ConsumerGroup呢?用一句話概括就是:ConsumerGroup是kafka提供的可擴展且具有容錯性的消費者機制。既然是一個組,那么組內必然可以有多個消費者和消費者實列,他們共享一個公共的ID,這個ID被稱為GroupID。組內的消費者協調在一起消費訂閱主題的所有分區。當然,每個分區只能由同一個消費者組內的一個Consumer實列來消費。
ConsumerGroup之間批次獨立,互不影響,他們能訂閱相同的主題而互不干涉。kafka僅僅使用consumer Group這一種機制,卻實現了傳統消息引擎系統的倆大模型:如果所有實列屬於同一個Group,那么它實現的就是消息隊列模型;如果所有實列分別屬於不同的Group,那么他實現的就是發布/訂閱模型。
理想情況下,Group中的Consumer實列的數量應該等於該Group訂閱主題的總分區數。
ConsumerGroup的位移也是提交到Broker中的內部主題中的_consumer_offsets
ConsumerGroup中的consumer實列數在理想情況下是等於訂閱主題的分區總數的。
(Group中的分區只能被一個消費者消費,一個消費者可以消費多個分區)
有三種情況:
1.消費者實列數小於分區數:這種情況會下,一個消費者實列會消費多個分區
2.消費者實列數等於分區數: 一個消費者消費一個分區
3.消費者實列數大於分區數:會有幾個消費者處於空閑的狀態下。
 
從平衡:Rebalance
Rebalance 本質上是一種協議,規定了一個一個ComsumerGroup下的所有Consumer如何達成一致,來分配訂閱主題的分區。比如某個Group下有20個Consumer實列,他訂閱一個具有100個分區的Topic。正常情況下,kafka會平均為每個Consumer分配5個分區。這個分配的過程就叫做Rebalance。
那么時候回會觸發Rebalance?一下三種情況下回觸發:
  1. Group中消費者實列數量發生變化。比如有新的Consumer加入Group,或者有Consumer實列奔潰退出Group
  2. 訂閱的主題數發生變更。ComsumerGroup可以使用正則表達式的方式訂閱主題。
  3. 訂閱主題的分區數發生變更。kafka當前只能允許增加一個主題分區數。當分區數增加時,就會觸發訂閱該主題的所有Group發生Rebalance。
Kafka 新版本 consumer 默認提供 了 3 種分配策略,分別是 range 策略、round-robin 策略和 sticky 策略。
所 謂 的 分 配 策 略 決 定 了 訂 閱 topic 的 每 個 分 區 會 被 分 配 給 哪 個 consumer。
range 策略主要是基於范圍的思想。它將單個 topic 的所有分區 按照順序排列,然后把這些分區划分成固定⼤⼩的分區段並依次分配給每個 consumer;
round-robin 策略則會把所有 topic 的所有分區順序擺開,然后 輪詢式地分配給各個 consumer。
最新發布的 sticky 策略有效地避免了上述 兩種策略完全⽆視歷史分配⽅案的缺陷,采⽤了「有黏性」的策略對所有 consumer 實例進⾏分配, 可以規避極端情況下的數據傾斜並且在兩次 rebalance 間最⼤限度地維持了之前的分配⽅案。
通常意義上認為, 如果 group 下所有 consumer 實例的訂閱是相同, 那么使⽤ round-robin 會帶來更公平的分配⽅案,否則使⽤ range 策略的效 果更好。此外,sticky 策略在 0.11.0.0 版本才被引⼊,故⽬前使⽤的⽤戶並 不多。新版本 consumer 默認的分配策略是 range。⽤戶根據 consumer 參 數 partition.assignment.strategy 來進⾏設置。另外 Kafka ⽀持⾃定義的分 配策略,⽤戶可以創建⾃⼰的 consumer 分配器(assignor)。 針對 rebalance 過程中的分區分配,下⾯舉⼀個簡單的例⼦,加以說 明。假設⽬前某個 consumer group 下有兩個 consumer:A 和 B。當第 3 個 成員 C 加⼊時,滿⾜了前⾯談到的第⼀個觸發條件,因此 coordinator 會執 ⾏ rebalance,並根據 range 分配策略重新為 A、B 和 C 分配分區, 如圖 5.7 所示。 由此可⻅,原先 A 和 B 分別處理 3 個分區的數據,rebalance 之后 A、 B 和 C 各⾃承擔 2 個分區的消費, 可以說這個分配⽅案⾮常公平, 每個 consumer 上的負載是相同的。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM