kafka 生產端指定分割槽和消費端分割槽指派

2021-10-06 07:31:47 字數 2072 閱讀 3388

生產端指定分割槽

主要依靠分配器,對於kafka預設分配器,主要工作流程:

1 如果訊息自帶key則對key可以hash然後選擇目標分割槽;

2 如果訊息無key則採用roundrobin輪詢演算法,這樣可以最大限度確保訊息在所有分割槽的均勻性;

3 特別的,生產者api賦予使用者自行指定分割槽的權利,在傳送訊息時如果指定了分割槽則可以跳過以上分割槽法則。

消費端分割槽指派

在 kafka 中,存在著兩種為消費組組內的消費者分割槽的分配策略。一種是 rangeassignor 分配策略(範圍分割槽),另一種是 roundrobinassignor分配策略(輪詢分割槽)。預設採用 range 範圍分割槽。 kafka提供了消費者客戶端引數 partition.assignment.strategy 用來設定消費者與訂閱主題之間的分割槽分配策略。

1.1 rangeassignor 範圍分割槽

range 範圍分割槽策略是對每個 topic 而言的。首先對同乙個 topic 裡面的分割槽按照序號進行排序,並對消費者按照字母順序進行排序。假如現在有 10 個分割槽,3 個消費者,排序後的分割槽將會是0,1,2,3,4,5,6,7,8,9;消費者排序完之後將會是c1-0,c2-0,c3-0。通過 partitions數/consumer數 來決定每個消費者應該消費幾個分割槽。如果除不盡,那麼前面幾個消費者將會多消費 1 個分割槽。

c1-0 消費 0 1 2 3

c2-0 消費 3 5 6

c3-0 消費 7 8 9

range 範圍分割槽的弊端:

如上,只是針對 1 個 topic 而言,c1-0消費者多消費1個分割槽影響不是很大。如果有 n 多個 topic,那麼針對每個 topic,消費者 c1-0 都將多消費 1 個分割槽,topic越多,c1-0 消費的分割槽會比其他消費者明顯多消費 n 個分割槽。這就是 range 範圍分割槽的乙個很明顯的弊端了

.2 roundrobinassignor 輪詢分割槽

roundrobin 輪詢分割槽策略,是把所有的 partition 和所有的 consumer 都列出來,然後按照 hascode 進行排序,最後通過輪詢演算法來分配 partition 給到各個消費者。

輪詢分割槽分為如下兩種情況:①同一消費組內所有消費者訂閱的訊息都是相同的    ②同一消費者組內的消費者訂閱的訊息不相同  

①如果同一消費組內,所有的消費者訂閱的訊息都是相同的,那麼 roundrobin 策略的分割槽分配會是均勻的。

例如:同一消費者組中,有 3 個消費者c0、c1和c2,都訂閱了 2 個主題 t0  和 t1,並且每個主題都有 3 個分割槽(p0、p1、p2),那麼所訂閱的所以分割槽可以標識為t0p0、t0p1、t0p2、t1p0、t1p1、t1p2。最終分割槽分配結果如下:

消費者c0    消費 t0p0 、t1p0 分割槽

消費者c1    消費 t0p1 、t1p1 分割槽

消費者c2    消費 t0p2 、t1p2 分割槽

②如果同一消費者組內,所訂閱的訊息是不相同的,那麼在執行分割槽分配的時候,就不是完全的輪詢分配,有可能會導致分割槽分配的不均勻。如果某個消費者沒有訂閱消費組內的某個 topic,那麼在分配分割槽的時候,此消費者將不會分配到這個 topic 的任何分割槽。

例如:同一消費者組中,有3個消費者c0、c1和c2,他們共訂閱了 3 個主題(但每個訂閱的不一樣):t0、t1 和 t2,這 3 個主題分別有 1、2、3 個分割槽(即:t0有1個分割槽(p0),t1有2個分割槽(p0、p1),t2有3個分割槽(p0、p1、p2)),即整個消費者所訂閱的所有分割槽可以標識為 t0p0、t1p0、t1p1、t2p0、t2p1、t2p2。具體而言,消費者c0訂閱的是主題t0,消費者c1訂閱的是主題t0和t1,消費者c2訂閱的是主題t0、t1和t2,最終分割槽分配結果如下:

消費者c0    消費 t0p0

消費者c1    消費 t1p0 分割槽

消費者c2    消費 t1p1、t2p0、t2p1、t2p2 分割槽

roundrobin輪詢分割槽的弊端:

從如上例項,可以看到roundrobin策略也並不是時分完美,這樣分配其實並不是最優解,因為完全可以將分割槽 t1p1 分配給消費者 c1。

所以,如果想要使用roundrobin 輪詢分割槽策略,必須滿足如下條件:

①每個消費者訂閱的主題,必須是相同的

Kafka實現訊息生產和消費

首先建立乙個主題 root 192 kafka 2.12 2.2.1 bin kafka topics.sh zookeeper localhost 2181 create topic heima partitions 2 replication factor 1 zookeeper 指定了kafk...

kafka消費分割槽策略

在 kafka 實際生產過程中,每個 topic 都會有 多個 partitions。1.多個partitions有什麼好處?1 多個 partition 能夠對 broker 上的資料進行分片,通過減少訊息容量來提公升 io 效能 2 為了提高消費端的消費能力,一般情況下會通過多個 conusme...

Kafka生產者與消費者分割槽策略

分割槽的目的在於可以提高併發,並在可在集群中擴充套件以適應不同大小的資料 producer傳送的資料會被封裝成producer recorder物件 在生成producer recorder物件時指明partition的情況下,直接進入對應的partition分割槽 沒有指明partition值,但...