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操作。

相关推荐
每天敲200行代码12 分钟前
Linux 基本指令
linux·运维·服务器
粥啊、1 小时前
十六、流编辑器sed(stream editor)
linux·运维·服务器
不爱学英文的码字机器2 小时前
在 Linux 中如何使用粘滞位 (t-bit)共享文件
linux·服务器·数据库
vvw&2 小时前
如何在 Ubuntu 22.04 上安装 Elasticsearch
linux·运维·服务器·后端·ubuntu·elasticsearch·搜索引擎
vvw&3 小时前
如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ
java·linux·运维·服务器·spring·ubuntu·rabbitmq
boy快快长大4 小时前
【NebulaGraph】查询案例(六)
java·服务器·数据库
hahaqi95274 小时前
uniapp生成h5后发布到服务器碰到的问题解决
运维·服务器·uni-app
isolusion4 小时前
Springboot配置嵌入式服务器
服务器·spring boot·后端
m0_748235955 小时前
【rustdesk】客户端和服务端的安装和部署(自建服务器,docker,远程控制开源软件rustdesk)
运维·服务器·docker
m0_748239335 小时前
Linux下C++轻量级WebServer服务器 框架梳理
linux·服务器·c++