设计模式--reactor 模式

news2024/11/26 0:53:11

说明

  1. 本文基于 tomcat 8.5.x 编写。
  2. @author blog.jellyfishmix.com / JellyfishMIX - github
  3. LICENSE GPL-2.0

介绍

reactor 模式通常应用于网络 IO 场景,高性能的中间件 redis, netty 都在使用。

背景

原始的网络 IO 模型

最原始的网络 IO 模型,服务器用一个 while 循环,持续监听端口是否有新的 socket 连接,如果有,那么就调用一个处理函数处理。如果没有则会阻塞直到有新的 socket 连接。

while(true) {
	socket = accept();
	handle(socket);
}

这种方式最大问题是无法并发,效率太低。如果当前的请求没有处理完,那么后面的请求只能被阻塞,服务器的吞吐量特别低。改进方式使用多线程,也就是很经典的 connection per thread,每一个连接用一个线程处理。

while(true) {
	socket = accept();
	new thread(socket);
}

当然每次处理请求 new 一个线程肯定是不合适的,创建销毁开销高,改进使用线程池:

while(true) {
	socket = accept();
	excutor.execute(socket);
}

tomcat 早期版本用过这种实现方式。多线程处理请求确实一定程度上提高了服务器的吞吐量,不同的请求由不同的线程负责处理,之前的请求在处理过程中,不会影响到后续的请求,做到了请求级别的线程隔离。

原始网络 IO 模型的缺点

  1. 线程的职责划分粒度太大,每一个线程把一次请求交互的事情全部做了,包括连接,读取和返回,限制了吞吐量。
  2. 应该把一次连接的操作划分为更细的粒度,这些更细的粒度是更小的线程。虽然这样整个线程池的数目会变多,但是线程职责单一,每个线程效率更高。这样演变出了 reactor 模式。

reactor 模式

初版简易 reactor 模式

  1. 在 reactor 模式中,负责处理 IO 事件的是 handler(事件处理函数),典型的 IO 事件有连接,读取和写入,每一个 handler 使用独立的线程处理一种事件。

  2. 一个全局 selector,我们把 channel(IO 事件传输的管道,socket 就是一种 channel)和 selector 关联,这个 selector 会不断在 channel 上调用 accept 函数,检测是否有该类型的事件发生。如果没有,那么 selector 线程会被阻塞,如果有则会调用对应的 handler 来处理。

img

主从 reactor 模式

  1. 主 reactor 负责监听 socket 连接,accept 连接后传递给从 reactor 处理,主从 reactor 使用不同的独立线程。
  2. 主 reactor 使用独立的线程来执行阻塞的 accept 函数监听 socket 连接,这样从 reactor(包含了 selector)不用去执行阻塞的 accpet 操作了,从 reactor 所在线程没有阻塞的操作。
  3. tomcat-connector 连接器模块下三大核心功能之一,网络通信的 IO 多路复用(同步非阻塞)实现 NioEndpoint,用的就是主从 reactor 模式。

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java学习笔记【8】异常

⛵ ⛵ ⛵ ⛵ ⛵ 🚀 🚀 🚀 🚀 🚀   大家好🤝,我是 👉老孙👈,未来学习路上多多关照 🤝 一个喜欢用 ✍️ 博客记录人生的程序猿 🙉&…

Python遥感图像处理应用篇(二十七):Python绘制遥感图像各波段热力图(相关系数矩阵)(续)

续-https://soderayer.blog.csdn.net/article/details/125757807 上一篇中使用csv文件计算的相关系数热力图,本篇我们直接使用遥感图像来计算图像波段之间的相关系数。 方法一:已有软件ENVI计算 实际上,目前已有的软件,如ENVI就可以直接计算图像波段之间的相关系数,该工…

【高精度定位】关于GPS、RTK、PPK三种定位技术的探讨

高精度定位通常是指亚米级、厘米级以及毫米级的定位,从市场需求来看,定位的精度越高往往越好。“高精度、低成本”的定位方案无疑将是未来市场的趋势。 在物联网时代,大多数的应用或多或少都与位置服务相关联,尤其是对于移动物体而…

深入理解MySQL——分库分表种类与原则

分库分表的种类 首先说明,这里所说的分库分表是指把数据库中数据物理地拆分到多个实例或多台机器上去,而不是MySQL原生的Partitioning。 这里稍微提一下Partitioning,这是MySQL官方版本支持的,在本地针对表的分区进行操作&#…

[Flask]各种子功能的实现

一、标准Flask架构搭建 ①config.py 新建一个文件config.py,在其中进行参数初始化,再使用下面代码加载到app.py(主程序)中 import config app.config.from_object(config) #由config.py初始化 ②exts.py 用于放置扩展模块&a…

(二十四)Vue之props配置项

文章目录props基本使用props的数组形式props的对象形式检测类型检测类型 其他验证Vue学习目录 上一篇:(二十三)Vue之ref属性 props props 可以是数组或对象,用于让组件接收外部传过来的数据 约定props是只读的,Vue…

