Reactor反应器模式
Reactor 反应器模式简介
Reactor 反应器模式是高性能网络编程在设计和架构层面的基础模式,如 Nginx、Redis、Netty 这些鼎鼎大名的的开源项目都是基于反应器模式的
反应器模式是由 Reactor 反应线程、Handlers 处理器两大角色组成的。
- Reactor 反应器线程负责响应 IO 事件,并分发到 Handlers 处理器。这里的 IO 事件就是 NIO的IO事件
- Handlers 处理器的职责是非阻塞的执行业务处理逻辑
单线程 Reactor 反应器模式
总的说 Reactor
反应器模式有点类似事件驱动模式, 在事件驱动模式中,当有事件触发时,事件源会将事件 dispatch
分发到 handler
处理器执行事件处理。而反应器模式中反应器角色就类似于 dispatcher
事件分发器的角色
什么是单线程 Reactor 反应器
简单地说,Reactor 反应器和 Handers 处理器处于一个线程中执行就是单线程 Reactor 反应器。它是最简单的反应器模型。
基于 JAVA NIO 实现简单的反应器模式
需要使用到的 SelectionKey
选择键的接个重要成员方法:
void attach(Object o)
这个方法可以将任意 Java 实体对象作为附件添加到SelectionKey
的实例中,类似于setter
方法。因为在单线程的反应器模式中,需要将 handler 处理器实例,作为附件添加到SelecttionKey
中Object attachment()
,这个方法的作用是取出之前通过attach(Object o)
添加到SelecttionKey
的附件
Note
单线程 Reactor 反应器模式的缺点
在单线程反应器模式下,Reactor 和 Handler 都在同一线程下,如果有一个 Handler 阻塞,那么其他的 Handler 就都不能执行。如果连负责监听的 Handler 都阻塞了,那么就会是的服务不可用。
多线程 Reactor 反应器模式
单 Reactor
一个主 Reactor 与子 Reactor