消費者協調器,每個consumer例項化時,同時例項化乙個consumercoordinator物件,負責同乙個消費組下各個消費者和服務端組協調器之前的通訊
選舉groupcoordinator流程:
首先對消費組的groupid進行hash,接著對consumer_offsets的分割槽數量取模,預設是50,可以通過offsets.topic.num.partitions來設定
找到你的這個consumer group的offset要提交到consumer_offsets的哪個分割槽
然後對這個分割槽找到對應的leader所在的broker,這個broker就是這個consumer group的coordinator了,consumer接著就會維護乙個socket連線跟這個broker進行通訊
選舉消費者leader過程
確定了groupcoordinator之後,所有的consumer都會傳送乙個join group請求註冊
groupcoordinator就會預設把第乙個註冊上來的consumer選擇成為leader consumer
把整個topic的情況(kafka元資料)下發給leader consumer
leader consumer就會根據負載均衡的思路制定消費方案,返回給groupcoordinator
groupcoordinator拿到方案之後再下發給所有的consumer
consumer都會向groupcoordinator傳送心跳,當有consumer長時間不再和groupcoordinator保持聯絡,就會重新把分配給這個consumer的任務重新執行一遍
1. heartbeat.interval.ms引數
每個consumer 都會根據 heartbeat.interval.ms 引數指定的時間周期性地向group coordinator傳送 hearbeat,group coordinator會給各個consumer響應,若發生了 rebalance,各個consumer收到的響應中會包含 rebalance_in_progress 標識,這樣各個consumer就知道已經發生了rebalance,同時 group coordinator也知道了各個consumer的存活情況
2. session.timeout.ms引數
group coordinator檢測consumer發生崩潰所需的時間。乙個consumer group裡面的某個consumer掛掉了,最長需要 session.timeout.ms 秒檢測出來
3. max.poll.interval.ms引數
如果在兩次poll操作之間,超過了這個時間,會進行重平衡
引數使用舉例
session.timeout.ms=
10,heartbeat.interval.ms=
3
session.timeout.ms是個"邏輯"指標,它指定了乙個閾值—10秒,在這個閾值內如果coordinator未收到consumer的任何訊息,那coordinator就認為consumer掛了。而heartbeat.interval.ms是個"物理"指標,它告訴consumer要每3秒給coordinator發乙個心跳包,heartbeat.interval.ms越小,發的心跳包越多
設計的原因:如果group coordinator在乙個heartbeat.interval.ms週期內未收到consumer的心跳,就把該consumer移出group,這樣設計顯得不合理,有可能網路延時,有可能consumer出現了一次長時間gc,影響了心跳包的到達,就會造成誤判,導致頻繁的rebalance
版本對比
兩個執行緒設計的優點
實際問題分析
專案中經常碰到的 頻繁consumer rebalance 錯誤
避免重平衡引數設定
max.poll.interval.ms 引數值的設定,預設是5分鐘。可以根據業務的實際處理實際,比如業務處理時間是8分鐘,可以將其調成10分鐘,避免頻繁的rebalance
調整jvm引數,避免頻繁gc導致的重平衡(jvm高手根據實際情況合理設定)
參考kafka session.timeout.ms heartbeat.interval.ms引數的區別以及對資料儲存的一些思考
有意思的三國
三國 是很有意思的。雖然三國只不過是許多次朝代更替之一,時間也不很長,但是三國似乎很熟悉。董卓亂政 挾天子以令諸侯 赤壁之戰 生子當如孫仲謀 就連那些幾乎可以斷定不可能存在的事情,桃園結義 空城計,我們不僅耳熟 而且能詳 還有矛盾的三姓家奴 馬中赤兔人中呂布,經常被 崇拜的武聖人關羽 為什麼我們這麼...
有意思的三國關係!!
曹操的長子的妹妹的老公的老爸的堂侄女的老公的大哥的老婆的大哥的老婆的妹妹的老公是誰?好的,關於這個問題,讓我們來一一分析。曹操的長子是誰?曹昂曹操的長子的妹妹是誰?清河公主 只有清河公主才和曹昂同父同母 曹操的長子的妹妹的老公是誰 夏侯懋曹操的長子的妹妹的老公的老爸是誰?夏侯淵曹操的長子的妹妹的老公...
乙個有意思的問題
a b這個表示式如何理解?應該理解成a b還是a b,還是a b呢?應該按第一種方式理解。編譯的過程分為詞法解析和 語法解析兩個階段,在詞法解析階段,編譯器總是從前到後找最長的合法token。把這個表 達式從前到後解析,變數名a是乙個token,a後 面有兩個以上的 號,在c語言中乙個 號是合法的t...