开源 高性能 云原生!时序数据库 TDengine 上线亚马逊Marketplace

近日,涛思数据旗下开源、高性能、云原生的时序数据库(Time Series Database,TSDB)TDengine 成功上线亚马逊云科技 Marketplace,为用户提供了更加丰富的订阅渠道。 TDengine 是针对时序数据特点研发和优化的数据库解决方…

CentOS8 Elasticsearch8.x 安装遇到的问题解决汇总

报错清单 启动报错:ERROR: Elasticsearch exited unexpectedly curl测试报错:curl: (52) Empty reply from server 报错解决 启动报错 起因 使用archive方式安装elasticsearch后,在目录中运行./bin/elasticsearch报错如下: 原…

第二十七章 数论——快速幂与逆元

第二十七章 快速幂与扩展欧几里德算法一、快速幂1、使用场景2、算法思路(1)二进制优化思想(2)模运算法则3、代码实现(1)问题(2)代码二、快速幂求逆元1、什么是逆元?&…

结构体位段问题

每一位勇敢努力的少年,必将不负众望! 什么是位段 位段的详细解释 位段其实也是一种结构体的类型 1.位段的成员是 int ,short int unsigned int , signed int , short , char 类型 2.位段的成员名后有一个冒号和一个数字 看一个例子: st…

通过静态LSP、LDP LSP、MPLS TE三种方式实现总部与分支的互通

一、静态LSP 特点:类似静态路由,简单易用,手动建立lsp,定制转发路径,无需控制报文,资源消耗少。 缺点:不适合大型复杂拓扑,不能根据网络变化而动态调整,需要管理员手动调…

【jprofiler应用-oom原因定位】

1.安装jprofiler jprofiler_windows-x64_11_0_2.exe 2.使用KeyGen.exe生成注册码然后输入 3.idea中安装jprofiler插件 File-->Setting-->Plugins 搜索jprofiler插件然后安装 4.以一个内存溢出的程序为例子进行分析(一直分配内存,List容器引用着Student导致…

医疗产品设计的新趋势

随着个人健康和医疗数据技术的发展,消费者可以选择更多的方法来跟踪和管理他们的健康状况,因此医疗产品开始转向更多的健康预防领域。医疗器械设计公司认为,随着医疗产品设计从医疗产品转向家庭,医疗产品的设计需要考虑更多的新问…

【HTML+CSS+JavaScript】实现简单网页版的飞机大战

文章目录【HTMLCSSJavaScript】实现简单网页版的飞机大战一. HTML部分代码二. CSS部分代码三. JavaScript部分代码四. 完整的代码和图片获取【HTMLCSSJavaScript】实现简单网页版的飞机大战 本文分享的是键盘版飞机大战的代码,且文章末尾有惊喜。 效果图&#xff1a…

前端食堂技术周刊第 64 期:Node.js 19、Interop 2022、SvelteKit 1.0、2022 Web 性能回顾、最流行的 Node.js

美味值:🌟🌟🌟🌟🌟 口味:冰糖雪梨 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 Node.js 19 的新特性Interop 2022 年终更新SvelteKit 1.02022 Web 性能回…

Python爬虫学习第十二天---scrapy学习

Python爬虫学习第十二天—scrapy学习 一、scrapy的概念和流程 1、scrapy概念 Scrapy是一个Python编写的开源网络爬虫框架,它是一个被设计用于爬取网络数据、提取结构性数据的框架。Scrapy文档地址:http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/…

采用抓包的方式逆向获得谷歌翻译的API

文章目录最开始的尝试2022.12.26谷歌翻译API相关信息发送网址提交的数据不过不出意外的失败了实验去掉参数去掉Headers代码对返回结果进行解析完整代码最开始的尝试 谷歌的翻译API老是发生变化,我们需要自己动手来找到谷歌的翻译API,这样才是最稳妥的解决…

个人博客系统(前后端分离)

努力经营当下,直至未来明朗! 文章目录一、项目简介二、项目效果三、项目实现1. 软件开发的基本流程2. 博客系统 需求分析3. 博客系统 概要设计4. 创建maven项目5. 编写数据库操作的代码四、项目代码总结普通小孩也要热爱生活! 一、项目简介 …

Mac 音频转换器推荐 DRmare Audio Converter、Audi Free Auditor

Mac 音频转换器推荐 DRmare Audio Converter、Audi Free Auditor 给大家推荐两款 Mac 上的音频转换器,这两款转换器都可以转换苹果音乐,iTunes歌曲或者一些常规的音轨到MP3, FLAC, WAV, M4A, AAC格式等等,转换后我们就可以在所有的设备和播放…

stm32f407VET6 系统学习 day06 窗口看门狗, IIC 通信协议

1.独立看门狗,与窗口看门狗的差别 1. 差别1 : 窗口看门狗, 有上限 0x7F, 有下限 0x40 ,, 独立看门狗只有下限 0 2. 差别2: 时钟源不同, 独立看门狗:LSI 窗口…