將所有broker(n個)和partition排序
將第i個partition分配到第(i mode n)個broker上
當key為空時,訊息隨機傳送到各個分割槽(各個版本會有不同,有的是採用輪詢的方式,有的是隨機,有的是一定時間內只傳送給固定partition,隔一段時間後隨機換乙個)
用key的ha』sh值對partion個數取模,決定要把訊息傳送到哪個partition上
range 範圍分割槽(預設的)
假如有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多消費了兩個分割槽
roundrobin 輪詢分割槽
把所有的partition和consumer列出來,然後輪詢consumer和partition,盡可能的讓把partition均勻的分配給consumer
假如有3個topic t0(三個分割槽p0-0,p0-1,p0-2),t1(兩個分割槽p1-0,p1-1),t2(四個分割槽p2-0,p2-1,p2-2,p2-3)
有三個消費者:c0(訂閱了t0,t1),c1(訂閱了t1,t2),c2(訂閱了t0,t2)
那麼分割槽過程如下圖所示
分割槽將會按照一定的順序排列起來,消費者將會組成乙個環狀的結構,然後開始輪詢。
p0-0分配給c0
p0-1分配給c1但是c1並沒訂閱t0,於是跳過c1把p0-1分配給c2,
p0-2分配給c0
p1-0分配給c1,
p1-1分配給c0,
p2-0分配給c1,
p2-1分配給c2,
p2-2分配給c1,
p2-3分配給c2
c0: p0-0,p0-2,p1-1
c1:p1-0,p2-0,p2-2
c2:p0-1,p2-1,p2-3
什麼時候觸發分割槽分配策略:
1.同乙個consumer group內新增或減少consumer
2.topic分割槽發生變化
rebalance的執行
kafka提供了乙個角色coordinator來執行。當consumer group的第乙個consumer啟動的時候,他會向kafka集群中的任意一台broker傳送groupcoordinatorrequest請求,broker會返回乙個負載最小的broker設定為coordinator,之後該group的所有成員都會和coordinator進行協調通訊
整個rebalance分為兩個過程jiongroup和sysncjion
joingroup過程
在這一步中,所有的成員都會向coordinator傳送jiongroup請求,請求內容包括group_id,member_id.protocol_metadata等,coordinator會從中選出乙個consumer作為leader,並且把組成員資訊和訂閱訊息,leader資訊,rebanlance的版本資訊傳送給consumer
synchronizing group state階段
組成員向coordinator傳送sysngrouprequet請求,但是只有leader會傳送分割槽分配的方案(分割槽分配的方案其實是在消費者確定的),當coordinator收到leader傳送的分割槽分配方案後,會通過sysngroupresponse把方案同步到各個consumer中
Kafka的分割槽分配策略
用過 kafka 的同學應該都知道,每個 topic 一般會有很多個 partitions。為了使得我們能夠及時消費訊息,我們也可能會啟動多個 consumer 去消費,而每個 consumer 又會啟動乙個或多個streams去分別消費 topic 對應分割槽中的資料。我們又知道,kafka 存在...
詳解Kafka分割槽分配策略
前言 乙個consumer group中有多個consumer,乙個topic有多個partition,所以必然會涉及到partition的分配問題,即確定那個partition由哪個consumer來消費。kafka有兩種分配策略,一是roundrobin,二是range 1.roundrobin...
kafka 訊息的分割槽分配策略
訊息的消費原理 觸發分割槽分配策略的條件 topic 在kafka 中,topic是乙個儲存訊息的邏輯概念,可以認為是乙個訊息的集合。每條訊息傳送到 kafka 集群的訊息都有乙個類別。每個topic可以有多個生產者向他傳送訊息,也可以有多個消費者去消費訊息 partition 每個topic 可以...