關於Kafka分區策略和分區分配策略的理解

1.分區策略

1)分區的原因
(1)方便在集羣中擴展,每個 Partition 可以通過調整以適應它所在的機器,而一個 topic
又可以有多個 Partition 組成,因此整個集羣就可以適應任意大小的數據了;
(2)可以提高併發,因爲可以以 Partition 爲單位讀寫了。
2)分區的原則
我們需要將 producer 發送的數據封裝成一個 ProducerRecord 對象。
(1)指明 partition 的情況下,直接將指明的值直接作爲 partiton 值;
(2)沒有指明 partition 值但有 key 的情況下,將 key 的 hash 值與 topic 的 partition
數進行取餘得到 partition 值;
(3)既沒有 partition 值又沒有 key 值的情況下,第一次調用時隨機生成一個整數(後面每次調用在這個整數上自增),將這個值與 topic 可用的 partition 總數取餘得到 partition
值,也就是常說的 round-robin 算法。

理解:這裏第三點,若爲默認情況,未指定partition和key,則根據隨機數依次輪詢分區寫入數據(注意:如果Topic A有0 1 2三個分區,這裏有可能是從0 1 2三個分區的任何一個開始,起點取決於第一次調用生成的隨機數)。

2.分區分配策略

一個 consumer group 中有多個 consumer,一個 topic 有多個 partition,所以必然會涉及
到 partition 的分配問題,即確定那個 partition 由哪個 consumer 來消費。
Kafka 有兩種分配策略,一是 RoundRobin,一是 Range(默認)。

(1) Range 範圍分區策略是對每個 topic 而言的。首先對同一個 topic 裏面的分區按照序號進行排序,並對消費者按照字母順序進行排序。通過 partitions數/consumer數 來決定每個消費者應該消費幾個分區。如果除不盡,那麼前面幾個消費者將會多消費 1 個分區。
(2) RoundRobin 輪詢分區策略,是把所有的 partition 和所有的 consumer 都列出來,然後按照 hascode 進行排序,最後通過輪詢算法來分配 partition 給到各個消費者。

例:
Topic A 有0 1 2 3 4五個分區,現有2個customer分別爲B C
那麼根據上面的公式,分區分配結果爲B:0 1 2,C:3 4,而不是採用輪詢的方式。
注意:不要被消費者接收到的數據所迷惑,根據我在上面分區策略中的理解,這裏寫入的數據,從三個分區都有可能爲最開始接收到數據的分區。
例如我在生產者輸入1 2 3 4 5

在這裏插入圖片描述
消費者分別從分區中pull中接收到1 3 4和2 5,這並不能說明,兩個消費者分配到的分區不是連續的,而是因爲我上面提到的最開始寫入數據的分區是隨機的(這裏正好是從1分區開始)
在這裏插入圖片描述
在這裏插入圖片描述

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