前言
在高性能网络框架(Nginx、Redis、Netty、muduo、Skynet)中,Reactor 模型 是绝对的底层灵魂。它解决了 C10K 问题,实现了单线程 / 少量线程支撑百万并发连接,是后端架构师必须吃透的核心模型。
本文只讲最正统、最标准、最工程化 的 Reactor 模型:原理、核心组件、整体架构、三种演进模型、工作流程、优势一次性讲透。
一、Reactor 模型到底是什么?
别名:反应堆模型(直译),事件驱动模型(原理),事件循环模型(实现机制)。
Reactor = 反应堆模型 = 基于 IO 多路复用的同步事件驱动模型
核心思想一句话:事件监听与事件处理分离,一个反应堆统一监听,就绪后分发到对应处理器执行。
本质:
- 不阻塞、不轮询、不多线程爆炸
- 一个线程靠 epoll 就能管理成千上万连接
- 事件就绪才处理,CPU 利用率拉满
二、Reactor 模型两大核心原则(必须背)
- 事件驱动有事件我才动,没事件我就等(epoll_wait)。
- 职责分离
- Reactor:只管监听 + 分发
- Handler:只管处理 IO + 业务
三、Reactor 标准架构:四大核心组件
1. Handle(句柄 / 文件描述符)
- 本质:socket、fd、连接
- 作用:事件发生的源头
- 包括:连接事件、可读事件、可写事件、异常事件
2. Demultiplexer(IO 多路复用器)
- 实现:epoll(Linux)、kqueue(macOS)
- 作用:统一监听所有句柄的事件
- 接口:epoll_wait /epoll_ctl
3. Reactor(反应堆 / 事件分发器)
整个模型的大脑
- 注册事件
- 等待事件
- 分发事件
- 调度 Handler
4. Event Handler(事件处理器)
- 实际干活的人
- 可读:read → 解码 → 业务
- 可写:write → 发送
- 新连接:accept → 注册 fd
四、标准 Reactor 工作流程(最经典)
1. 注册事件 → 把 fd 交给 epoll
2. 事件循环 → epoll_wait 阻塞等待
3. 事件就绪 → 内核返回就绪列表
4. 事件分发 → Reactor 找到对应 Handler
5. 处理事件 → read/write/accept/业务逻辑
一句话总结: 反应堆等事件,来了就分发,处理器去执行。
五、Reactor 三种经典架构演进(面试必考)
1. 单线程 Reactor(最简单)
结构:
- 一个线程干所有事:accept、read、write、业务
优点:简单、无锁
缺点:业务一慢,整个服务器卡住
适用:Redis 早期模型、小并发网关
2. 多线程 Reactor(Handler 线程池化)
结构:
- Reactor 单线程:只做 IO 事件
- 业务逻辑扔线程池
优点:IO 与业务分离,不阻塞
缺点:accept 仍然单线程
3. 主从 Reactor(主从多线程)
结构:
- Main Reactor (主反应堆)只做一件事:accept 新连接
- Sub Reactor(从反应堆)每个 SubReactor 一个线程 + epoll负责 read/write 事件
- ThreadPool(业务线程池)处理耗时业务(数据库、计算)
主从 Reactor 流程(背)
- MainReactor 接受新连接
- 分配给 SubReactor
- SubReactor 负责该连接一生的 IO
- 业务交给线程池
- 结果写回 SubReactor 发送
六、Reactor 模型为什么高性能?(8 大优势)
- 单线程也能高并发,避免多线程切换开销
- 非阻塞 IO,不浪费 CPU 等待
- 事件驱动,无事件不执行
- epoll 边缘触发 / 水平触发,效率极高
- 职责分离清晰,易于扩展
- 主从架构,支持百万连接
- 无锁设计,IO 线程不竞争
- 占用内存极低,不用给每个连接开线程
七、Reactor vs Proactor(面试必问)
| 模型 | 类型 | 实现 | 核心 | 代表 |
|---|---|---|---|---|
| Reactor | 同步非阻塞 | 事件就绪通知,用户自己 read/write | 就绪通知 | Nginx、Redis、Netty |
| Proactor | 异步非阻塞 | 内核完成 IO,完成后通知 | 完成通知 | Windows IOCP |
一句话区别:
- Reactor:我告诉你准备好了,你来读。
- Proactor(别名:前摄器模型,主动器模型):我帮你读完了,告诉你结果。
八、总结
Reactor 模型 = 高性能网络架构
核心口诀:一个反应堆,多路复用器,一堆处理器,事件驱动,职责分离。
标准架构:
- Handle:事件源
- Demultiplexer:epoll
- Reactor:分发调度
- Handler:业务处理
三种模型:
- 单线程 Reactor
- 多线程 Reactor
- 主从 Reactor