重新按泳道方式整理了一下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")