重平衡(rebalance)
舊版本Kafka依托於Zk進行rebalance,新版本consumer使用了Kafka內置的一個全新的組協調協議。對於每個組而言,Kafka的某個broker會被選舉為組協調者(coordinator)。
觸發條件:
1.組成員發生變更。
2.組訂閱topic數發生變更。比如使用基於正則表達式的訂閱,當匹配正則表達式的新topic被創建時則會觸發rebalance
3.組訂閱topic的分區數發生變更。比如使用命令行腳本增加了訂閱topic的分區數。
分區策略:
range,round-robin,sticky策略
rebalance generation:
表示rebalance之后的一屆成員,在consumer中它是一個整數,從0開始。主要是為了保護consumer group,特別是防止無效的offset提交,比如上一屆的consumer成員由於某些原因延遲提交了offset,但rebalance之后該group產生了新一屆group成員,而這次新延遲的offset提交攜帶的是舊generation信息,因此這次提交會被consumer group拒絕。
rebalance協議:
JoinGroup請求:consumer請求加入組
SyncGroup請求:group leader把分配方案同步到組內所有成員中
Heartbeat請求:consumer定期向coordinator匯報心跳表明自己依然存活
LeaveGroup請求:consumer主動通知coordinator該conumer即將離組。
DescribeGroup請求:供管理員使用,查看組的所有信息,包括成員信息,協議信息,分配方案以及訂閱信息等
在成功rebalance之后,組內所有consumer都需要定期向coordinator發送Heartbeat請求,而每個consumer也是根據Heartbeat請求的響應中是否包含REBALANCE_IN_PROGRESS來判斷當前group是否開啟了新一輪rebalance