Kafka分区分配策略(1)——RangeAssignor
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/kafka-partitions-allocation-strategy-1-range-assignor/
引言
按照Kafka默認的消費邏輯設定,一個分區只能被同一個消費組(ConsumerGroup)內的一個消費者消費。假設目前某消費組內只有一個消費者C0,訂閱了一個topic,這個topic包含7個分區,也就是說這個消費者C0訂閱了7個分區,參考下圖(1)。
此時消費組內又加入了一個新的消費者C1,按照既定的邏輯需要將原來消費者C0的部分分區分配給消費者C1消費,情形上圖(2),消費者C0和C1各自負責消費所分配到的分區,相互之間并無實質性的干擾。
接著消費組內又加入了一個新的消費者C2,如此消費者C0、C1和C2按照上圖(3)中的方式各自負責消費所分配到的分區。
如果消費者過多,出現了消費者的數量大于分區的數量的情況,就會有消費者分配不到任何分區。參考下圖,一共有8個消費者,7個分區,那么最后的消費者C7由于分配不到任何分區進而就無法消費任何消息。
上面各個示例中的整套邏輯是按照Kafka中默認的分區分配策略來實施的。Kafka提供了消費者客戶端參數partition.assignment.strategy用來設置消費者與訂閱主題之間的分區分配策略。默認情況下,此參數的值為:org.apache.kafka.clients.consumer.RangeAssignor,即采用RangeAssignor分配策略。除此之外,Kafka中還提供了另外兩種分配策略: RoundRobinAssignor和StickyAssignor。消費者客戶端參數partition.asssignment.strategy可以配置多個分配策略,彼此之間以逗號分隔。
RangeAssignor分配策略
RangeAssignor策略的原理是按照消費者總數和分區總數進行整除運算來獲得一個跨度,然后將分區按照跨度進行平均分配,以保證分區盡可能均勻地分配給所有的消費者。對于每一個topic,RangeAssignor策略會將消費組內所有訂閱這個topic的消費者按照名稱的字典序排序,然后為每個消費者劃分固定的分區范圍,如果不夠平均分配,那么字典序靠前的消費者會被多分配一個分區。
假設n=分區數/消費者數量,m=分區數%消費者數量,那么前m個消費者每個分配n+1個分區,后面的(消費者數量-m)個消費者每個分配n個分區。
為了更加通俗的講解RangeAssignor策略,我們不妨再舉一些示例。假設消費組內有2個消費者C0和C1,都訂閱了主題t0和t1,并且每個主題都有4個分區,那么所訂閱的所有分區可以標識為:t0p0、t0p1、t0p2、t0p3、t1p0、t1p1、t1p2、t1p3。最終的分配結果為:
消費者C0:t0p0、t0p1、t1p0、t1p1 消費者C1:t0p2、t0p3、t1p2、t1p3這樣分配的很均勻,那么此種分配策略能夠一直保持這種良好的特性呢?我們再來看下另外一種情況。假設上面例子中2個主題都只有3個分區,那么所訂閱的所有分區可以標識為:t0p0、t0p1、t0p2、t1p0、t1p1、t1p2。最終的分配結果為:
消費者C0:t0p0、t0p1、t1p0、t1p1 消費者C1:t0p2、t1p2可以明顯的看到這樣的分配并不均勻,如果將類似的情形擴大,有可能會出現部分消費者過載的情況。對此我們再來看下另一種RoundRobinAssignor策略的分配效果如何。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/kafka-partitions-allocation-strategy-1-range-assignor/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的Kafka分区分配策略(1)——RangeAssignor的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 直击Kafka的心脏——控制器
- 下一篇: Kafka分区分配策略(2)——Roun