## reactor 模式 Reactor 模式是一种在事件驱动架构中常用的设计模式,它专门用于处理并发的服务请求,特别是 I/O 多路复用场景。{alertInfo}
由人工编写审核,非AI生成内容,请放心观看!
{getToc} $title={文章目录}
下面我将以一个通用的框架形式来解释 Reactor 模式的组成、工作流程以及它与 Proactor 模式的区别。
| 第一篇文章详细解释下:Reactor 模式框架 | 理科生网 |
Reactor 模式将事件的等待、分派与实际的业务处理(事件处理)分离开来。
Reactor 模式框架主要由以下三个核心组件构成:
| 组件名称 | 职责 (What it does) | 对应在框架中的位置 |
|---|---|---|
| Reactor (反应堆) | 负责监听和收集所有 I/O 事件。一旦事件就绪(如数据可读),它就将该事件分派 (Dispatch) 给相应的 Handler。 | 事件管理器,通常在主线程或事件循环中。 |
| Event Handler (事件处理器) | 负责执行非阻塞的实际业务逻辑。它将自己注册到 Reactor 上,等待特定事件发生。 | 业务逻辑的封装,如连接接受器、数据读取器。 |
| Demultiplexer (多路分解器) | 这是 Reactor 的底层工具。它使用操作系统提供的 I/O 多路复用机制 (如 select, poll, epoll, kqueue) 来阻塞地等待多个文件描述符上的事件。 | 操作系统 I/O 多路复用 API 的封装。 |
Reactor 模式的工作流程可以概括为以下步骤:
- 注册 (Registration): 所有的
Handler(比如用于处理新连接的Acceptor) 在初始化时,会调用Reactor的注册接口,将自己感兴趣的 事件类型 (EV_READ,EV_WRITE等) 和对应的 文件描述符 (FD) 告知Reactor。 - 等待事件 (Wait for Events):
Reactor内部调用 Demultiplexer 的阻塞 API(如epoll_wait),等待注册在其上的所有 FD 发生 I/O 事件。 - 事件就绪 (Event Ready): 当一个或多个事件就绪时,Demultiplexer 返回就绪的 FD 列表。
- 分派事件 (Dispatching):
Reactor遍历就绪的 FD 列表,找到与该 FD 关联的相应Handler。 - 处理事件 (Handle Event):
Reactor调用就绪Handler的处理方法(例如handle_event(),handle_read(), 或handle_write())。 - 执行业务逻辑 (Execution):
Handler执行必要的业务逻辑。关键点: Handler 必须是非阻塞的,并且执行时间要短,否则会阻塞整个 Reactor 的事件循环。如果需要执行耗时操作,Handler 应该将任务移交给另一个线程池。 - 循环 (Loop): 处理完成后,
Reactor返回步骤 2,继续等待新的事件。
| 变体 | 描述 | 适用场景 |
|---|---|---|
| Single Reactor Single Thread | 最简单模型。一个线程运行 Reactor,并处理所有事件。Handler 的所有业务逻辑都在这个线程内完成。 | 负载低、业务逻辑极其简单快速的场景 (例如:Redis)。 |
| Multi-Reactor (Master-Slave) | 使用一个 主 Reactor (Acceptor) 监听新连接。一旦建立新连接,主 Reactor 将连接 FD 分发给一个或多个 子 Reactor (I/O Threads),由子 Reactor 负责监听和处理该连接上的读写事件。 | 高并发网络服务,充分利用多核 CPU (例如:Netty 的默认配置)。 |
您刚才提到的 libevent 就是一个经典的 Reactor 模式的实现框架。
- Reactor:
event_base结构体,是事件循环的核心。 - Demultiplexer: Libevent 内部会选择最佳的 I/O 多路复用机制 (
epoll,kqueue,select等)。 - Handler:
struct event结构体,它将文件描述符、感兴趣的事件类型(EV_READ,EV_TIMEOUT等)以及回调函数(业务逻辑)封装在一起。
Reactor 模式是同步事件分离,而 Proactor 模式是异步操作分离。
| 特性 | Reactor (同步 I/O 多路复用) | Proactor (异步 I/O) |
|---|---|---|
| I/O 模型 | 同步非阻塞 I/O (Synchronous Non-blocking I/O) | 异步 I/O (Asynchronous I/O) |
| 通知点 | 通知 I/O 就绪 (数据可以读/写) | 通知 I/O 完成 (数据已完成读/写) |
| 流程 | Reactor 收到通知 Handler 自己读/写数据 完成 | Proactor 发起异步读/写 OS完成操作 Proactor 通知 Handler 结果 |
| 阻塞风险 | Handler 必须是非阻塞的,否则会阻塞整个事件循环。 | I/O 操作由 OS 或线程池完成,Handler 被通知时操作已结束,无阻塞风险。 |
| 平台要求 | 几乎所有平台都支持 (select/epoll)。 | 依赖操作系统提供的 AIO 机制(如 Windows I/O Completion Ports,Linux 较新的 io_uring)。 |
Reactor 模式因其跨平台性、相对简单的实现,成为最流行的事件驱动网络框架的基础(如 Nginx、Node.js、Netty、Libevent)。
版权声明:感谢您的阅读,资源整理自网络,如果您发现任何侵权行为,请联系 理科生网 管理人员,管理员将及时删除侵权内容。否则均为 理科生网 原创内容,转载时请务必以超链接(而非纯文本链接)标注来源于理科生网及本文完整链接,感谢!{alertInfo}Ahmedabad