一、概念

Reactor设计模式,是一种基于事件驱动的设计模式。它有一个或多个并发输入源,有一个Service Handler,和多个Request Handler,Service Handler会同步的将输入的请求(Event)多路复用的分发给相应的Request Handler。

Reactor_Simple-600x348

二、Reactor模式结构

Reactor模式由5个角色组成。

Reactor_Structures-600x398

Handle:即操作系统中的句柄,是操作系统对资源的一种抽象,可以是打开的文件、一个连接(Socket)、Timer等。在网络编程中,一般指Socket Handle,文件描述符(fd)。将这个Handle注册到Synchronous Event Demultiplexer中,就可以它发生的事件,如READ、WRITE、CLOSE等事件。

Synchronous Event Demultiplexer:同步事件多路分用器,本质上是系统调用。比如linux中的select、poll、epoll等。它会一直阻塞直在handle上,直到有事件发生时才会返回。

Initiation Dispatcher:初始分发器,它提供了注册、删除与转发event handler的方法。当Synchronous Event Demultiplexer检测到handle上有事件发生时,便会通知initiation dispatcher调用特定的event handler的回调(handle_event())方法。

Event Handler:事件处理器,定义事件处理的回调方法:handle_event(),以供InitiationDispatcher回调使用。

Concrete Event Handler:具体的事件处理器,继承自Event Handler,在回调方法中会实现具体的业务逻辑。

三、Reactor模式处理流程

  1. 注册Concrete Event Handler到Initiation Dispatcher中,当Initiation Dispatcher在某种类型的事件发生时向其通知,事件与handle关联。

  2. Initiation Dispatcher调用每个Event Handler的get_handle接口获取其绑定的Handle。

  3. Initiation Dispatcher调用handle_events开始事件处理循环。在这里,Initiation Dispatcher会将步骤2获取的所有Handle都收集起来,使用Synchronous Event Demultiplexer来等待这些Handle的事件发生。

  4. 当某个(或某几个)Handle的事件发生时,Synchronous Event Demultiplexer通知Initiation Dispatcher,select()根据发生事件的Handle找出对应的回调Handler。

  5. Initiation Dispatcher调用特定的Concrete Event Handler的回调方法(handel_event())来响应其关联的handle上发生的事件。

时序图:

Reactor_working_-process-600x346

四、相关文章

http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf

https://www.cnblogs.com/dafanjoy/p/11217708.html

https://zhuanlan.zhihu.com/p/53191925

https://cloud.tencent.com/developer/article/1513447

https://blog.csdn.net/u010168160/article/details/53019039