client 发出请求RPC
acceptor 监听OP_ACCEPT事件,调用accept方法创建对应的SocketChannel,并分配对应的Processor线程,将socketchannel放到Processor的newConnections阻塞队列里
Processor 执行processNewResponses()
方法,不断 poll队列 得到socketchannel 拿到对应的client信息拼接connectionId 执行register(String id, SocketChannel socketChannel)
,注册Selector上,用于真正的请求获取和响应发送I/O操作
Processor 执行processCompletedReceives
从Selector中提取已接收到的所有请求数据, 如果有对应的socketchannel ,创建Requestnew RequestChannel.Request(processor = id, context = context,...
对象,通过添加的requestChannel的requestQueue中
KafkaRequestHandlerPool 线程池的线程调用val req = requestChannel.receiveRequest(300)
从requestQueue取请求,根据请求类型执行不同的action, 如果是简单的请求,调用apis.handle(request)
执行具体处理逻辑,在逻辑中构造一个response对象new RequestChannel.SendResponse(request, responseSend, responseString, onComplete)
, 通过requestChannel.sendResponse(response)
方法,找到之前处理对应request的processor processors.get(response.processor)
,将response 放到processor的responseQueue中
Processor执行processNewResponses()
responseQueue中取出response, 根据response类型执行不同的action,如果是普通类型 先判断连接是否处于可连接状态,如果是执行selector.send(responseSend)
,并将Response加入到inflightResponses队列中
Processor 调用selector.poll(pollTimeout)
执行真正的io操作
Processor 执行 processCompletedSends
遍历已发送的Response的连接,从inflightResponses中取出Response,执行response的回调逻辑