目录
传统下网络服务模型
事件监听模型
NIO核心概念
单线程Reactor模式
多线程Reactor模式
Kafka 的网络设计
主要概念
类比思维理解
参考文章
传统下网络服务模型
- 线程太多
- 无法处理大规模请求
事件监听模型
NIO核心概念
nio是实现reactor模式的底层API代码
单线程Reactor模式
优点:模型简单,没有多线程、进程通信、竞争的问题,全部都在一个线程中完成;
缺点1:性能问题,只有一个线程,无法完全发挥多核 CPU 的性能。Handler 在处理某个连接上的业务时,整个进程无法处理其他连接事件,很容易导致性能瓶颈;
缺点2:可靠性问题,线程意外终止,或进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障;
多线程Reactor模式
整体工作流程如下:
- Reactor线程接受新的客户端连接,并通过Acceptor初始化连接。
- Reactor线程继续监听并分发读写事件,不执行任何业务逻辑计算。
- 对于需要处理的请求,Reactor将任务提交到线程池。
- 线程池中的工作线程按需从队列中取出任务,执行解码、计算和编码操作。
- 一旦响应准备好,相关的数据可以返回给Reactor线程,由它发送回客户端。
链接: Scalable IO in Java.pdf
Kafka 的网络设计
Kafka 的网络设计和 Kafka 的调优有关,这也是为什么它能支持高并发的原因:
主要概念
Kafka的网络设计采用了Reactor模式,这是一种高效处理并发网络连接的模式。在Reactor模式中,有几个关键的组件:
Acceptor:
- 负责处理新的网络连接请求。
- 通常运行在单独的线程上,监听指定的端口。
- 一旦有新的连接请求,它会接受连接并创建一个socket channel。
Processor:
- 处理来自socket channel的I/O事件(如读写操作)。
- Processor通常维护一个或多个socket channels,并使用非阻塞I/O来同时服务多个连接。
Socket Channel:
- 表示与客户端之间的网络连接。
- 在非阻塞模式下,socket channel可以在没有I/O操作可以执行时返回,这允许单个线程高效处理多个连接。
请求队列(Request Queue)和响应队列(Response Queue):
- 网络线程接收数据后,会把请求放入请求队列,由后台的I/O线程(或请求处理器)进行处理。
- 处理完的响应被放入响应队列,等待网络线程读取并发送回客户端。
在Kafka中,这个模型被用来实现高效的网络通信。网络线程(Processor)只负责网络I/O的读写,实际的消息处理逻辑(例如消息的解码、提交到日志等)由其他线程处理,从而实现了计算和I/O的解耦,提高了整体的性能和可伸缩性。
具体到Kafka的实现,它使用了一个或多个网络线程来处理所有网络活动,每个线程可以处理多个连接。这些线程不断地检查socket channels,看是否有新的数据可读或是否可以写入数据到网络。使用非阻塞I/O确保了单个线程可以有效地处理多个网络请求,而不会因为某个慢速的连接而阻塞。
我们可以看到Acceptor和Processor的逻辑分工,以及请求和响应在系统中如何流动。请求被放入队列,处理器从队列中拉取请求进行处理,然后处理完的响应被放回另一个队列等待发送。这个设计允许Kafka的网络层高效地处理成千上万的并发连接。
类比思维理解
想象你在一个快餐店,这个快餐店的运作非常类似于Reactor网络线程模型:
Acceptor(接待员):
- 顾客一进门,接待员负责迎接并指引顾客到点餐台。
- 在Reactor模型中,Acceptor相当于是接受新连接的组件,一旦有新的网络连接,它接受连接并创建一个通信通道。
Processor(点餐台工作人员):
- 点餐台的工作人员负责处理顾客的订单。他们听取顾客的要求,记录订单,然后将订单传递给厨房。
- 在Reactor模型中,Processor处理来自客户端的I/O事件,比如读取数据(接受订单)和写入数据(发送订单到厨房)。
Socket Channel(订单流转路径):
- 订单从点餐台到厨房再到顾客手中的路径。
- 在Reactor模型中,Socket Channel是客户端和服务端通信的通道。
请求队列(订单队列):
- 订单被记录在订单队列中,等待厨房处理。
- 在Kafka的网络模型中,请求队列保存了待处理的网络请求。
厨房(业务处理器):
- 厨房的工作人员根据订单制作食物。
- 在Reactor模型中,业务逻辑处理器执行类似的角色,它处理业务逻辑并准备响应。
响应队列(成品出餐区):
- 制作完成的食物被放在成品区,等待服务员送到顾客手中。
- 在Reactor模型中,响应队列用于存放处理完毕的数据,等待发送回客户端。
在这个快餐店模型中,点餐台工作人员(Processor)可以同时处理多个顾客的订单(非阻塞I/O),并且不需要自己做饭(业务逻辑处理)。这种工作流程让快餐店(服务器)可以高效地服务众多顾客(并发连接)。当食物准备好后,服务员(网络线程)将其送到顾客手中(发送响应)。这样的模型允许快餐店以最小的人力高效运作,类似地,Reactor模型使得服务器能够以最小的资源高效处理大量并发网络请求。
所以这就是一个加强版的 Reactor 网络线程模型。
参考文章
Reactor 线程模型_reactor模型_HoryC的博客-CSDN博客