Reactor 模式

Reactor 模式是一种广泛应用于高并发网络编程事件驱动设计模式,核心思想是用少量线程处理大量I/O事件,通过非阻塞I/O事件分发机制实现高效资源管理。

核心组成

  1. Reactor(反应器)
    • 事件循环核心,负责监听和分发事件(如网络连接、数据到达)
    • 通过系统调用(select/epoll/kqueue)监控多个文件描述符
  2. Handlers(事件处理器)
    • 具体处理事件的回调函数/对象(如处理HTTP请求)
    • 包含不同事件类型的处理器(accept/read/write)
  3. Demultiplexer(多路复用器)
    • 操作系统提供的I/O多路复用接口(如Linux的epoll)
    • 负责阻塞等待多个I/O事件就绪

工作流程

  1. 注册事件:应用将Handler注册到Reactor,并指定关注的事件类型(如可读/可写)
  2. 事件监听:Reactor通过Demultiplexer开始事件循环,等待事件触发
  3. 事件通知:当某个socket就绪时,Demultiplexer返回就绪事件列表
  4. 分发处理:Reactor将事件派发给对应的Handler执行非阻塞I/O操作
  5. 循环继续:处理完成后重新进入事件监听状态

关键特点

  • 单线程/多线程变种:基础版用单线程处理所有事件,进阶版可采用主从Reactor(如主线程处理accept,子线程处理read/write)
  • 非阻塞I/O:所有操作不阻塞线程,通过回调机制实现异步处理
  • 避免线程爆炸:相比传统"one thread per connection"模型,更适合海量连接场景

与Proactor模式对比

Reactor Proactor
I/O操作 应用层执行非阻塞读写 系统层异步执行,回调通知结果
编程复杂度 需处理部分就绪状态 逻辑更简单但需要OS支持
典型实现 Linux epoll, Java NIO Windows IOCP

实际应用案例

  • Netty:Java网络框架使用主从Reactor结构
  • Redis:单Reactor单线程处理所有命令
  • Nginx:多worker进程+每个进程使用Reactor模式

适用场景:Web服务器、即时通讯、API网关等需要处理大量并发连接的I/O密集型系统。当Handler处理逻辑较简单时(如只是协议解析和转发),能最大化发挥其性能优势。