Reactor (Dispatcher)

Reactor 模式主要由 Reactor 和处理资源池这两个核心部分组成,它俩负责的事情如下:

  • Reactor 负责监听和分发事件,事件类型包含连接事件、读写事件
  • 处理资源池负责处理事件,如 read -> 业务逻辑 -> send

Reactor 模式是灵活多变的,可以应对不同的业务场景,灵活在于:

  • Reactor 的数量可以只有一个,也可以有多个;
  • 处理资源池可以是单个进程 / 线程,也可以是多个进程 /线程;

将上面的两个因素排列组设一下,理论上就可以有 4 种方案选择:

单 Reactor 单进程 / 线程;
  • Reactor 对象的作用是监听和分发事件;
  • Acceptor 对象的作用是获取连接;
  • Handler 对象的作用是处理业务;

存在的问题:

  • 整个进程/线程是阻塞的,如果一个请求的处理耗时过久,那么其他的请求也会受到影响。
单 Reactor 多进程 / 线程;

存在的问题:

  • 所有的请求都会经过一个单线程的 Reactor,Reactor 可能成为性能的瓶颈。
多 Reactor 多进程 / 线程;

需要注意的是,负责建立连接的仍然是一个主线程的 Reactor,与单 Reactor 多进程/线程的区别在于实际逻辑的处理的分发交给子 Reactor 进行,而 MainReactor 只负责处理连接。

Proactor

Proactor 模式的工作流程:

  • Proactor Initiator 负责创建 Proactor 和 Handler 对象,并将 Proactor 和 Handler 都通过 Asynchronous Operation Processor 注册到内核;
  • Asynchronous Operation Processor 负责处理注册请求,并处理 I/O 操作;
  • Asynchronous Operation Processor 完成 I/O 操作后通知 Proactor;
  • Proactor 根据不同的事件类型回调不同的 Handler 进行业务处理;
  • Handler 完成业务处理;