从零学Netty(四)Reactor模式(含demo)

介绍

  • Reactor模式是一种为处理并发I/O服务请求,并将请求提交到一个或多个服务处理程序的事件设计模式
  • 当客户端请求抵达后,服务处理程序使用多路分配策略,由一个非阻塞的线程来接收所有请求,然后将请求派发到相关的工作线程并进行处理的过程。
  • 和普通函数调用不同的是应用程序不是主动的调用某个API来完成处理,恰恰相反的是Reactor逆置了事件处理流程
  • 应用程序需提供相应的接口,如果有相应的事件发生,Reactor将主动调用应用程序注册的接口
  • 对于高并发系统经常会使用到Reactor模式,用来替代常用的多线程处理方式以节省系统资源并提高系统的吞吐量

对比传统I/O

  1. 基于I/O复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接
  2. 基于线程池复用线程资源:不必再为每个连接创建线程,将连接完成后的业务处理分配给线程处理,一个线程可以处理多个连接的业务

Reactor 3种经典实现

  1. 单Reactor单线程
  2. 单reactor多线程
  3. 主从Reactor多线程

Netty主要基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor

在网上找了一个写的非常好的 实现三种模式的代码 所以我就不自己实现了

代码地址:https://github.com/chuondev/reactor

如果连接打不开 在文章结尾的连接里也附带了代码

Reactor 模式中的核心组成

  • Reactor:Reactor在一个单独的线程中运行,负责监听和分发事件,分发给适当的处理程序来对I/O事件作出反应(例如:公司前台漂亮小姐姐)
  • Handlers:处理程序执行I/O事件要完成的实际事件(例如:通过前台小姐姐找到帮你处理实际问题的帅哥)
  • Acceptor:处理客户端新连接,并分派请求到处理器链中

Reactor通过调度适当的处理程序来响应I/O事件,处理程序执行非阻塞操作

单Reactor单线程

  • 优点:模型简单,没有多线程,进程通信,竞争的问题,全部都在一个线程中完成
  • 缺点:性能问题,无法发挥多核CPU的性能,可靠性问题,线程意外终止或死循环,会导致整个系统不可用
  • 使用场景:客户端数量有限,业务处理快速,比如Redis在业务处理的事件复杂度O(1)的情况

单reactor多线程

  • 优点:充分利用多核CPU的处理能力
  • 缺点:多线程数据共享和访问比较复杂,Reactor处理所有的事件的监听和响应在单线程运行,高并发场景容易出现瓶颈

主从Reactor多线程

  • 优点:父线程与子线程的数据交互简单职责明确,父线程只需要接收新连接,子线程完成后续的业务处理
  • 缺点:编程复杂度高
  • 实例:Nginx主从Reactor多进程模型,Netty主从多线程模型

总结

  • 响应快,不必为单个同步时间所阻塞,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销
  • 扩展性好,可以通过增加Reactor实例来充分利用CPU资源
  • 复用性好,Reactor模型本身与具体事件处理逻辑无关,具有很高的复用性

项目已上传到gitee

地址: netty-demo

如果帮到您了,请帮忙点个star

猜你喜欢

转载自blog.csdn.net/weixin_40461281/article/details/109031199