Reactor网络线程模型

目录

传统下网络服务模型

事件监听模型

NIO核心概念

单线程Reactor模式

多线程Reactor模式

[Kafka 的网络设计](#Kafka 的网络设计)

主要概念

类比思维理解

参考文章


传统下网络服务模型

  • 线程太多
  • 无法处理大规模请求

事件监听模型

NIO核心概念

nio是实现reactor模式的底层API代码

单线程Reactor模式

优点:模型简单,没有多线程、进程通信、竞争的问题,全部都在一个线程中完成;

缺点1:性能问题,只有一个线程,无法完全发挥多核 CPU 的性能。Handler 在处理某个连接上的业务时,整个进程无法处理其他连接事件,很容易导致性能瓶颈;

缺点2:可靠性问题,线程意外终止,或进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障;

多线程Reactor模式

整体工作流程如下:

  1. Reactor线程接受新的客户端连接,并通过Acceptor初始化连接。
  2. Reactor线程继续监听并分发读写事件,不执行任何业务逻辑计算。
  3. 对于需要处理的请求,Reactor将任务提交到线程池。
  4. 线程池中的工作线程按需从队列中取出任务,执行解码、计算和编码操作。
  5. 一旦响应准备好,相关的数据可以返回给Reactor线程,由它发送回客户端。

链接: Scalable IO in Java.pdf

Kafka 的网络设计

Kafka 的网络设计和 Kafka 的调优有关,这也是为什么它能支持高并发的原因:

主要概念

Kafka的网络设计采用了Reactor模式,这是一种高效处理并发网络连接的模式。在Reactor模式中,有几个关键的组件:

  1. Acceptor

    • 负责处理新的网络连接请求。
    • 通常运行在单独的线程上,监听指定的端口。
    • 一旦有新的连接请求,它会接受连接并创建一个socket channel。
  2. Processor

    • 处理来自socket channel的I/O事件(如读写操作)。
    • Processor通常维护一个或多个socket channels,并使用非阻塞I/O来同时服务多个连接。
  3. Socket Channel

    • 表示与客户端之间的网络连接。
    • 在非阻塞模式下,socket channel可以在没有I/O操作可以执行时返回,这允许单个线程高效处理多个连接。
  4. 请求队列(Request Queue)响应队列(Response Queue)

    • 网络线程接收数据后,会把请求放入请求队列,由后台的I/O线程(或请求处理器)进行处理。
    • 处理完的响应被放入响应队列,等待网络线程读取并发送回客户端。

在Kafka中,这个模型被用来实现高效的网络通信。网络线程(Processor)只负责网络I/O的读写,实际的消息处理逻辑(例如消息的解码、提交到日志等)由其他线程处理,从而实现了计算和I/O的解耦,提高了整体的性能和可伸缩性。

具体到Kafka的实现,它使用了一个或多个网络线程来处理所有网络活动,每个线程可以处理多个连接。这些线程不断地检查socket channels,看是否有新的数据可读或是否可以写入数据到网络。使用非阻塞I/O确保了单个线程可以有效地处理多个网络请求,而不会因为某个慢速的连接而阻塞。

我们可以看到Acceptor和Processor的逻辑分工,以及请求和响应在系统中如何流动。请求被放入队列,处理器从队列中拉取请求进行处理,然后处理完的响应被放回另一个队列等待发送。这个设计允许Kafka的网络层高效地处理成千上万的并发连接。

类比思维理解

想象你在一个快餐店,这个快餐店的运作非常类似于Reactor网络线程模型:

  1. Acceptor(接待员):

    • 顾客一进门,接待员负责迎接并指引顾客到点餐台。
    • 在Reactor模型中,Acceptor相当于是接受新连接的组件,一旦有新的网络连接,它接受连接并创建一个通信通道。
  2. Processor(点餐台工作人员):

    • 点餐台的工作人员负责处理顾客的订单。他们听取顾客的要求,记录订单,然后将订单传递给厨房。
    • 在Reactor模型中,Processor处理来自客户端的I/O事件,比如读取数据(接受订单)和写入数据(发送订单到厨房)。
  3. Socket Channel(订单流转路径):

    • 订单从点餐台到厨房再到顾客手中的路径。
    • 在Reactor模型中,Socket Channel是客户端和服务端通信的通道。
  4. 请求队列(订单队列):

    • 订单被记录在订单队列中,等待厨房处理。
    • 在Kafka的网络模型中,请求队列保存了待处理的网络请求。
  5. 厨房(业务处理器):

    • 厨房的工作人员根据订单制作食物。
    • 在Reactor模型中,业务逻辑处理器执行类似的角色,它处理业务逻辑并准备响应。
  6. 响应队列(成品出餐区):

    • 制作完成的食物被放在成品区,等待服务员送到顾客手中。
    • 在Reactor模型中,响应队列用于存放处理完毕的数据,等待发送回客户端。

在这个快餐店模型中,点餐台工作人员(Processor)可以同时处理多个顾客的订单(非阻塞I/O),并且不需要自己做饭(业务逻辑处理)。这种工作流程让快餐店(服务器)可以高效地服务众多顾客(并发连接)。当食物准备好后,服务员(网络线程)将其送到顾客手中(发送响应)。这样的模型允许快餐店以最小的人力高效运作,类似地,Reactor模型使得服务器能够以最小的资源高效处理大量并发网络请求。

所以这就是一个加强版的 Reactor 网络线程模型。

参考文章

Reactor 线程模型_reactor模型_HoryC的博客-CSDN博客

相关推荐
自律的kkk5 天前
网络编程中的黏包和半包问题
java·开发语言·网络·网络编程·tcp·nio
power-辰南6 天前
Netty 常见面试题原理解析
java·开发语言·netty·nio
生活百般滋味,人生需要笑对。 --佚名8 天前
NIO 三大组件
java·开发语言·nio
鹏码纵横14 天前
如何解决 java.nio.charset.CoderMalfunctionError: 编码器故障错误问题?亲测有效的解决方法!
java·python·nio
智商低情商凑14 天前
NIO - selector简单介绍
java·开发语言·nio
智商低情商凑17 天前
Netty - NIO基础学习
nio
小猫猫猫◍˃ᵕ˂◍17 天前
NIO和零拷贝
linux·服务器·nio
程序猿进阶18 天前
ChannelInboundHandlerAdapter 与 SimpleChannelInboundHandler 的区别
java·开发语言·后端·面试·性能优化·netty·nio
材料苦逼不会梦到计算机白富美19 天前
多人聊天室 NIO模型实现
运维·服务器·nio
jupiter_88819 天前
Java NIO channel
java·服务器·nio