前言
本文对Kafka的ConsumerNetworkClient的poll(…)方法,展开源码分析。实际上这个方法负责客户端与服务端的之间的读写操作。
ConsumerNetworkClient -> NetworkClient -> Selector,归根结底由Selector做底层的I/O操作。
源码分析
Part One
触发监听器的回调逻辑。
- pendingCompletion:ConcurrentLinkedQueue类型。请求完成的,会被加入到这个队列中。
- response:ClientResponse类型。
- future:RequestFuture类型。
- e:RuntimeException类型。
对于正常完成的情况,会调用future.complete(response)这个方法。
result属性设置为请求对应的response。然后调用fireSuccess()方法。
从RequestFutureListener队列中取出元素,分别触发onSuccess(…)逻辑。
·
Part Two
对于准备下线的服务端节点,断开与之连接的客户端。
- pendingDisconnects:ConcurrentLinkedQueue类型。
获取该节点未发送的请求集合,对这些请求做失败处理。
将该RequestFutureCompletionHandler添加到pendingCompletion这个集合中。
·
Part Three
对于与服务端成功建立连接的客户端,进行发送请求。底层使用NetworkClient,之后的文章会有分析。
·
Part Four
调用NetworkClient#poll(…)方法。也就是实际的读写操作。
·
Part Five
检查断开连接的服务端节点。
对于断开连接的服务端节点,清空未发送的请求集合,触发onComplete(…)回调逻辑。
·
Part Six
可能触发唤醒、抛出中断异常。
可能触发唤醒。
可能抛出中断异常。
·
Part Seven
客户端向服务端发送请求,对失效的请求做失败处理,清空未发送的请求集合。
对失效的请求做失败处理。
·
Part Eight
触发监听器的回调逻辑。可能会抛出异常。
可能会抛出异常。
清除错误,可能会抛出异常。