kafka對消費者分配分區規則(Java源碼)


  在上一篇 kafka topic消息分配partition規則(Java源碼) 我們對生產者產生的消息分配partition規則進行了分析,那么本章我們來看看消費者是怎么樣分配partition的。

  kafka 為了保證同一類型的消息順序性(FIFO),一個partition只能被同一組的一個consumer綁定消費,不同組的consumer可以綁定同一個partition進行重復消費。但是一個consumer可以綁定多個partition(哈哈不知道這里用綁定是否合適)。用個例子解釋一下:有一個topic T1 有4個partition;有一個消費組 G1,在G1創建一個consumer C1,這時C1就會消費T1的4個partition:

有兩個消費組時:

一個消費組只有一個消費者時很容易理解,那么一個消費組有多個消費怎么分配呢(一個組的消費者個數最好不要比partition個數多,否則多的消費者就是一種浪費),本章重點來了,實現org.apache.kafka.clients.consumer.internals.PartitionAssignor這個接口就可以制定partition對消費者的分配了。kafka已經實現了RoundRobinAssignor和RangeAssignor兩種。

類關系:

 RoundRobinAssignor 

  該策略把主題的所有分區逐個分配給消費者。如果使用 RoundRobinAssignor 策略來給消費者 C1 和消費者 C2 分配分區,那么消費者 C1 將分到主題 T1 的分區 0 和分區 2 以及主題 T2 的分區 1,消費者 C2 將分配到主題 T1 的分區 1 以及主題 T2 的分區 0 和分區 2。一般來說,如果所有消費者都訂閱相同的主題(這種情況很常見),RoundRobin 策略會給所有消費者分配相同數量的分區(或最多就差一個分區) 。

以上截圖是輪詢策略的主要代碼,1 中創建了CircularIterator用來可以循環遍歷的對象,在 2 中就對所有消費者進行了輪詢分配partition。

RangeAssignor:

該策略會把主題的若干個連續的分區分配給消費者(kafka默認用該策略)。假設消費者 C1 和消費者 C2 同時 訂閱了主題 T1 和主題 T2,並且每個主題有 3 個分區。那么消費者 C1 有可能分配到這 兩個主題的分區 0 和分區 1,而消費者 C2 分配到這兩個主題的分區 2。因為每個主題 擁有奇數個分區,而分配是在主題內獨立完成的,第一個消費者最后分配到比第二個消 費者更多的分區。只要使用了 RangeAssignor 策略,而且分區數量無法被消費者數量整除,就會 出現這種情況。 

 以上截圖是RangeAssignor策略的主要代碼:

1 中用話題的分區總數除以該話題的消費者數量(取整數);

2 中用話題的分區總數對該話題的消費者數量取模;

345 計算某個消費者對應的partition區間。

  我們可以通過配置partition.assignment.strategy參數指定用哪個策略。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM