kafka的分区策略(partition assignment strategy)
概述
kafka的分區策略指的是producer端的 各個partition中的數據如何安排給consumer消費。
?
Range(按范圍)
ange策略是對每個主題而言的,首先對同一個主題里面的分區按照序號進行排序,并對消費者按照字母順序進行排序。在我們的例子里面,排完序的分區將會是0, 1, 2, 3, 4, 5, 6, 7, 8, 9;消費者線程排完序將會是C1-0, C2-0, C2-1。然后將partitions的個數除于消費者線程的總數來決定每個消費者線程消費幾個分區。如果除不盡,那么前面幾個消費者線程將會多消費一個分區。在我們的例子里面,我們有10個分區,3個消費者線程, 10 / 3 = 3,而且除不盡,那么消費者線程 C1-0 將會多消費一個分區,所以最后分區分配的結果看起來是這樣的:
C1-0 將消費 0, 1, 2, 3 分區 C2-0 將消費 4, 5, 6 分區 C2-1 將消費 7, 8, 9 分區假如我們有11個分區,那么最后分區分配的結果看起來是這樣的:
C1-0 將消費 0, 1, 2, 3 分區 C2-0 將消費 4, 5, 6, 7 分區 C2-1 將消費 8, 9, 10 分區假如我們有2個主題(T1和T2),分別有10個分區,那么最后分區分配的結果看起來是這樣的:
C1-0 將消費 T1主題的 0, 1, 2, 3 分區以及 T2主題的 0, 1, 2, 3分區 C2-0 將消費 T1主題的 4, 5, 6 分區以及 T2主題的 4, 5, 6分區 C2-1 將消費 T1主題的 7, 8, 9 分區以及 T2主題的 7, 8, 9分區可以看出,C1-0 消費者線程比其他消費者線程多消費了2個分區,這就是Range strategy的一個很明顯的弊端。
?
?
Round-robin(輪詢策略)
比如一個topic下有3個分區,那么第一條消息被發送到分區0,第二條被發送到分區1,第三條被發送到分區2,以此類推。當生產第四條消息時又會重新開始。
這就是所謂的輪詢策略。輪詢策略是kafka java生產者API默認提供的分區策略。輪詢策略有非常優秀的負載均衡表現,它總是能保證消息最大限度地被平均分配到所有分區上,故默認情況下它是最合理的分區策略,也是平時最常用的分區策略之一。
?
?Randomness(隨機策略)
也稱Randomness策略。所謂隨機就是我們隨意地將消息放置在任意一個分區上,如下圖
本質上看隨機策略也是力求將數據均勻地打撒到各個分區,但從實際表現來看,它要遜于輪詢策略,所以如果追求數據的均勻分布,還是使用輪詢策略比較好。
?
Key-ordering(按key保存策略)
kafka允許為每條消息定義消息鍵,簡稱為key。一旦消息被定義了key,那么你就可以保證同一個key的所有消息都進入到相同的分區里面,由于每個分區下的消息處理都是有順序的,如下圖所示
Kafka 允許為每條消息定義消息鍵,簡稱為 Key。這個 Key 的作用非常大,它可以是一個有著明確業務含義的字符串,比如客戶代碼、部門編號或是業務 ID 等;也可以用來表征消息元數據。特別是在 Kafka 不支持時間戳的年代,在一些場景中,工程師們都是直接將消息創建時間封裝進 Key 里面的。一旦消息被定義了 Key,那么你就可以保證同一個 Key 的所有消息都進入到相同的分區里面,由于每個分區下的消息處理都是有順序的,故這個策略被稱為按消息鍵保序策略,如下圖所示。
?
工程中的使用方法
在flink的代碼中的.option中進行設置如下的值即可
partition.assignment.strategy
?
Reference:
[1]Kafka的分區策略
[2]kafka分區策略
[3]Kafka 分區策略
[4]Kafka分區分配策略(Partition Assignment Strategy)
?
總結
以上是生活随笔為你收集整理的kafka的分区策略(partition assignment strategy)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GraphQL快速入门教程
- 下一篇: 尝鲜党:Nexus5、6刷安卓M教程