Kafka之消費者分區分配策略

前言

之前的一篇博客寫的是Kafka基礎瞭解一下(附上超鏈接,可以點進去看看)對Kafka簡單介紹了一下。既然我們知道消費者組會協調去消費Topic下的partition,那麼它是如何去協調的,是不是也要去了解了解。

簡介

Kafka的分區實際上繼承了一個接口AbstractPartitionAssignor,而這個接口下有兩個實現的類,實現了RoundRobinAssignor和RangeAssignor兩種算法。

RoundRobinAssignor

RoundRobin是輪詢算法,它會將所有的TopicPartition統一進行分配。如下面的圖一樣,第一個partition給到consumer1,第二個Partition給到consumer2,以此類推,循環着依次分配。

RangeAssignor

它與前面那個算法不同的是,它是針對每一個Topic單獨進行分配。就像下圖一樣,它會針對每一個Topic下的Partition數量與Consumer來進行劃分。
這裏我們將Topic下的Partition數量記爲p,消費者組裏的消費者數量記爲c。
(1)p/c求出每個消費者最少可以得到多少個分區,例如這裏的Topic01爲3, 3/2=1,則c1和c2最少可以獲得一個分區。
(2)p%c求出有多少個消費者可以多獲取一個分區,再對消費者進行輪詢,3%2=1,則只有一個消費者可以多獲取一個,那麼通過輪詢c1得到多一個。
(3)依次對各個Topic進行1、2兩步,將所得到的結果相加,就能得到各消費者所消費的分區了。
在這裏插入圖片描述

對比這兩種方法,我們可以看出,第二種算法是存在漏洞的,僅僅看一個Topic可能會造成前幾個消費者比後面的多消費一個分區,但是如果消費者組去消費很多個Topic呢?就導致了前幾個消費者比後面的多消費很多分區,這樣的話就不能充分利用資源。所以現在一般都摒棄了第二種算法,採用第一種,大家可以思考一下,它最後就算是分區不是平均分配,那也就只多出一個分區。

									 summed up by JiaMingcan
									 轉載請署名:JiaMingcan
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章