Reactor模式Proactor模式

news2024/12/23 9:10:07

1.Reactor/Dispatcher模式

1.1 概述

Reactor模式下,服务端的构成为Reactor + 处理资源池。其中,Reactor负责监听和分发事件,而处理资源池则负责处理事件。
该模式下的组合方案有下面几种(第三种几乎没有被实际应用):

  1. 1 * Reactor + 1 * Worker。
  2. 1 * Reactor + n * Worker。
  3. n * Reactor + 1 * Worker
  4. n * Reactor + n * Worker。

注:Worker是指负责处理事件的工作进程/线程。

n * Reactor + 1 * Worker 没有应用的原因(类比Redis为什么始终坚持单线程处理(执行)指令的原因):

  1. 复杂且没有性能优势。
    1. 复杂:多个Reactor去接收用户请求,这就需要处理好线程并发问题。
    2. 没有性能优势:多线程并发,如果是在单核上,可能会面临频繁的线程上下文切换,开销较大。其次,由于我们基本上是在内存中进行请求接收的,因此主要的瓶颈不在于线程数量而在于网络时延&带宽。
  2. 多个reactor去负责接待请求,而真正服务请求的时候确实串行的,你不觉得?。。。

1.2 实现方式

1.2.1 1 * Reactor + 1 * Worker

1.2.1.1 概述


该模式下的三种角色:

  • reactor:负责监听和分发事件。
  • acceptor:获取连接。
  • handler:处理事件。

执行流程

  1. reactor通过select系统调用持续监听IO事件,若监听到有事件发生,则根据事件类型进行分情况处理:
    1. 若为连接事件:则将该事件**分发(dispatch)**给acceptor处理,acceptor在收到该事件后,会通过accept系统调用新建一个连接并同时创建一个handler来处理后续的事件。
    2. 若不是连接事件:则交由handler进行事件处理。
1.2.1.2 评估
  • 该方案不适用于计算密集型场景,仅适用于业务耗时短的场景。
  • 由于全程采用单进程/线程监听&处理任务,因此无法充分利用多核CPU的性能。而且,一旦事件消费的过程中,某个事件的消费耗时特别长,它将影响到后续事件的响应,一般体现在延迟的增加方面。

C语言编写的服务端程序,其模式为1 * Reactor + 1 * 进程,而Java的则是1 * Reactor + 1 * 线程(JVM是一个进程,你所写好的Java程序是其中的一个线程)。
Redis 6.0- 采用的是1 * Reactor + 1 * 进程

1.2.2 1 * Reactor + n * Worker

1.2.2.1 概述


与前面不同的是:
handler不在负责事件的处理,而是负责数据的接收与发送。
handler在通过read系统调用拿到数据后,会将其转交给子线程中的processor进行处理,然后processor处理完成后,再将处理好的数据返回给handlerhandler再通过send系统调用将结果发回客户端。

1.2.2.2 评估
  • 该方案能够充分利用多核CPU的性能。
  • 由于该方案采用多进程/线程来进行事件的处理,因此需要注意在多线程环境下的共享数据的安全问题,而这实现起来,因此该方案较前者复杂一些。
  • 需要注意在高并发环境下,1个reactor可能会成为性能瓶颈的隐患。

1.2.3 n * Reactor + n * Worker

1.2.3.1 概述


与前面不同的是:
handler又再次负责事件的处理了。
对于新的连接事件,将首先分发给acceptor,然后acceptor创建出一个连接来,并将其分发给众多子线程中的其中一个线程。
被选中的这个线程中的reactor将通过select系统调用对该连接进行持续监听,一旦监听到有IO事件发生,便分发给该线程所对应的handler去处理…(后续处理过程一样的)

1.2.3.2 评估
  • 消除了单reactor所带来的潜在的性能瓶颈隐患。
  • 该方案看上去比前者复杂,其实其结构是清晰的,实施起来是简单的:
    • 主线程、子线程分工明确,主线程负责接收新连接,子线程负责事件处理。
    • 不必为主线程与子线程之间的通信而感到苦恼,因为数据流是由主线的单向流动到子线程中,即在子线程拿到新连接,监听并处理好一个IO事件后,不必将数据再返回给主线程,而是直接由子线程自己返回给客户端。

