Reactor模型详解

目录

1.概述

[2.Single Reactor](#2.Single Reactor)

[3.muduo库的Multiple Reactors模型如下](#3.muduo库的Multiple Reactors模型如下)


1.概述

维基百科对Reactor模型的解释

The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.

Reactor模型设计模式是用于处理服务请求的事件处理模式,通过一个或多个输入同时传递到服务处理程序。然后,服务处理程序对传入的请求进行反复用,并将它们同步调度到关联的请求处理程序。

重要组件:Event事件、Reactor反应堆、Demultiplex事件分发器、Evanthandler事件处理器

2.Single Reactor

在整个的基于Reactor模型的网络服务器在交互的时候,首先,我们把事件注册到反应堆上,也就是说,应用程序对这个事件感兴趣,请求反应堆帮忙来监听它所感兴趣的事件,并且在这个事件发生的时候调用相应的预置的回调Handler,向反应堆注册事件,意思就是把这个事件event和对应的handler(一个event对应一个Evanthandler)都给到reactor反应堆。

反应堆存储着事件event事件以及事件处理的集合,在实际的事件的处理中可以添加更多选项,比如说,事件添加的时间,事件响应的时间等等。在这里简单的添加了事件event以及事件的处理器handler。

反应堆维护了事件以及事件处理的集合,reactor反应堆根据epoll_ctrl对事件分发器进行事件的设置,调整,添加新的事件,修改已有的事件,删除已添加的事件,然后启动反应堆,反应堆的后端就会驱动事件分发器的启动,多路复用,就是在开启epoll_wait,因为事件分发器在开启epoll_wait之前,reactor已经调用相应的方法把应用程序注册过来的事件进行添加,调整,删除,多路复用开启,epoll_wait开始,整个服务器处于阻塞的状态等待新用户的连接,或者是已连接用户的读写事件。

如果epoll_wait有监听到新的事件的产生,那么多路复用分发器就会把这个分发的事件给反应堆返回,因为事件发生了,在reactor模型里,就要调用事件的处理器。

多路复用分发器在监听到事件发生的时候,不知道事件对应的处理器在哪,都是在反应堆维护的,所以就把分发的事件返回给反应堆。

reactor就会找到event对应的Evanthandler(一般用map表存储),调用具体的Evanthandler,来读取read用户的请求,然后进行解码,因为在通信的时候数据是有序列化反序列化的,在后端服务器接收到用户的incoming requests,读过来数据,进行解码(反序列化),然后进行处理,计算,然后进行打包,编码,也就是数据的序列化,send发送到网络上给用户响应。

Eventhandler: 读取用户事件的请求read,反序列化(解码),业务逻辑处理计算,对处理的结果编码(序列化),send给用户返回一个请求对应的响应。

Event事件:事件的fd,读或者写,或者其他的信息

3.muduo库的Multiple Reactors模型

在上图中所谓的反应堆reactor(mainReactor和subReactor),实际上都是代表着Demultiplex事件分发器,由他们监听具体事件的发生,调用相应事件的回调,下图为事件的处理器:

reactor主要存储的是事件和事件对应的处理器,仅此而已。但是这张图上的reactor实际上是reactor和Demultiplex事件分发器的合二为一。

多路事件分发器想象成epoll,mainReactor相当于I/O线程的事件循环eventloop,主要做的是新用户的连接accept,监听fd有事件写入,就accept取出已连接用户的fd,然后派送到具体的工作线程上;

subReactor线程专门做已连接用户的读写事件处理;

如果再有耗时的I/O操作,比如说传输文件,就单独再起一个线程去处理耗时的I/O操作。

相关推荐
假如我年华正好11 分钟前
【教程】MacBook 安装 VSCode 并连接远程服务器
linux·服务器·ide·vscode·ssh·macbook
还没想好取啥名34 分钟前
Linux网络编程(十六)——多线程服务器端的实现
linux·服务器·网络
南棱笑笑生3 小时前
20250408在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统时拿掉经常出现的list-iodomain.sh警告信息
linux·运维·服务器
Misnearch3 小时前
远程主机可能不符合glibc和libstdc++ VS Code服务器的先决条件
服务器·vscode·ssh
Brandon汐11 小时前
Linux第四章练习
linux·运维·服务器
理智的煎蛋12 小时前
es 原生linux部署集群
大数据·linux·服务器·elasticsearch
nzxzn13 小时前
linux第三次作业
linux·运维·服务器
chairon13 小时前
Ansible:playbook的高级用法
linux·运维·服务器·ansible·apache
上海云盾商务经理杨杨13 小时前
网络游戏服务器如何构建全方位防御体系?DDoS与CC攻击实战防护指南
运维·服务器·ddos
xnian_13 小时前
策略模式实际用处,改吧改吧直接用,两种方式
java·服务器·前端