首页 > 其他分享 >【设计模式】Reactor 模式简介

【设计模式】Reactor 模式简介

时间:2024-03-12 16:25:29浏览次数:27  
标签:Reactor 简介 模式 线程 IO 服务员 设计模式 客人

如果你熟悉 Java 的 23 种设计模式,看到“Reactor 模式”可能就会一脸懵逼,这是什么鬼。Reactor 是一种应用在服务器端的开发模式(也有说法称 Reactor 是一种 IO 模式),目的是提高服务端程序的并发能力。

Reactor 模式

它要解决什么问题呢?传统的 thread per connection 用法中,线程在真正处理请求之前首先需要从 socket 中读取网络请求,而在读取完成之前,线程本身被阻塞,不能做任何事,这就导致线程资源被占用,而线程资源本身是很珍贵的,尤其是在处理高并发请求时。

而 Reactor 模式指出,在等待 IO 时,线程可以先退出,这样就不会因为有线程在等待 IO 而占用资源。但是这样原先的执行流程就没法还原了,因此,我们可以利用事件驱动的方式,要求线程在退出之前向 event loop 注册回调函数,这样 IO 完成时 event loop 就可以调用回调函数完成剩余的操作。

所以说,Reactor 模式通过减少服务器的资源消耗,提高了并发的能力。当然,从实现角度上,事件驱动编程会更难写,难 debug 一些。

餐厅里的 Reactor 模式

我们用“餐厅”类比的话,就像下图:

对于每个新来的顾客,前台都需要找到一个服务员和厨师来服务这个顾客。

  1. 服务员给出菜单,并等待点菜
  2. 顾客查看菜单,并点菜
  3. 服务员把菜单交给厨师,厨师照着做菜
  4. 厨师做好菜后端到餐桌上

这就是传统的多线程服务器。每个顾客都有自己的服务团队(线程),在人少的情况下是可以良好的运作的。现在餐厅的口碑好,顾客人数不断增加,这时服务员就有点处理不过来了。

这时老板发现,每个服务员在服务完客人后,都要去休息一下,因此老板就说,“你们都别休息了,在旁边待命”。这样可能 10 个服务员也来得及服务 20 个顾客了。这也是“线程池”的方式,通过重用线程来减少线程的创建和销毁时间,从而提高性能。

但是客人又进一步增加了,仅仅靠剥削服务员的休息时间也没有办法服务这么多客人。老板仔细观察,发现其实服务员并不是一直在干活的,大部分时间他们只是站在餐桌旁边等客人点菜。

于是老板就对服务员说,客人点菜的时候你们就别傻站着了,先去服务其它客人,有客人点好的时候喊你们再过去。对应于下图:

reactor-new-servers

最后,老板发现根本不需要那么多的服务员,于是裁了一波员,最终甚至可以只有一个服务员。

这就是 Reactor 模式的核心思想:减少等待。当遇到需要等待 IO 时,先释放资源,而在 IO 完成时,再通过事件驱动 (event driven) 的方式,继续接下来的处理。从整体上减少了资源的消耗。

参考

标签:Reactor,简介,模式,线程,IO,服务员,设计模式,客人
From: https://www.cnblogs.com/RioTian/p/18068586

相关文章

  • 设计模式
    工厂模式工厂模式提供了一种获取对象的方法。作用:封装创建对象的细节。实现类鱼类的解耦操作装饰模式在不改变一个类的基础上,动态扩展一个类的功能。单例模式饿汉单例/***@authorPickle*@versionV1.0*@date2024/3/1214:51*/publicclassSingleInsta......
  • c++从零实现reactor高并发服务器!!!
    环境准备linux虚拟机安装升级c/c++编译器gcc/g++选项源代码文件1源代码文件2...源代码文件n-o指定输出的文件名(不能和源文件同名默认是a.out)-g调试-On链接时优化减小体积(n=1-3)-c只编译用于生成库-std=c++11支持c++11标准安装man功能man级别接口......
  • mybatis01 - 简介
      1.1、什么是Mybatis?MyBatis是一款优秀的持久层框架。它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO(PlainOldJavaObject,普通老式Ja......
  • 小白一眼就能懂的JSON简介与基本使用指南
    前言JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,具有易读易写的特点,广泛应用于Web开发和数据传输领域。本文将介绍JSON的基本概念、语法结构以及常见的使用方法,帮助读者快速上手JSON数据格式。JSON简介JSON起源于JavaScript语言,但已成为一种独立于编程语言的数......
  • ARM MMU和cache简介 --20240310
    参考博客:与程序员相关的CPU缓存知识MMU:memorymanagementunit,称为内存管理单元,或者是存储器管理单元,MMU是硬件设备,它被保存在主存(mainmemory)的两级也表控制,并且是由协处理器CP15的寄存器1的M位来决定是enabled还是disabled。MMU的主要作用是负责从CPU内核发出的虚拟地址到物......
  • SMMU简介 --20240310
    名词解析:TCU:translationcontrolunitTBU:tanslationbufferunitIOVA:IOvirtualaddressIPA:intermediatephysicaladdress SMMU基础概念:MMU是用于CPU访问资源(DDR、外设等)做地址转换,SMMU是用于外设(可以发起访问的master设备)访问资源(DDR、外设等)做地址转换的。 TCU用来......
  • ISA指令集架构简介与蜂鸟E203处理器公开资料整合
    ISA(InstructionSetArchitecture)指令集架构可分为CISC与RISC:CISC(ComplexInstructionSetComputer)计算机复杂指令集,不仅包含了处理器常用的指令,还会含有许多不常用的特殊指令。这会导致其指令集的数目较多,故称为复杂指令集。RISC(ReducedInstructionSetComputer)计算机精简......
  • ModbusTCP协议简介与编程流程图
      本文主要目的是为了写一个简单的ModbusTCP服务器-客户端程序而记录的知识点,里面包含了编程所需要的必要背景知识和协议解析流程图。Modbus基本数据类型  Modbus有四种基本数据类型:离散量输入:客户端只能读取它,由服务器提供,占1个比特位,可以传输现实中的开关量输入,比如接近......
  • 运营助理/专员工作个人简介
    个人简历简历打印pdf:word: 个人信息姓名:[孙文杰]性别:[男]出生年月:[2000.09.15]联系电话:[17777828775]电子邮箱:[[email protected]] 教育背景[会计],  [北京邮电大学世纪学院],[2017-2021]【自考本科】 校园经历2017-2018   旅游学院团委学生会文艺部   副......
  • Go语言实现设计模式之命令模式
    摘要:命令模式是一种常用的设计模式,它将请求封装成对象,从而使请求的发送者和接收者解耦。本文将详细介绍命令模式的概念和原理,并使用Go语言实现一个示例,以帮助读者更好地理解该设计模式的应用。引言:在软件开发中,命令模式是一种常见的设计模式,它可以帮助我们将请求的发送者和接收......