当前位置: 首页 > news >正文

Reactor设计模式

Reactor设计模式

Reactor模式称为反应器模式或应答者模式,是基于事件驱动的设计模式,拥有一个或多个并发输入源,有一个服务处理器和多个请求处理器,服务处理器会同步的将输入的请求事件以多路复用的方式分发给相应的请求处理器。

Reactor设计模式是一种为处理并发服务请求,并将请求提交到一个或多个服务处理程序的事件设计模式。当客户端请求抵达后,服务处理程序使用多路分配策略,由一个非阻塞的线程来接收所有请求,然后将请求派发到相关的工作线程并进行处理的过程。

在事件驱动的应用中,将一个或多个客户端的请求分离和调度给应用程序,同步有序地接收并处理多个服务请求。对于高并发系统经常会使用到Reactor模式,用来替代常用的多线程处理方式以节省系统资源并提高系统的吞吐量。

Reactor结构

img

  • Handle(事件)。Reactor整体是基于Handle进行驱动,这里的Handle叫做事件,可以类比为BIO中的Socket,NIO中的Socket管道。比如当Socket管道有连接建立,或者有数据可读,那么此时就称作事件发生;
  • Event Handler(事件处理器)。有事件发生,就需要有相应的组件来处理事件,那么这里的组件就叫做事件处理器。Event Handler是一个抽象概念,其会有不同的具体实现,因为事件会有不同的类型,那么不同类型的事件,肯定都需要有相应的具体处理逻辑,这里的具体处理逻辑,就由Event Handler的具体实现来承载;
  • Concrete Event Handler(具体事件处理器)。是Event Handler的具体实现,用于处理不同类型的事件;
  • Synchronous Event Demultiplexer(事件多路分解器)。(这里将Synchronous Event Demultiplexer简称为Demultiplexer)Demultiplexer用于监听事件并得到所有发生事件的集合,在监听的状态下是阻塞的,直到有事件发生为止。Demultiplexer有一个很好的类比,就是NIO中的多路复用器Selector,当调用Selector的select() 方法后,会进入监听状态,当从select() 方法返回时,会得到SelectionKey的一个集合,而每一个SelectionKey中就保存着有事件发生的Socket管道;
  • Initiation Dispatcher(事件分发器)。现在已经有Concrete Event Handler(具体事件处理器)来处理不同的事件,也能通过Synchronous Event Demultiplexer(事件多路分解器)拿到发生的事件,那么最后需要做的事情,肯定就是将事件分发到正确的事件处理器上进行处理,而Initiation Dispatcher就是完成这个分发的事情。

通常,Reactor设计模式中的Reactor,可以理解为上述图中的Synchronous Event Demultiplexer + Initiation Dispatcher

Reactor中的核心组件:

  • Reactor
    IO事件的派发者,相当于有分发功能的Selector
  • Acceptor
    接收客户端连接并建立对应客户端的Handler,向Reactor注册此Handler。相当于NIO中建立连接的那个判断分支。
  • Handler
    和一个客户端通讯的实体,一般在基础的Handler上会有更进一步的层次划分,用来抽象诸如decodeprocessencode这些过程。相当于消息读写处理等操作类。

在Reactor模式中,acceptor和handler都属于事件处理器。不过,它们处理的事件类型和职责有所不同:

  • Acceptor:是一种特殊的事件处理器,专门负责处理新的连接请求。当Reactor将新的连接请求事件分发给acceptor时,acceptor会调用底层系统的accept函数来接受这个连接,然后通常会为这个新的连接创建一个新的handler来处理后续的事件(比如数据读写)。
  • Handler:通常指的是连接建立之后用于处理特定事件的组件,如读取客户端发送的数据、处理业务逻辑、向客户端发送响应等。Handler响应其他类型的事件,如可读事件、可写事件等。

Reactor三种模型

Reactor从线程池和Reactor的选择上可细分为:Reactor单线程模型、Reactor多线程模型,Reactor主从模型

Reactor单线程模型

