逐步构建HTTP服务器(五)——Reactor模式
Reactor基本概念
这是Douglas C. Schmidt提出的Reactor中的主要的组成部分。
-
Handle:系统资源管理者,负责标识如网络连接、打开的文件等由系统管理的资源(在Linux上即为文件描述符)。
-
Synchronous Event Demultiplexer:多路复用器,主要使用多路复用函数负责阻塞线程直至有handle对应的事件就绪。
-
Initiation Dispatcher:分发器,定义注册、移除和分发Event Handlers的接口。
-
Event Handler:抽象的事件就绪处理者,定义Event就绪处理的回调函数的接口,由上级的应用来实现这个接口。
-
Concrete Event Handler:具体的事件就绪处理者,就是Event Handler的应用层级的实现。
Reactor一个典型时序图
- 初始化分发器Dispatcher
- 通过分发器Dispatcher的register_handler()函数向分发器注册事件处理者Event Handler
- 分发器Dispatcher通过事件处理者Event Handler的get_handle()获取系统资源管理者Handle(Linux中,Handle管理的就是文件描述符)
- 分发器Dispatcher使用多路复用函数阻塞线程,直至所有在分发器中注册了的Event Handler拥有的Handle中有对应的event_type就绪。
- 分发器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服务器与客户端通信的流程
chenshuo/muduo: Event-driven network library for multi-threaded Linux server in C++11