1. 程式人生 > >kafka分割槽(partition)和和分組(group)

kafka分割槽(partition)和和分組(group)

下面是自己在使用過程中的總結。歡迎拍磚

每個consumer只能消費指定的幾個分割槽。那麼訊息如果沒有發到監聽的分割槽,那麼那個消費者就不能獲取到這次傳送的訊息。

下面的例子一定要注意對分割槽和分組的理解,不然會不知道為什麼會得出那樣的結論
消費組中的消費者會怎麼取kafka的資料,看下方的介紹----來自網路

1.其中 broker有兩個,也就是伺服器有兩臺。
2.partition有6個,按照雜湊取模的演算法分配。
3.消費者有8個,他們屬於同一個消費組

那麼這一個消費組中的消費者會怎麼取kafka的資料呢? 
其實kafka的消費端有一個均衡演算法,演算法如下:

1.A=(partition數量/同分組消費者總個數) 
2.M=對上面所得到的A值小數點第一位向上取整 
3.計算出該消費者拉取資料的patition合集:Ci = [P(M*i ),P((i + 1) * M -1)]

A=6/8=0.75
M=1

C0=[P(1*0),P((0+1)*1-1)]=[P0,P0] 
同理:
C1=[P(1*1),P((1+1)*1-1)]=[P1,P1] 
C2=[P(1*2),P((2+1)*1-1)]=[P2,P2] 
C3=[P(1*3),P((3+1)*1-1)]=[P3,P3] 
C4=[P(1*4),P((4+1)*1-1)]=[P4,P4] 
C5=[P(1*5),P((5+1)*1-1)]=[P5,P5] 
C6=[P(1*6),P((6+1)*1-1)]=[P6,P6] 
C7=[P(1*7),P((7+1)*1-1)]=[P7,P7]

那麼按照上面的演算法: 
C0消費者消費P0的資料 
C1消費者消費P1的資料 
C2消費者消費P2的資料 
C3消費者消費P3的資料 
C4消費者消費P4的資料 

C5消費者消費P5的資料

C6消費者消費P6的資料 
C7消費者消費P7的資料

但是partition只有P0-P5根本就沒有P6和P7,所以這兩個消費者相當於是會被閒置的,就相當於佔用資源,卻沒什麼用,所以在這裡真正起到作用的就是C0-C5。
如果這個消費組裡面的消費者少於partition數量呢(比如5個)?
那麼還是依葫蘆畫瓢,根據上面的演算法:

A=6/5=1.2 
M=2
C0=[P(2*0),P((0+1)*2-1)]=[P0,P1] 
C1=[P(2*1),P((1+1)*2-1)]=[P2,P3] 
C2=[P(2*2),P((2+1)*2-1)]=[P4,P5]

C3=[P(2*3),P((3+1)*2-1)]=[P6,P7] 
C4=[P(2*4),P((4+1)*2-1)]=[P8,P9]

同上面一樣C3和C4沒有起到任何作用。

總結:
1.按照如上的演算法,所以如果kafka的消費組需要增加組員,最多增加到和partition數量一致,超過的組員只會佔用資源,而不起作用;

2.kafka的partition的個數一定要大於消費組組員的個數,並且partition的個數對於消費組組員取模一定要為0,不然有些消費者會佔用資源卻不起作用;

3.如果需要增加消費組的組員個數,那麼也需要根據上面的演算法,調整partition的個數

通過上面的介紹可以知道。針對一個分組中分割槽和消費者實際是有對應關係的。不是說增加了分割槽,就一定可以增加併發。具體情況需要多多分析。

注意:消費組就是group.id不同。kafka中,同一個topic下,訊息會給下面每一個group傳送訊息(如果有十個,那個這十個group都會接受到這個訊息)。但是分割槽每個訊息只有一個分割槽獲取。