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