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.

Reactor网络模型架构_第1张图片

  • 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模型

Reactor网络模型架构_第2张图片

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

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

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

Reactor网络模型架构_第3张图片
muduo的特点是one loop per thread,有一个main reactor负载accept连接,然后把连接分发到某个sub reactor(采用round-robin的方式来选择sub reactor),该连接的所有操作都在sub reactor所处的线程中完成。多个连接可能被分派到多个线程中,以充分列用CPU

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

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

你可能感兴趣的:(muduo网络库,后端,tcp/ip)