NetworkClient 管理了客户端和服务端之间的网络通信,包括建立、发送客户端请求、读取客户端响应
在 Sender 线程中主要调用 NetworkClient 的几个方法,前两个属于准备阶段,第三个才会发送客户端请求
- ready():从 RecordAccumulator 获取准备完毕的节点,并连接所有准备好的节点
- send():为每个节点创建一个客户端请求后存储到节点对应的通道中
- poll():轮询动作会真正执行网络请求,包括发送请求、处理响应
准备发送客户端请求
- ready() 首先会判断是否已经准备好,确保消息不会发送到没有准备好的节点,准备好的会调用 selector.connect() 方法建立到目标节点的网络连接
- 建立连接后,send() 方法先将请求加入 inFlightRequests 列表,然后调用 selector.send() 方法
- inFlightRequests 是存储存还没有收到响应的请求,默认里面最多存 5 个,里面包含一个双端队列的映射结构,准备发送时先添加到对应的队列中,收到响应再移除
- 注意:这一步只是暂存请求到对应的通道中,并没有请求,NetworkClient 有一个限制条件,上一个客户端请求还没有发送完成,新的客户端请求就不允许发送
/**
* Begin connecting to the given node, return true if we are already connected and ready to send to that node.
* 开始连接到给定的节点,如果已经连接并准备发送到该节点,则返回true。
*/
@Override
public boolean ready(Node node, long now) {
// 是否具备需要发送消息的条件
if (isReady(node, now))
return true;
// 不具备发送条件,尝试创建连接
if (connectionStates.canConnect(node.idString(), now))
// if we are interested in sending to a node and we don't have a connection to it, initiate one
// 如果我们有兴趣发送到一个节点,但我们没有到它的连接,启动一个
// 建立连接前的初始化操作
initiateConnect(node, now);
return false;
}
/**
* Initiate a connection to the given node
* 初始化到给定节点的连接
*/
private void initiateConnect(Node node, long now) {
String nodeConnectionId = node.idString()

最低0.47元/天 解锁文章
5万+

被折叠的 条评论
为什么被折叠?



