深入理解Kafka服务端之网络架构初探
整体的通信方案如下:
Reactor主线程MainReactor对象通过select监听连接事件,收到事件后,通过Acceptor处理连接事件
当Acceptor处理连接事件后,MainReactor将连接分配给SubReactor
SubReactor将连接加入到连接队列进行监听,并创建handler进行各种事件处理
当有新事件发生时,SubReactor就会调用对应的handler进行处理
handler通过Read读取数据,分发给后面的worker线程处理
worker线程池会分配独立的worker线程进行业务处理,并返回结果
handler收到响应的结果后,再通过send将结果返回给client
MainReactor主线程可以关联多个SubReactor子线程
二、Kafka中Reactor模型的实现
SocketServer:实现Reactor模式,用于处理多个Client(包括客户端和其他broker节点)的并发请求,并将处理结果返回给Client KafkaRequestHandlerPool:Reactor模式中的Worker线程池,里面定义了多个工作线程,用于处理实际的I/O请求逻辑。
整个服务端处理请求的流程大致分为以下几个步骤:
Acceptor接收客户端发来的请求
轮询分发给Processor线程处理
Processor将请求封装成Request对象,放到RequestQueue队列
KafkaRequestHandlerPool分配工作线程,处理RequestQueue中的请求
KafkaRequestHandler线程处理完请求后,将响应Response返回给Processor线程
Processor线程将响应返回给客户端
Kafka默认1个Acceptor线程对应3个Processor(由num.network.threads参数决定)线程;而1个KafkaRequestHandlerPool线程池中包含8个KafkaRequestHandler工作线程。(由num.io.thread参数决定)
在Kafka安装目录/config/server.properties配置文件中,就可以看到这两个参数的默认值:
# The number of threads that the server uses for receiving requests from the network and sending responses to the network
num.network.threads=3
# The number of threads that the server uses for processing requests, which may include disk I/O
num.io.threads=8
这两个参数十分重要,通过合理设置这两个参数值,可以有效提升Kafka的并发处理能力。