消費者啟動的時候,主要是初始化幾個核心的元件。
反序列器,主要是生產者傳送的訊息是序列化到broker的,所以這邊要反序列化進行處理。
NetworkClient之前在生產者已經講過了,用於網路通訊。
ConsumerCoordinator是協調器,如果同一個group進行消費的時候,需要進行協調,這裡和rocketmq不同,rocketmq是消費者自己來協調的(RocketMQ -- 寫在訊息拉取前),kafka是通過broker來協調。相同的是,消費者需要傳送心跳給broker,broker才知道哪些訊息費需要消費。
Fetcher主要是用來拉取訊息的。
Consumer在初始化後,就開始拉取訊息,但是在拉取訊息之前,還需要確定Coordinator。
在沒有Coordinator的時候,不如consumer1,他會隨機的找到broker的地址,比如broker1。
呼叫broker1的介面,請求相關資料。
broker1接收到請求後,就會對groupid進行hash,並根據__consumer_offsets的topic資料進行取模,__consumer_offsets數量為50。
假設hash的值是10,而__consumer_offsets的partition為10在broker2上,那這個broker2就是Coordinator伺服器。
consumer1知道broker2是Coordinator伺服器後,就開始向broker2進行註冊併傳送心跳。
同理,consumer2由於groupid是一樣的,所以計算結果也是broker2,最終也向broker2進行註冊併傳送心跳。
broker2就會把相關consumer資訊進行儲存,並選擇leader consumer。
誰先註冊上來,誰就是leader consumer。
註冊成功後,如果是leader consumer,就會制定分割槽方案,傳送給broker2,broker2再把這個分割槽方案發給其他consumer。