01 引言
单分区写入在一些需要全局顺序消息的场景中具备重要应用价值。在一些严格保序场景下,需要将分区数设置为 1,并且只用单个生产者来发送数据,从而确保消费者可以按照原始顺序读取所有数据。此时,Kafka 的单分区写入性能将会决定整个系统的吞吐上限。在我们的实践中发现,Kafka 由于其本身线程模型实现上的制约,并没有将单分区写入性能的极限发挥出来。本文今天将具体解读 Kafka 线程模型的不足以及 AutoMQ 如何对其进行改进优化,从而实现更好的单分区写入性能。
02 Apache Kafka 串行处理模型解析
Apache Kafka 的串行处理模型网络框架主要由 5 个类组成:
1. SocketServer:网络框架的核心类,包含 Acceptor 和 Processor 部分
- Acceptor:监听端口,处理新建连接请求,并将连接分发给 Processor;
- Processor:网络线程,通过num.network.threads 配置数量。单个 TCP 连接有且只有一个 Processor 负责,Processor#run 方法驱动连接后续的生命周期管理,从网络解析请求和将响应写入到网络;
2. KafkaChannel:单个 TCP 连接的抽象,维护了连接的状态信息,被Processor持有;
3. RequestChannel:Processor 从网络解析完请求后将请求放到到单队列 RequestChannel 中,再由 KafkaRequestHandler 拉走多线程并发处理;
4. KafkaRequestHandler:业务逻辑处理 / IO 线程,通过 num.io.threads配置数量,从 RequestChannel 获取到请求后,调用 KafkaApis 进行业务逻辑处理;
5. KafkaApis:具体的业务逻辑处理类,会根据请求类型分发到不同的处理方法;
网络框架核心类和类之间的交互,对应到 Apache Kafka 的线程模型如下图:

可以看到 Kafka 的线程模型和我们使用 Netty 开发的服务端程序类似:
ꔷ kafka-socket-listener 对应到 Boss EventLoopGroup:负责接受客户端连接。当一个新的连接到来时,Boss EventLoopGroup 会接受连接,并将接受的连接注册到 Worker EventLoopGroup;
ꔷ kafka-network-thread 对应到 Worker EventLoopGroup:处理连接的所有 I/O 事件,包括读取数据,写入数据,以及处理连接的生命周期事件;
ꔷ kafka-request-handler:为了防止业务逻辑阻塞网络线程,通常会将

最低0.47元/天 解锁文章

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



