重新按泳道方式整理了一下producer sender線程的活動圖,大致描述了主要的過程
leastLoadedNode 的說明:
首先從現有的broker節點列表中隨機選擇一個節點,以此為起點循環所有的節點
如果某個節點當前飛行隊列請求數為0,且節點是連接狀態,則選擇此節點,退出循環
否則尋找飛行隊列中請求數最少的處於連接狀態的節點,或者有可能選擇一個尚未連接的節點(如果所有已連接節點都在使用中)
永遠不會返回一個處於燈火管制期(blackout)節點(處於斷開連接狀態,且還在重連周期內,默認為"reconnect.backoff.ms" -> "50",也就是從上次嘗試連接時間到當前的時間流逝還沒到reconnect.backoff.ms)
NetworkClient.maybeUpdate的說明:
什么情況可以發送數據呢,只有節點是連接狀態,且節點通道channel是ready狀態(transportLayer是ready,authenticator是complete狀態),且此節點的飛行隊列數少於每連接最大數(默認為 "max.in.flight.requests.per.connection" -> "5")
那什么情況下可以連接呢,如果節點不存在連接狀態,或者節點是斷開連接狀態且從上次嘗試連接時間到當前的時間流逝已經超過了重連周期("reconnect.backoff.ms" -> "50")