將所有broker(n個)和partition排序
將第i個partition分配到第(i mode n)個broker上
當key和partition都為空時,訊息隨機傳送到各個分割槽(各個版本會有不同,有的是採用輪詢的方式,有的是隨機,有的是一定時間內只傳送給固定partition,隔一段時間後隨機換乙個)
當partition空,單key不為空時,用key的ha』sh值對partion個數取模,決定要把訊息傳送到哪個partition上
當key和partition都不為空時,只會根據partition傳送到對應的partition上
當key為空、partition不為空時,根據partition傳送到指定的partition上
1.rangepartitionassignor(預設):
針對每乙個topic:
n = 分割槽數/消費者數量
m = 分割槽數%消費者數量
前m個消費者每個分配n+1個分割槽,後面的 (消費者數量-m)個消費者每個分配n個分割槽
假如有10個分割槽,3個消費者,把分割槽按照序號排列0,1,2,3,4,5,6,7,8,9;消費者為c1,c2,c3,那麼用分割槽數除以消費者數來決定每個consumer消費幾個partition,除不盡的前面幾個消費者將會多消費乙個
最後分配結果如下
c1:0,1,2,3
c2:4,5,6
c3:7,8,9
如果有11個分割槽將會是:
c1:0,1,2,3
c2:4,5,6,7
c3:8,9,10
假如我們有兩個主題t1,t2,分別有10個分割槽,最後的分配結果將會是這樣:
c1:t1(0,1,2,3) t2(0,1,2,3)
c2:t1(4,5,6) t2(4,5,6)
c3:t1(7,8,9) t2(7,8,9)
在這種情況下,c1多消費了兩個分割槽
2.roundrobinassignor:
將所有的topic和partition按照字典順序排序,然後對每個consumer進行輪詢分配
roundrobin策略針對於全域性所有的topic和消費者,分配步驟如下:
1. 消費者按照字典排序,例如c0, c1, c2… …,並構造環形迭代器。
2. topic名稱按照字典排序,並得到每個topic的所有分割槽,從而得到所有分割槽集合。
3. 遍歷第2步所有分割槽集合,同時輪詢消費者。
4. 如果輪詢到的消費者訂閱的topic不包括當前遍歷的分割槽所屬topic,則跳過;否則分配給當前消費者,並繼續第3步。
所以對於某個topic來說:
如果有5個分割槽(p0, p1, p2, p3, p4),且訂閱這個topic的消費者組有2個消費者(c0, c1)。那麼p0, p2, p4將被c0消費,p1, p3將被c1消費。
roundrobin策略如下圖所示:
如圖所示:
3個topic:t0(3個分割槽0, 1, 2), t1(兩個分割槽0, 1), t2(4個分割槽0, 1, 2, 3);
3個consumer: c0訂閱了[t0, t1], c1訂閱了[t1, t2], c2訂閱了[t2, t0];
roundrobin結果分配結果如下:
t0-p0分配給c0,t0-p1分配給c2,t0-p2分配給c0,
t1-p0分配給c1,t1-p1分配給c0,
t2-p0分配給c1,t2-p1分配給c2,t2-p2分配給c1,t0-p3分配給c2;
推算過程:
分割槽t0-p0,消費者c0,c0訂閱了這個分割槽所在topic即t0,所以t0-p0分配給c0;
輪詢到下乙個分割槽t0-p1和下乙個消費者c1;
分割槽t0-p1,消費者c1,c1沒有訂閱t0,取下乙個消費者c2,c2訂閱了t0,所以t0-p1分配給c2;
輪詢到下乙個分割槽t0-p2和下乙個消費者c0;
分割槽t0-p2,消費者c0,c0訂閱了t0,所以t0-p2分配給c0;
輪詢到下乙個分割槽t1-p0和下乙個消費者c1;
分割槽t1-p0,消費者c1,c1訂閱t1,所以t1-p0分配給c1;
以此類推即可。
3.自定義分配策略:實現abstractpartitionassignor類的assign()方法
將全部n broker和待分配的i個partition排序.
將第i個partition分配到第(i mod n)個broker上.
將第i個partition的第j個副本分配到第((i + j) mod n)個broker上.
reblance本質上是一種協議,規定了乙個consumer group下的所有的consumer如何達成一致來分配訂閱topic的每個partition。比如某個group下有5個consumer,它訂閱了乙個具有10個分割槽的topic。正常情況下,kafka平均會為每個consumer分配2個分割槽。這個分配的過程就叫rebalance。
rebalance的觸發條件:
1.有新的消費者加入consumer group
2.有消費者下線,可能由於長時間未向groupcoordinator(協調者)傳送心跳,groupcoordinator會認為其已下線
3.有消費者主動退出consumer group
4.訂閱的topic分割槽出現變化
5.呼叫unsubscribe()取消對某topic的訂閱
即consumer或者topic自身發生變化時,會觸發rebalance。
kafka的分割槽分配策略
將所有broker n個 和partition排序 將第i個partition分配到第 i mode n 個broker上 當key為空時,訊息隨機傳送到各個分割槽 各個版本會有不同,有的是採用輪詢的方式,有的是隨機,有的是一定時間內只傳送給固定partition,隔一段時間後隨機換乙個 用key的...
Kafka的分割槽分配策略
用過 kafka 的同學應該都知道,每個 topic 一般會有很多個 partitions。為了使得我們能夠及時消費訊息,我們也可能會啟動多個 consumer 去消費,而每個 consumer 又會啟動乙個或多個streams去分別消費 topic 對應分割槽中的資料。我們又知道,kafka 存在...
詳解Kafka分割槽分配策略
前言 乙個consumer group中有多個consumer,乙個topic有多個partition,所以必然會涉及到partition的分配問題,即確定那個partition由哪個consumer來消費。kafka有兩種分配策略,一是roundrobin,二是range 1.roundrobin...