Reactor网络模型架构

Reactor网络模型四个重要组件:Event事件、Reactor反应堆、Demultiplex事件分发器、Evanthandler事件处理器

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.

在这里插入图片描述

  • Event:事件的sockfd,事件类型(EPOLL_IN、EPOLL_OUT…)
  • Reactor:维护事件event以及事件处理EventHandler的集合
  • Demultiplex:多路复用分发器,监听sockfd上相应的事件,有事件发生的时候把事件列表返回给Reactor
  • EventHandler: 读取用户事件的请求read,反序列化,业务逻辑处理计算,对处理的结果序列化,send给用户返回一个响应

在整个基于Reactor模型的网络服务交互阶段,首先我们把事件注册到反应堆上,也就是说,应用程序对这个事件感兴趣,请求反应堆帮忙来监听它所感兴趣的事件,并且在这个事件发生的时候调用相应预置的回调Handler

向反应堆注册事件,就是把这个事件event和对应的事件处理器EventHandler(一个event对应一个EventHandler)都给到reactor反应堆 。反应堆存储着事件event以及事件处理的集合,可以添加更多选项,比如说事件添加的时间,事件响应的时间等等

reactor反应堆维护了事件event以及事件处理的集合,底层会通过epoll_ctl进行设置事件,调整事件,添加新的事件,修改已有事件,删除已有事件。然后启动反应堆,反应堆就会驱动事件分发器的启动,开启多路复用,实际上就是开启epoll_wait,然后服务器监听新用户的连接,或是已连接用户的读写事件

如果epoll_wait有监听到新的事件的产生,那么多路复用分发器Demultiplex就会把这个分发的事件给反应堆返回,因为事件发生了,reactor模型就要调用事件的处理器EventHandler,而这个EventHandler是注册在reactor反应堆的。反应堆收到多路复用分发器返回的事件后,reactor就会找到并调用event对应的EventHandler(一般用map表)处理事件。一般来说处理事件要么是建立连接,要么是读取数据处理并返回,需要进行数据的序列化和反序列化

muduo网络库使用的Multiple Reactors模型

在这里插入图片描述

图中反应堆mainReactor和subReactor,实际上都是代表着我们上面说的Reactor和Demultiplex事件分发器,由他们监听具体事件的发生,维护事件event以及事件处理EventHandler的集合,调用相应的回调处理函数

多路事件分发器执行的就是epoll_wait,进行事件循环监听。对于经典的网络I/O模型,一般使用多线程循环监听,比如我们使用一个线程专门循环监听新用户的连接,多个线程循环监听已连接用户的读写事件,如果再有其他耗时的操作,比如说传输文件,就再起一个线程去处理这些操作

事件循环监听完成以后,就会根据事件对应的EventHandler处理请求

在这里插入图片描述
muduo的特点是one loop per thread,有一个main reactor负载accept连接,然后把连接分发到某个sub reactor(采用round-robin的方式来选择sub reactor),该连接的所有操作都在sub reactor所处的线程中完成。多个连接可能被分派到多个线程中,以充分列用CPU

Reactor Pool的线程数量是固定的,与CPU的核心数有关

如果有过多的耗时操作,可以提交到创建的ThreadPool中完成

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bugcoder-9905

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值