Range范圍分配策略是Kafka默認的分配策略,它可以確保每個消費者消費的分區數量是均衡的。注意:Rangle范圍分配策略是針對每個Topic的。
配置
配置消費者的partition.assignment.strategy為org.apache.kafka.clients.consumer.RangeAssignor。
算法公式
n = 分區數量 / 消費者數量
m = 分區數量 % 消費者數量
前m個消費者消費n+1個
剩余消費者消費n個
RoundRobin輪詢策略
RoundRobinAssignor輪詢策略是將消費組內所有消費者以及消費者所訂閱的所有topic的partition按照字典序排序(topic和分區的hashcode進行排序),然后通過輪詢方式逐個將分區以此分配給每個消費者。
配置
配置消費者的partition.assignment.strategy為org.apache.kafka.clients.consumer.RoundRobinAssignor。
Stricky粘性分配策略
從Kafka 0.11.x開始,引入此類分配策略。主要目的:
1. 分區分配盡可能均勻
2. 在發生rebalance的時候,分區的分配盡可能與上一次分配保持相同
沒有發生rebalance時,Striky粘性分配策略和RoundRobin分配策略類似。
上面如果consumer2崩潰了,此時需要進行rebalance。如果是Range分配和輪詢分配都會重新進行分配,例如:
通過上圖,我們發現,consumer0和consumer1原來消費的分區大多發生了改變。接下來我們再來看下粘性分配策略。
我們發現,Striky粘性分配策略,保留rebalance之前的分配結果。這樣,只是將原先consumer2負責的兩個分區再均勻分配給consumer0、consumer1。這樣可以明顯減少系統資源的浪費,例如:之前consumer0、consumer1之前正在消費某幾個分區,但由于rebalance發生,導致consumer0、consumer1需要重新消費之前正在處理的分區,導致不必要的系統開銷。(例如:某個事務正在進行就必須要取消了)