kafka消費分割槽策略

2021-10-01 23:08:40 字數 3126 閱讀 1708

在 kafka 實際生產過程中,每個 topic 都會有 多個 partitions。

1.多個partitions有什麼好處?

1、多個 partition ,能夠對 broker 上的資料進行分片,通過減少訊息容量來提公升 io 效能;

2、為了提高消費端的消費能力,一般情況下會通過多個 conusmer 去消費 同乙個 topic 中的訊息,即實現消費端的負載均衡。

接下來詳細說明分割槽策略

1.什麼是分割槽分配策略

通過如上例項,我們能夠了解到,同乙個 group.id 中的消費者,對於乙個 topic 中的多個 partition 中的訊息消費,存在著一定的分割槽分配策略。在 kafka 中,存在著兩種分割槽分配策略。一種是 rangeassignor 分配策略(範圍分割槽),另一種是 roundrobinassignor分配策略(輪詢分割槽)。預設採用 range 範圍分割槽。 kafka提供了消費者客戶端引數 partition.assignment.strategy 用來設定消費者與訂閱主題之間的分割槽分配策略。預設情況下,此引數的值為:org.apache.kafka.clients.consumer.rangeassignor,即採用rangeassignor分配策略

1.1 rangeassignor 範圍分割槽

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

例如,10/3 = 3 餘 1 ,除不盡,那麼 消費者 c1 便會多消費 1 個分割槽,最終分割槽分配結果如下:

c1 消費 0,1,2,3 分割槽

c2 消費 4,5,6 分割槽

c3 消費 7,8,9 分割槽(如果有11 個分割槽的話,c1 將消費0,1,2,3 分割槽,c2 將消費4,5,6,7分割槽 c3 將消費 8,9,10 分割槽)

range 範圍分割槽的弊端:

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

由於 range 範圍分割槽存在的弊端,於是有了 roundrobin 輪詢分割槽策略,如下介紹↓↓↓

1.2 roundrobinassignor 輪詢分割槽

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

1、同一消費組內所有消費者訂閱的訊息都是相同的

2、同一消費者組內的消費者訂閱的訊息不相同

如果同乙個group_id內,所有的消費者訂閱的訊息都是相同的,那麼 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 輪詢分割槽策略,必須滿足如下兩個條件:

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

2、每個主題的消費者例項都是相同的。(即:上面的第一種情況,才優先使用 roundrobin 輪詢分割槽策略)

2.什麼時候觸發分割槽重分配

當出現以下幾種情況時,kafka 會進行一次分割槽重分配操作,即 kafka 消費者端的 rebalance 操作

1、 同乙個 consumer 消費者組 group.id 中,新增了消費者進來,會執行 rebalance 操作

2、 消費者離開當期所屬的 consumer group組。比如 主動停機 或者 宕機

3、 分割槽數量發生變化時(即 topic 的分割槽數量發生變化時)

4、 消費者主動取消訂閱

kafka 消費端的 rebalance 機制,規定了乙個 consumer group 下的所有 consumer 如何達成一致來分配訂閱 topic 的每乙個分割槽。而具體如何執行分割槽策略,就是上面提到的 range 範圍分割槽和roundrobin輪詢分割槽兩種內建的分割槽策略。kafka 對於分割槽分配策略這塊,也提供了可插拔式的實現方式,除了上面兩種分割槽分配策略外,我們也可以建立滿足自己使用的分割槽分配策略,即:自定義分割槽策略

kafka 消費者分割槽策略

分割槽分配策略 當消費者組中的消費者增多或減少會觸發分割槽分配策略 乙個consumer group中有多個consumer,乙個topic有多個partition,所以必然會涉及到partition 的分配問題,及確定那個partition由哪個consumer來消費。kafka中有兩種分配策略,...

kafka消費者分割槽分配策略

在這裡對這一塊進行總結,具體看這篇文件 知乎 kafka消費者組與重平衡 目前一共三種分割槽分配策略 1.rang 這個策略主要方式是分割槽數除以消費者數來計算的 如果主題的分割槽分割槽不能平均分配給組內每個消費者,那麼對該主題,某些消費者會被分配到額外的分割槽 2.輪詢 這個模式很好理解,但是如果...

Kafka消費分組和分割槽分配策略

kafka消費分組,訊息消費原理 同乙個消費組裡的消費者不能消費同乙個分割槽,不同消費組的消費組可以消費同乙個分割槽 kafka分割槽分配策略 在 kafka 內部存在兩種預設的分割槽分配策略 range 和 roundrobin。當以下事件發生時,kafka 將會進行一次分割槽分配 將分割槽的所有...