Kafka Broker的请求处理流程_kafka

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的回调逻辑