5.深入理解kafka:核心設計與實踐原理

深入客戶端

分區分配策略

Kafka提供了消費者客戶端參數partition.assignment.strategy來設置消費者與訂閱主題之間的分區分配策略。默認情況下,此參數的值爲org.apache.kafka.clients.consumer.RangeAssignor,即採用RangeAssignor分配策略。除此之外,Kafka還提供了另外兩種分配策略:RoundRobinAssignor 和 StickyAssignor。消費者客戶端參數 partition.assignment.strategy可以配置多個分配策略,彼此之間以逗號分隔。

RangeAssignor分配策略

RangeAssignor 分配策略的原理是按照消費者總數和分區總數進行整除運算來獲得一個跨度,然後將分區按照跨度進行平均分配,以保證分區儘可能均勻地分配給所有的消費者。對於每一個主題,RangeAssignor策略會將消費組內所有訂閱這個主題的消費者按照名稱的字典序排序,然後爲每個消費者劃分固定的分區範圍,如果不夠平均分配,那麼字典序靠前的消費者會被多分配一個分區。注意:可能出現部分消費者過載的情況

RoundRobinAssignor分配策略
RoundRobinAssignor分配策略的原理是將消費組內所有消費者及消費者訂閱的所有主題的分區按照字典序排序,然後通過輪詢方式逐個將分區依次分配給每個消費者。RoundRobinAssignor分配策略對應的 partition.assignment.strategy 參數值爲org.apache.kafka.clients.consumer.RoundRobinAssignor。

如果同一個消費組內的消費者訂閱的信息是不相同的,那麼在執行分區分配的時候就不是完全的輪詢分配,有可能導致分區分配得不均勻。如果某個消費者沒有訂閱消費組內的某個主題,那麼在分配分區的時候此消費者將分配不到這個主題的任何分區。

StickyAssignor分配策略
它主要有兩個目的:

(1)分區的分配要儘可能均勻。

(2)分區的分配儘可能與上次分配的保持相同。

當兩者發生衝突時,第一個目標優先於第二個目標。鑑於這兩個目標,StickyAssignor分配策略的具體實現要比RangeAssignor和RoundRobinAssignor這兩種分配策略要複雜得多

自定義分區分配策略

自定義的分配策略必須要實現org.apache.kafka.clients.consumer.internals.PartitionAssignor接口。PartitionAssignor接口的定義如下:

消費者協調器和組協調器

瞭解了Kafka 中消費者的分區分配策略之後是否會有這樣的疑問:如果消費者客戶端中配置了兩個分配策略,那麼以哪個爲準呢?如果有多個消費者,彼此所配置的分配策略並不完全相同,那麼以哪個爲準?多個消費者之間的分區分配是需要協同的,那麼這個協同的過程又是怎樣的呢?這一切都是交由消費者協調器(ConsumerCoordinator)和組協調器(GroupCoordinator)來完成的,它們之間使用一套組協調協議進行交互。


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章