Reactor笔记
Doug Lea - 《Scalable IO in Java》
Classic Service Designs

传统的服务设计如上图所示,在每一个处理器中,将所有的处理逻辑都在一个线程里按照顺序阻塞式的调用。在上图的处理逻辑中,涉及到了 read和send这种IO操作,然而等待这些IO操作极大的浪费了CPU的资源,损耗了极大的机器性能。
Reactor Pattern
由于传统的设计对机器的资源和性能造成比较大的浪费,因此Reacot模式就诞生了。
基础方法论
- 将处理分为粒度更细的任务
- 每个小任务的执行是非阻塞
- 当任务可执行时再去执行:比如机器在执行IO操作的时候,CPU不会去等待IO的结束,而是去执行其他的任务,当IO操作结束时,CPU再去执行。
- JAVA NIO 中基本支持的机制
- 非阻塞的读写
- 当察觉到相关IO事件与任务有关联时,进行分发操作。
- 一系列的事件驱动设计
- 更少的资源占用
- 更少的系统开销: 比如上下文切换,锁的减少
- 分发效率低:必须手动将动作绑定到事件
类似于GUI事件驱动的操作,如下图所示

当触发click事件时,产生的事件就在AWT 事件队列中,然后AWT中的监听线程去监听事件,根据事件类型去做对应的操作。Reator模式只是类似,而AWT是基于监听者模式去监听对应的事件处理机制。
Reactor Pattern
- 通过分发关联的处理器去响应IO事件。比如读操作,使用读处理器去处理,而写操作使用处理器去处理。
- 处理器执行非阻塞的动作:类似于NIO中的Handler
- 通过将处理器绑定到事件来进行管理。就是当事件产生了哪一个处理器要去处理。
Basic Reactor Design

通过上图我们可以简单理解一下
- Reactor:相当于一个线程,它负责监听客户端发起的连接或者事件,然后通过客户端发送过来的事件去派发对应的处理器,比如读写。
- 特定的处理器去处理客户端传来的事件。
- acceptor:类似于事件处理器的管理。
具体的实现代码可以参照原文
网友评论