controller在啟動時會注冊zk監聽器來監聽zookeeper中的/brokers/ids節點下的子節點變化,即集群中所有的broker列表,而每台broker在啟動時會向zk的/brokers/ids下寫入一個名字為broker.id的臨時節點,當該broker掛掉或與zk斷開連接時,此臨時節點會被移除,之后controller端的監聽器就會自動感知這個變化並將BrokerChange時間寫入到controller上的請求阻塞隊列里。
一旦controller端從阻塞隊列中獲取到該事件,她會開啟BrokerChange事件的處理邏輯,具體包括
1 獲取當前存活的broker列表
2 根據之前緩存的broker列表計算出當前已經掛掉的broker列表
3 更新controller端緩存
4 對於當前所有存活的broker,更新元數據信息並且啟動新broker上的分區和副本
5 對於掛掉的那些broker,處理這些broker上的分區副本(標記為offline已經執行offline邏輯並更新元數據)