Reactor 模式
Reactor 模式是一种广泛应用于高并发网络编程的事件驱动设计模式,核心思想是用少量线程处理大量I/O事件,通过非阻塞I/O和事件分发机制实现高效资源管理。
核心组成
- Reactor(反应器)
- 事件循环核心,负责监听和分发事件(如网络连接、数据到达)
- 通过系统调用(select/epoll/kqueue)监控多个文件描述符
- Handlers(事件处理器)
- 具体处理事件的回调函数/对象(如处理HTTP请求)
- 包含不同事件类型的处理器(accept/read/write)
- Demultiplexer(多路复用器)
- 操作系统提供的I/O多路复用接口(如Linux的epoll)
- 负责阻塞等待多个I/O事件就绪
工作流程
- 注册事件:应用将Handler注册到Reactor,并指定关注的事件类型(如可读/可写)
- 事件监听:Reactor通过Demultiplexer开始事件循环,等待事件触发
- 事件通知:当某个socket就绪时,Demultiplexer返回就绪事件列表
- 分发处理:Reactor将事件派发给对应的Handler执行非阻塞I/O操作
- 循环继续:处理完成后重新进入事件监听状态
关键特点
- 单线程/多线程变种:基础版用单线程处理所有事件,进阶版可采用主从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处理逻辑较简单时(如只是协议解析和转发),能最大化发挥其性能优势。