Netty、Memcache、Nginx均采用了此方案。
Nginx的方案与上面的并不完全相同,它选择去掉主线程部分,即连接的接收可以由每个子线程来完成。

2.Proactor模式

2.1 概述


执行流程:

  1. 进程通过Proactor Initiator借助Asynchronous Operatio Processor注册proactorhandler到内核上。
  2. 后面将由Asynchronous Operatio Processor 负责请求的接收与IO操作,一旦接收到IO事件,它将自动进行IO操作,当IO完成后,它将通知Proactor,然后Proactor再根据具体的事件类型回调handler进行处理。

2.2 评估

  • 实现了异步I/O,即数据的准备和由内核拷贝至用户缓冲区的过程均无需用户进程(或者CPU)参与。

目前仅有Windows系统平台完全实现系统级别下的了异步I/O——IOCP
Linux平台尽管也有POSIX定义的异步IO接口aio函数,但它是用户层面的实现,而且仅支持本地文件的异步IO操作,不支持网络I/O。但是,在Linux 5.1之后,又引入io_uring异步I/O操作接口,它绝对是一个实打实的系统基本的实现,并且也可以用于网络I/O,并且它无需中断即可实现I/O操作,非常惊艳。

3.两种模式的对比

  • reactor模式下,reactor所感知到的事件是待完成的I/O事件,后续handler处理需要先把数据由内核缓存拷贝至用户缓冲区中才能继续处理事件,这种I/O模式属于非阻塞式I/O同步I/O
  • proactor模式下,proactor所感知到的事件是已完成的I/O事件,即不需要handler再去拷贝数据了,而是直接去处理事件,这种I/O模式属于非阻塞式I/O异步I/O,效率更高。

参考文档

9.3 高性能网络模式:Reactor 和 Proactor


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

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

相关文章

AURIX TC3xx单片机介绍-启动过程介绍1

从各个域控制器硬件解决方案来看,MPU可能来自多个供应商,有瑞萨,有NXP等,但对于MCU来说,基本都采用英飞凌TC3xx。 今天我们就来看一下TC3xx的启动过程,主要包含如下内容: uC上电过程中,会经过一个上电时序,从复位状态“脱离”出来;Boot Firmware是复位后第一个执行的…

设计模式:原型模式(Prototype)

设计模式:原型模式(Prototype) 设计模式:原型模式(Prototype)模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景模式扩展应用实例实例 1&am…

SecureCRT for Mac注册激活版:专业终端SSH工具

SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件。 SecureCRT支持SSH,同时支持Telnet和rlogin协议。SecureCRT是一款用于连接运行包括Windows、UNIX和VMS的理想工具。通过…

user-agents,一个无敌的 Python 库!

更多Python学习内容:ipengtao.com 大家好,今天为大家分享一个无敌的 Python 库 - user-agents。 Github地址:https://github.com/selwin/python-user-agents 在Web开发和数据分析中,了解用户的设备和浏览器信息是非常重要的。通过…

开发一个comfyui的自定义节点

文章目录 目标功能开发环境comfyui自定义节点的实现原理仓库地址完整代码目标功能 开发一个comfyui的自定义节点,该节点的功能是:可以对comfyui工作流中最终输出的图像添加一些自定义文案,且可以指定文案在图像上的位置、文案的字体样式、字体大小、字体颜色等。最终效果如…

Go语言之GORM框架(三)——Hook(钩子)与Gorm的高级查询

