kafka消費者分區(qū)分配策略
1、輪詢RoundRobin
一個消費者組有多個消費者,會把一個消費者組里的所有消費者指定的全部主題拿出來,再統(tǒng)一按分區(qū)分配給該組里面的所有消費者進行消費(按照主題名+分區(qū)號排序,輪詢分配給組里的所有消費者)。。也就是說,輪詢策略下,消費者組中的消費者無法特別指定自身要消費的主題。自己指定的主題會被拿出去到整個組中統(tǒng)一分配。自己也會消費到自己沒有指定的主題(不過該主題肯定是由同組的其他消費者指定的)
假設(shè)消費者組G有AB兩個消費者,
有T1 、T2 兩個主題,每個主題都有三個分區(qū),分區(qū)好分別是0,1,2。
其中A指定要消費T1 主題,而B指定要消費T2主題。由于A和B屬于同一個消費者組G,那么G這個組就會消費AUB(A與B的并集)={T1,T2},共兩個主題,六個分區(qū)。
(1)也就是說,RoundRobin會讓消費者組G的所有成員(A和B)一起輪詢消費這六個分區(qū)(T1-0,T1-1,T1-2,T2-0,T2-1,T2-2)。
kafka會把六個分區(qū)按照主題名+分區(qū)號作為hash值進行排序,假設(shè)排序完是T1-0,T1-1,T1-2,T2-0,T2-1,T2-2共六個。
然后按照輪詢分配。。。A分配T1-0 B分配T1-1 A分配T1-2 B分配T2-0 ......
最終:A分配了T1-0 T1-2 T2-1 三個分區(qū)。B則分配了剩下的三個分區(qū)。
(2)這樣就會導致A可能會消費到T2主題的分區(qū),B也可能會消費到T1主題的分區(qū)。而A并沒有指定要消費T2分區(qū),B也沒有指定要消費T1分區(qū)。。這算是一種缺點。。消費到同組的其他消費者所指定的主題分區(qū)數(shù)據(jù)。
由于有以上缺點,kafka沒有把輪詢策略作為默認策略。。而是把range作為默認的,range可以在一個消費者組中單獨為指定消費者設(shè)置要消費的主題。
那么什么情況下使用輪詢分配策略呢?
在同一個消費者組中的所有消費者各自指定要消費的主題都是一樣的情況下,使用輪詢分配更好,不會導致不同消費者之間所消費的分區(qū)數(shù)差距過大(最大差距不會超過1),
而下面的range策略雖然可以讓同一個消費者組的不同消費者各自指定自己要消費的主題,但在同一個消費者組中的所有消費者各自指定要消費的主題都是一樣的情況下,不同的消費者之間被分配的分區(qū)數(shù)可能會差距很大。
好處,同一個消費者組的不同消費者之間所消費的分區(qū)數(shù)量相差最大不會超過1。
缺點,就是一個消費者組中的消費者各自指定消費的主題并不會由這個消費者消費,而是拿出來作為整個組要消費的主題。
2、range策略
會按照主題來進行分配。一個主題的分區(qū)分配完了,再繼續(xù)分配下一個主題。
分配規(guī)則:同一個消費者組有哪些成員指定了相同的主題,則由這些成員去消費該主題的分區(qū)。其他未指定該主題的成員不會消費到這個主題。
分區(qū)分配方式:假設(shè)一個主題分區(qū)為0~6共7個分區(qū),然后在同一個消費者組中有兩個消費者(B、D)消費該主題。
在同一個組內(nèi)的消費者也會有排序的,按先后順序分配消費的分區(qū),這里假設(shè)順序是B、D,那么靠前的獲取比較多的分區(qū)數(shù),靠后的獲取較少的分區(qū)數(shù)。。并且分區(qū)分配不是輪詢了,而是按范圍分配相鄰的分區(qū)。。。那么7個分區(qū)兩個消費者,7/2向下取整等于3,則按消費者順序分配,B會分配4個分區(qū),D會分配3個分區(qū),然后是按范圍分配相鄰的給同一個消費者,則B會分到0~3這四個分區(qū),D分到4~6這三個。
按上面的情況,假設(shè)B和D又同時一起指定要消費另一個主題,這個主題也有7個分區(qū)。。那么還是按上面的規(guī)則。。B又拿到0~4分區(qū),D又拿到4~6分區(qū)。。。此時B有8個分區(qū)要消費,而D只有6個。當B和D同時指定的主題數(shù)越多,他們倆所消費的分區(qū)數(shù)差距就會越來越大。。這就是range的缺點。
具體舉個例子(如果根據(jù)上面的描述就懂了,可以跳過該例子):
假設(shè)有主題T1和T2和T3,各自三個分區(qū)(0,1,2)。
消費者組G,有兩個消費者A和B。
其中A指定要消費T1和T2,B要消費T2和T3.
那么按照每個主題,一個主題一個主題分配給A和B進行消費。
即假設(shè)按照T1 T2 T3的順序來。
(1)先分配主題T1,由于T1只有A消費,那么就直接T1-0,T1-1,T1-2都分配給A消費了。
(2)然后分配主題T2,T2有A和B一起消費,A和B屬于同一個消費者組,是Range策略。。。
那么T2-0,T2-1,T2-2三個分區(qū)中,會按照輪詢規(guī)則把三個分區(qū)分配給A和B兩個消費者。A可能分配到兩個分區(qū),B可能分配到1額分區(qū)。
(3)最后分配T3主題,由于只有B消費,所有T3全部分區(qū)都分配給B消費。
缺點,就是當同一個消費者組的多個消費者消費的主題相同,并且消費的相同主題比較多時,按照上面步驟(2)的情況,可能會導致消費者A消費十個分區(qū),而消費者B只消費了五個分區(qū),這樣不平衡。
但好處在于,同一個消費者組的不同消費者可以指定自己單獨需要消費的主題。。只有當其他消費者與當前消費者指定的主題相同時,才會一起分配這個主題的不同分區(qū)。
