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博客

相关推荐
Eugene__Chen5 天前
java IO/NIO/AIO
java·python·nio
一个儒雅随和的男子5 天前
Netty前置基础知识之BIO、NIO以及AIO理论详细解析和实战案例
nio
Craaaayon6 天前
JVM虚拟机--JVM的组成
java·jvm·nio
森叶9 天前
Java NIO & Java 虚拟线程(微线程)与 Go 协程的运行原理不同 为何Go 能在低配机器上承接10万 Websocket 协议连接
java·websocket·nio
码熔burning9 天前
【Netty篇】Channel 详解
netty·nio·channel
码熔burning10 天前
【NIO番外篇】之组件 Selector
java·io·nio·selector
码熔burning13 天前
【NIO番外篇】之组件 Channel
java·nio·channel
zhangpeng45554794014 天前
用Java NIO模拟HTTPS
java·https·nio
蜗牛、Z1 个月前
Java NIO之FileChannel 详解
java·nio
Zfox_1 个月前
【Linux】高性能网络模式:Reactor 反应堆模式
linux·服务器·c++·设计模式·性能优化·reactor