Reactor反应器模式

Reactor 反应器模式简介

Reactor 反应器模式是高性能网络编程在设计和架构层面的基础模式,如 Nginx、RedisNetty 这些鼎鼎大名的的开源项目都是基于反应器模式的

反应器模式是由 Reactor 反应线程、Handlers 处理器两大角色组成的。

  1. Reactor 反应器线程负责响应 IO 事件,并分发到 Handlers 处理器。这里的 IO 事件就是 NIO的IO事件
  2. Handlers 处理器的职责是非阻塞的执行业务处理逻辑

《Scalable IO in Java》

单线程 Reactor 反应器模式

总的说 Reactor 反应器模式有点类似事件驱动模式, 在事件驱动模式中,当有事件触发时,事件源会将事件 dispatch 分发到 handler 处理器执行事件处理。而反应器模式中反应器角色就类似于 dispatcher 事件分发器的角色

什么是单线程 Reactor 反应器

简单地说,Reactor 反应器和 Handers 处理器处于一个线程中执行就是单线程 Reactor 反应器。它是最简单的反应器模型。

基于 JAVA NIO 实现简单的反应器模式

需要使用到的 SelectionKey 选择键的接个重要成员方法:

  1. void attach(Object o) 这个方法可以将任意 Java 实体对象作为附件添加到 SelectionKey 的实例中,类似于 setter 方法。因为在单线程的反应器模式中,需要将 handler 处理器实例,作为附件添加到 SelecttionKey
  2. Object attachment(),这个方法的作用是取出之前通过 attach(Object o) 添加到 SelecttionKey 的附件
Note

  • 📌 在选择键注册完成之后,调用attach方法,将Handler处理器绑定到选择键;当事件发生时,调用attachment方法,可以从选择键取出Handler处理器,将事件分发到Handler处理器中,完成业务处理。
单线程 Reactor 反应器模式的缺点

在单线程反应器模式下,Reactor 和 Handler 都在同一线程下,如果有一个 Handler 阻塞,那么其他的 Handler 就都不能执行。如果连负责监听的 Handler 都阻塞了,那么就会是的服务不可用。

多线程 Reactor 反应器模式

单 Reactor

一个主 Reactor 与子 Reactor