Kafka分区分配策略(4)——分配的实施
接上文:
1.【Kafka分區分配策略(1)——RangeAssignor】
2.【Kafka分區分配策略(2)——RoundRobinAssignor和StickyAssignor】
3.【Kafka分區分配策略(3)——自定義分區分配策略】
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/kafka-partitions-allocation-strategy-4/
分配的實施
我們了解了Kafka中消費者的分區分配策略之后是否會有這樣的疑問:如果消費者客戶端中配置了兩個分配策略,那么以哪個為準?如果有多個消費者,彼此所配置的分配策略并不完全相同,那么以哪個為準?多個消費者之間的分區分配是需要協同的,那么這個協同的過程又是怎樣?
在kafka中有一個組協調器(GroupCoordinator)負責來協調消費組內各個消費者的分區分配,對于每一個消費組而言,在kafka服務端都會有其對應的一個組協調器。具體的協調分區分配的過程如下:
1.首先各個消費者向GroupCoordinator提案各自的分配策略。如下圖所示,各個消費者提案的分配策略和訂閱信息都包含在JoinGroupRequest請求中。
2.GroupCoordinator收集各個消費者的提案,然后執行以下兩個步驟:一、選舉消費組的leader;二、選舉消費組的分區分配策略。
選舉消費組的分區分配策略比較好理解,為什么這里還要選舉消費組的leader,因為最終的分區分配策略的實施需要有一個成員來執行,而這個leader消費者正好扮演了這一個角色。在Kafka中把具體的分區分配策略的具體執行權交給了消費者客戶端,這樣可以提供更高的靈活性。比如需要變更分配策略,那么只需修改消費者客戶端就醒來,而不必要修改并重啟Kafka服務端。
怎么選舉消費組的leader? 這個分兩種情況分析:如果消費組內還沒有leader,那么第一個加入消費組的消費者即為消費組的leader;如果某一時刻leader消費者由于某些原因退出了消費組,那么就會重新選舉一個新的leader,這個重新選舉leader的過程又更為“隨意”了,相關代碼如下:
//scala code. private val members = new mutable.HashMap[String, MemberMetadata] var leaderId = members.keys.head解釋一下這2行代碼:在GroupCoordinator中消費者的信息是以HashMap的形式存儲的,其中key為消費者的名稱,而value是消費者相關的元數據信息。leaderId表示leader消費者的名稱,它的取值為HashMap中的第一個鍵值對的key,這種選舉的方式基本上和隨機挑選無異。
總體上來說,消費組的leader選舉過程是很隨意的。
怎么選舉消費組的分配策略?投票決定。每個消費者都可以設置自己的分區分配策略,對于消費組而言需要從各個消費者所呈報上來的各個分配策略中選舉一個彼此都“信服”的策略來進行整體上的分區分配。這個分區分配的選舉并非由leader消費者來決定,而是根據消費組內的各個消費者投票來決定。這里所說的“根據組內的各個消費者投票來決定”不是指GroupCoordinator還要與各個消費者進行進一步交互來實施,而是根據各個消費者所呈報的分配策略來實施。最終所選舉的分配策略基本上可以看做是被各個消費者所支持的最多的策略,具體的選舉過程如下:
如果某個消費者并不支持所選舉出的分配策略,那么就會報錯。
3.GroupCoordinator發送回執給各個消費者,并交由leader消費者執行具體的分區分配。
如上圖所示,JoinGroupResponse回執中包含有GroupCoordinator中投票選舉出的分配策略的信息。并且,只有leader消費者的回執中包含各個消費者的訂閱信息,因為只需要leader消費者根據訂閱信息來執行具體的分配,其余的消費并不需要。
4.leader消費者在整理出具體的分區分配方案后通過SyncGroupRequest請求提交給GroupCoordinator,然后GroupCoordinator為每個消費者挑選出各自的分配結果并通過SyncGroupResponse回執以告知它們。
這里涉及到了消費者再平衡時的一些內容,不過本文只對分區分配策略做相關陳述,故省去了與此無關的一些細節內容:比如GroupCoordinator是什么?怎么定義和查找GroupCoodinator?為什么要有這個東西?JoinGroupRequest和SyncGroupRequest除了與分區分配相關之外還有什么作用?等等相關內容會在后面的文章中放出,關注筆者公眾號【掃碼下方二維碼】,更多姿勢等你學。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/kafka-partitions-allocation-strategy-4/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
總結
以上是生活随笔為你收集整理的Kafka分区分配策略(4)——分配的实施的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kafka分区分配策略(3)——自定义分
- 下一篇: [Kafka与Spark集成系列一]