单线程的Reactor模式对于客户端的所有请求使用一个专门的线程去处理,这个线程无限循环地监听是否有客户端的请求抵达,一旦收到客户端的请求,就将其分发给响应处理程序进行处理。

单线程的Reactor与NIO流程类似,只是将消息相关处理独立到Handler中。虽然NIO中一个线程可以支持所有的IO处理,但瓶颈也是显而易见的。如果某个客户端多次进行请求时在Handler中的处理速度较慢,那么后续的客户端请求都会被积压,导致响应变慢。所以需要引入Reactor多线程模型。

单线程的Reactor的特点是只有一个Reactor线程,也就是说只有一个Selector事件通知器,因此字节的读取I/O和后续的业务处理process()均由Reactor线程来做,很显然业务的处理影响后续事件的分发,所以引出多线程版本进行优化。

在这里插入图片描述

Reactor多线程模型

考虑到工作线程的复用,可以将工作线程设计线程池。将处理器的执行放入线程池,并使用多线程处理业务逻辑,Reactor仍然是单个线程。

多线程的Reactor的特点是一个Reactor线程和多个处理线程,将业务处理即process交给线程池进行了分离,Reactor线程只关注事件分发和字节的发送和读取。需要注意的是,实际的发送和读取还是由Reactor来处理。当在高并发环境下,有可能会出现连接来不及接收。

在这里插入图片描述

Reactor主从模型

对于多个CPU的机器,为了充分利用系统资源会将Reactor拆分为两部分。

  • Main Reactor 负责监听连接,将accept连接交给Sub Reactor处理,主Reactor用于响应连接请求。
  • Sub Reactor 处理accept连接,从Reactor用于处理IO操作请求。

主从Reactor的特点是使用 一个Selector池,通常有一个主Reactor用于处理接收连接事件,多个从Reactor处理实际的IO。整体来看,分工合作,分而治之,非常高效。

在这里插入图片描述


参考文章:

Reactor设计模式 - 思凡念真 - 博客园

一文搞懂Reactor模型与实现-CSDN博客

Reactor线程模型-CSDN博客

相关文章:

  • P3128 [USACO15DEC] Max Flow P题解(树上差分,最近公共祖先,图论)
  • Golang | Leetcode Golang题解之第111题二叉树的最小深度
  • Python | Leetcode Python题解之第111题二叉树的最小深度
  • Python基础学习笔记(七)——元组
  • python从入门到精通02
  • SELINUX=enforcing时无法启动httpd服务的解决方案(semanage命令以及setroubleshoot-server插件的妙用)
  • 门禁-jenkins的构建状态同步到gitlab提交流水线
  • C++中的模板类的定义与使用
  • win11 通过防火墙设置-开通本地端口
  • Linux Tcpdump抓包入门
  • 汇编实现的操作系统
  • k8s二进制安装与部署
  • 05. Redis 持久化
  • 解决在cmd里下载的库,但IDLE还是显示不存在的问题
  • 多分类逻辑回归:一种基于概率的分类方法
  • 2018一半小结一波
  • canvas 高仿 Apple Watch 表盘
  • Date型的使用
  • Django 博客开发教程 16 - 统计文章阅读量
  • django开发-定时任务的使用
  • fetch 从初识到应用
  • Gradle 5.0 正式版发布
  • HTML中设置input等文本框为不可操作
  • JAVA SE 6 GC调优笔记
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • laravel 用artisan创建自己的模板
  • PAT A1017 优先队列
  • Spring Cloud中负载均衡器概览
  • springboot_database项目介绍
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 闭包--闭包作用之保存(一)
  • 前言-如何学习区块链
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 湖北分布式智能数据采集方法有哪些?
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 如何在招聘中考核.NET架构师
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #职场发展#其他
  • (1)无线电失控保护(二)
  • (MATLAB)第五章-矩阵运算
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (转)大型网站架构演变和知识体系
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Core 中的路径问题
  • .Net 路由处理厉害了
  • .NET 使用配置文件
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET上SQLite的连接
  • .NET中统一的存储过程调用方法(收藏)