Hook(钩子) 和我们在gin框架中讲解的Hook函数一样,我们也可以在定义Hook结构体,完成一些操作,相关接口声明如下: type CreateUser interface { //创建对象时使用的HookBeforeCreate() errorBeforeSave() errorAfterCreate() …

小识MFC,一套设计优雅与不优雅并存的类库----小话MFC(2)

Q1: CPoint继承于POINT,这样有什么好处? A: 继承的一个最基本的好处当然就是减少代码量。CPoint和POINT内部数据一样,只是一个提供了更多的方法来操作对象。 typedef struct tagPOINT {LONG x;LONG y; } POINT, *P…

ARM IHI0069F GIC architecture specification (7)

3.1 GIC逻辑组件 GICv3体系结构由一组逻辑组件组成: •Distributor。 •每个受支持的PE都有一个Redistributor。 •支持的每个PE都有一个CPU interface。 •中断翻译服务组件(ITS),支持将事件翻译为LPI。 Distri…

APM2.8飞控

ArduPilotMega 主控可应用于 固定翼、直升机、多旋翼、地面车辆 APM2.8飞控供电有两种 1.电流计供电, 2.带BEC(稳压功能)的电调供电 ArduPilotMega 内部的硬件结构图: 调试时,不要使用向导,由于向导功能不…

windows内存管理

一 windows系统的内存管理涉及哪些 1.1 虚拟内存管理机制 windows操作系统使用虚拟内存技术,将磁盘文件,通过映射对象(存储在物理内存)关联,映射到虚拟内存作为文件试图。即用户操作"虚拟内存中File View Objec…

卷出新高度,直呼太强!时隔三月,YOLO再度进化升级:《YOLOv10—实时端到端目标检测》重磅来袭

真的是不止一次感叹,学习的速度都跟不上发论文出新品的速度。。。。。 继前文YOLOv9发布以来也就不到三个月的时间,YOLOv10就来了! 《太卷了,目标检测新成员——YOLOv9: Learning What You Want to LearnUsing Programmable Gra…

openflow协议抓包分析

1、准备实验拓扑: 在Mininet环境中创建一个简单的SDN拓扑,包括控制器、交换机、主机等。 确保拓扑能够正常运行,SDN交换机与控制器建立连接。 采用主机Ubuntu22.04主机,IP地址是192.168.87.130,安装opendaylight控制…

DreamerV3阅读笔记

DreamerV3 文章希望解决的一个挑战是用固定的hyperparameter来同时处理不同domain的任务。文章发现,通过结合KL balancing 和free bits可以使得world model learn without tuning(是指上面这件事,即不需要对不同任务改变hyperparameter&#…

力扣239. 滑动窗口最大值

Problem: 239. 滑动窗口最大值 文章目录 题目描述思路复杂度Code 题目描述 思路 1.编写实现优先队列类: 1.1.实现push(int n):将元素n添加到队列尾,同时将n前面大于n的元素删除 1.2.实现int max():将队列头元素取出(由于实现了push所以此时队…

【Python性能优化】取最值的差异

取最值的差异 测试Windows 测试结果Linux 测试结果 测试 测试内容:从一组 x, y, z 坐标值中获得每个维度(x、y、z)的值域范围。此处不考虑将数据临时存放到内存,再整组获取值域的操作(因为对单文件这么做问题不大&…

多线程基本常识

多线程的状态 在Java中,一个线程的生命周期有以下几种状态: 新建(New):当线程对象被创建时,线程处于新建状态。此时线程对象存在,但还没有调用start()方法启动线程。 运行(Runnable…

Prometheus Operator创建告警规则并接入钉钉报警

prometheus之钉钉报警 前言1. 添加prometheus报警规则1.2 添加自定义报警规则文件 2. 配置钉钉报警2.2 部署dingding插件 3. 编写alertmanager配置文件 前言 在kubenetes上安装了kube-promethues(包含Prometheus Operator),程序正常跑起来了&#xff0c…

【找出缺失的观测数据】python

思路: 主要在于分配剩余的部分分配问题 代码: class Solution:def missingRolls(self, rolls: List[int], mean: int, n: int) -> List[int]:m len(rolls)total_sum (n m) * meantoset total_sum - sum(rolls)# 检查 toset 是否在可能的范围内i…

影响所有股票、债券和ETF交易!一文看懂美国“T+1”结算新规

T1对投资者有何好处?有哪些风险?T1已经到来,T0还远吗? 美股将在本周迎来历史性时刻。 从当地时间5月28日开始,美股交易结算周期将由T2缩短至T1,即投资者当天卖出的股票,在交易后一个工作日就能…

C# Chart图表应用

1,Chart简介 Chart控件是微软自带的一种图形可视化组件,使用简单灵活。在.NET4.0之后(即VS2010之后)已集成在了VS里面,直接拖拽控件到窗体即可使用。 需要使用命名空间:using System.Windows.Forms.DataVis…