什么是 Reactor 模式?

什么是 Reactor 模式?

  Reactor 模式并不是什么很神秘的东西。一般来说,通信有以下两个关键步骤:一是建立连接,二是进行数据的传输。一般对通信过程进行优化,也就是基于这两个关键点进行优化。

  建立连接通常就是 握手 的过程。在向对方传输数据之前,必须要经对方同意,这就是握手。如果建立连接就不成功,后面的数据传输也不能进行。对于服务端来讲,它需要与众多客户端通信,建立连接的成功数将影响它的吞吐量。对于服务端,当然是希望它的吞吐量越高越好。我们知道数据传输通常相对更耗时,为了避免对建立连接造成影响,最好是让服务端使用一个与数据传输不同的线程来完成建立连接的工作。

  对于服务端来讲,它需要与众多客户端通信。如果正好需要与多个客户端同时进行数据传输,就只能开启多个线程来完成,且线程数与连接数相等。如果线程数小于连接数,则有些客户端需要等待。

  Reactor 模式就是基于建立连接与具体服务之间线程分离的模式。在 Reactor 模式中,会有一个线程负责与所有客户端建立连接,这个线程通常称之为 Reactor。然后在建立连接之后,Reactor 线程 会使用其它线程(可以有多个)来处理与每一个客户端之间的数据传输,这个(些)线程通常称之为 Handler

  由于服务端需要与多个客户端通信,它的通信是一对多的关系,所以它需要使用 Reactor 模式。对客户端,它只需要与服务端通信,它的通信是一对一的关系,所以它不需要使用 Reactor 模式。也就是说,对客户端来讲,它不需要进行建立连接与传输数据之间的线程分离。

融入 NIO 技术的 Reactor 模式

  对于实际的生产环境,还通常将 Reactor 模式与 NIO(Non-blocking I/O,非阻塞 I/O)、I/O 多路复用 技术相结合起来,它比上面所描述的基础的 Reactor 模式要相对复杂一些。关于什么是 NIO、I/O 多路复用,这里不做详解,笔者已经在其它很多博客中详细介绍过了。通常,NIO 技术会使用 I/O 多路复用技术。

  I/O 多路复用技术需要操作系统的支持。融入 NIO 技术的 Reactor 模式,将上面的 Reactor 线程 进行了拆分,分成了一种 Event Demultiplexer(事件多路分解器)和 Event Selector(事件选择器)。

  拆分后的程序流程如下。首先,服务器端操作系统在接收到客户端的请求之后,会使用一种 Demultiplexer 线程 进行处理。该线程根据请求的类型生成相应的 I/O 事件,然后通知 Selector 线程。都有哪些 I/O 事件呢?这取决于对 Reactor 模式的具体实现。对 Reactor 模式不同的实现方案可能会对 I/O 事件有不同的定义。前面讲过,请求至少可以分为建立连接和数据传输。还可以将数据传输分为读数据和写数据等。值得注意的是,Demultiplexer 线程 需要操作系统支持 I/O 多路复用技术,否则这种 Reactor 模式无法实现。现在的主流操作系统基本在很早以前就已经支持 I/O 多路复用技术了。

  Selector 线程 会选择自已感兴趣的 I/O 事件,然后将连接移交给 Handler 线程 进行处理。通常,开发者需要事先向 Selector 注册这些事件,然后 Selector 线程 才能在这些事件产生时被激活。根据不同业务的吞吐量不同,Selector 线程 可不止一个,但一般小于 Handler 线程。比方说,开发者可以让不同的 Selector 注册不同的 I/O 事件以避免单点阻塞问题。


【提示】

  为什么要使用超过一个的 Selector 线程 呢?注意,Handler 线程Selector 线程 属于不同的线程,所以 Handler 线程 被阻塞并不会影响 Selector 线程。但是,如果 Selector 线程 因为自已的原因被阻塞,这会导致后续的其它客户端请求无法处理。尽管通常不会为 Selector 线程 分配耗时任务,但是在高并发的要求下,这种阻塞也不能忽略。


  要注意的是,Demultiplexer 线程 属于操作系统管辖范围内,通常开发者无需关心也无法对其操作。Selector 线程Handler 线程 是开发者需要参与设计的内容,需要合理调整它们的比例来应对不同的业务要求。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值