逐步构建HTTP服务器(五)——Reactor模式

2021/10/6 23:11:11

本文主要是介绍逐步构建HTTP服务器(五)——Reactor模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

逐步构建HTTP服务器(五)——Reactor模式

如何深刻理解Reactor和Proactor?

Schmidt D C . Reactor - An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events. 1999.

Reactor基本概念

这是Douglas C. Schmidt提出的Reactor中的主要的组成部分。

  • Handle:系统资源管理者,负责标识如网络连接、打开的文件等由系统管理的资源(在Linux上即为文件描述符)。

  • Synchronous Event Demultiplexer:多路复用器,主要使用多路复用函数负责阻塞线程直至有handle对应的事件就绪。

  • Initiation Dispatcher:分发器,定义注册、移除和分发Event Handlers的接口。

  • Event Handler:抽象的事件就绪处理者,定义Event就绪处理的回调函数的接口,由上级的应用来实现这个接口。

  • Concrete Event Handler:具体的事件就绪处理者,就是Event Handler的应用层级的实现。

Reactor一个典型时序图

  1. 初始化分发器Dispatcher
  2. 通过分发器Dispatcher的register_handler()函数向分发器注册事件处理者Event Handler
  3. 分发器Dispatcher通过事件处理者Event Handler的get_handle()获取系统资源管理者Handle(Linux中,Handle管理的就是文件描述符)
  4. 分发器Dispatcher使用多路复用函数阻塞线程,直至所有在分发器中注册了的Event Handler拥有的Handle中有对应的event_type就绪。
  5. 分发器Dispatcher根据就绪的Handle调用其对应的Event Handler的事件就绪处理回调函数handle_event()

适用于服务器的多线程 + Reactor模型

我们使用一个主Reactor负责网络套接字的连接,在这个主Reactor中我们使用一个Acceptor来分配已连接的套接字给其他线程的子Reactor(注意这里分配的Handler,即套接字,具体的分配动作是找一个其他线程的Reactor中的分发器Dispatcher注册Event handler;而Reactor中的分发器Dispatcher的分发的意思是将就绪的Handler分发给对用的Event Handler,具体的分发动作就是调用就绪的Handler对应的Event Handler的处理回调函数)。

多线程 + Reactor模型的具体实现

muduo中Reactor实现类图

  • EventLoop:对应分发器Initation Dispatcher

  • Poller:对应多路复用器Synchronous Event Demultiplexer

  • Socket + Channel + TcpConnection:对应Handler

  • Acceptor:对应Event Handler的实现

  • TcpServer:负责将新连接(Socket + Channel + TcpConnection)分配给其他线程的Event Loop

一个典型Echo服务器与客户端通信的流程

muduo 源码剖析

chenshuo/muduo: Event-driven network library for multi-threaded Linux server in C++11



这篇关于逐步构建HTTP服务器(五)——Reactor模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程