Reactor 模型

服务端如何处理请求:后端接收到一个请求,简化下会做以下四个操作:

  1. 建立连接
  2. 读取数据
  3. 业务操作
  4. 写回数据

Reactor的核心思想Reactor 模式也叫 Dispatcher 模式,将关注的IO事件注册到多路复用器上,一旦有IO事件触发,将事件分发到事件处理器中,执行就绪IO事件对应的处理函数中。模型中有三个重要的组件:

  • Reactor:在一个单独的线程中运行,负责监听和分发事件,分发给适当的处理程序来对 IO 事件做出反应。
  • Handlers:处理程序执行IO事件要完成的实际事件,Reactor通过调度处理程序来响应IO事件,处理程序执行非阻塞操作。

Reactor模式演进

Reactor 模型取决于 Reactor 的数量和 Hanndler 线程数量的不同,Reactor 模型有 3 个变种:

  • 单线程Reactor模式:单Reactor单线程Hanndler
  • 多线程Reactor模式:单Reactor多线程Hanndler
  • 主从Reactor模式:主从Reactor多线程Hanndler

Reactor 就是一个执行 while (true) { selector.select(); …} 循环的线程,会源源不断的产生新的事件,称作反应堆很贴切。

单线程Reactor模式

单线程Reactor模式 : 建立连接,读取/写回数据和业务操作都在同一个Reactor线程中执行,虽然Reactor的读取写回不会造成阻塞,但是业务操作就很可能造成阻塞;并且单线程不能充分利用CPU多核优势,因此处理能力是有限的,对于小量连接情况下问题不大,对于大量链接情况下,单个NIO线程因处理能力有限会导致连接大量超时。

多线程Reactor模式

将非IO的业务逻辑操作从Reactor线程上卸载,以此来加速Reactor线程对IO请求的响应。

多线程Reactor模式:多线程模式下把业务操作(decodecomputeencode)等放到线程池中处理,保证Reactor线程不会阻塞,而Reactor仍为单个线程仍然要处理连接和读取/写回操作,其承担连接负载量上来时仍然承受很大压力(例如并发百万客户端连接,或者服务端需要对客户端握手进行安全认证,但是认证本身非常损耗性能)

主从Reactor模式

主从Reactor模式:相比多线程Reactor模式,主从Reactor模式下把IO读取/写回两个操作放在 从Reactor线程池 中执行, 主Reactor线程也就是Acceptor只负责建立连接,建立之后将其注册到 从Reactor线程 中,因此大大提高了负载能力。同时为了避免并发问题还要保证一个连接只能注册一个Reactor线程上

  • MainReactor负责客户端的连接请求,并将请求转交给 SubReactor
  • SubReactor负责相应通道的IO读写操作
  • 非IO请求(具体逻辑处理)的任务则会交由工作线程池处理

好处:因为subReactor也会执行一些比较耗时的IO操作,例如消息的读写,使用多个线程去执行,则更加有利于发挥CPU的运算能力,减少IO等待时间。

参考

Scalable IO in Java

Netty–Reactor模型的应用

热评文章