ZoyaPatel

第一篇文章详细解释下:Reactor 模式框架 | 理科生网

SohaniSharma

## reactor 模式 Reactor 模式是一种在事件驱动架构中常用的设计模式,它专门用于处理并发的服务请求,特别是 I/O 多路复用场景。{alertInfo}

由人工编写审核,非AI生成内容,请放心观看!

{getToc} $title={文章目录}

下面我将以一个通用的框架形式来解释 Reactor 模式的组成、工作流程以及它与 Proactor 模式的区别。

第一篇文章详细解释下:Reactor 模式框架 | 理科生网
第一篇文章详细解释下:Reactor 模式框架 | 理科生网 

Reactor 模式框架

Reactor 模式将事件的等待、分派与实际的业务处理(事件处理)分离开来。

1. 核心组件

Reactor 模式框架主要由以下三个核心组件构成:

组件名称职责 (What it does)对应在框架中的位置
Reactor (反应堆)负责监听和收集所有 I/O 事件。一旦事件就绪(如数据可读),它就将该事件分派 (Dispatch) 给相应的 Handler事件管理器,通常在主线程或事件循环中。
Event Handler (事件处理器)负责执行非阻塞的实际业务逻辑。它将自己注册到 Reactor 上,等待特定事件发生。业务逻辑的封装,如连接接受器、数据读取器。
Demultiplexer (多路分解器)这是 Reactor 的底层工具。它使用操作系统提供的 I/O 多路复用机制 (如 selectpollepollkqueue) 来阻塞地等待多个文件描述符上的事件。操作系统 I/O 多路复用 API 的封装。

2. 工作流程 (The Flow)

Reactor 模式的工作流程可以概括为以下步骤:

  1. 注册 (Registration): 所有的 Handler (比如用于处理新连接的 Acceptor) 在初始化时,会调用 Reactor 的注册接口,将自己感兴趣的 事件类型 (EV_READEV_WRITE 等) 和对应的 文件描述符 (FD) 告知 Reactor
  2. 等待事件 (Wait for Events): Reactor 内部调用 Demultiplexer 的阻塞 API(如 epoll_wait),等待注册在其上的所有 FD 发生 I/O 事件。
  3. 事件就绪 (Event Ready): 当一个或多个事件就绪时,Demultiplexer 返回就绪的 FD 列表。
  4. 分派事件 (Dispatching): Reactor 遍历就绪的 FD 列表,找到与该 FD 关联的相应 Handler
  5. 处理事件 (Handle Event): Reactor 调用就绪 Handler 的处理方法(例如 handle_event()handle_read(), 或 handle_write())。
  6. 执行业务逻辑 (Execution): Handler 执行必要的业务逻辑。关键点: Handler 必须是非阻塞的,并且执行时间要短,否则会阻塞整个 Reactor 的事件循环。如果需要执行耗时操作,Handler 应该将任务移交给另一个线程池。
  7. 循环 (Loop): 处理完成后,Reactor 返回步骤 2,继续等待新的事件。

3. Reactor 模式的两种变体

变体描述适用场景
Single Reactor Single Thread最简单模型。一个线程运行 Reactor,并处理所有事件。Handler 的所有业务逻辑都在这个线程内完成。负载低、业务逻辑极其简单快速的场景 (例如:Redis)。
Multi-Reactor (Master-Slave)使用一个 主 Reactor (Acceptor) 监听新连接。一旦建立新连接,主 Reactor 将连接 FD 分发给一个或多个 子 Reactor (I/O Threads),由子 Reactor 负责监听和处理该连接上的读写事件。高并发网络服务,充分利用多核 CPU (例如:Netty 的默认配置)。

4. 框架举例:Libevent

您刚才提到的 libevent 就是一个经典的 Reactor 模式的实现框架。

  • Reactor: event_base 结构体,是事件循环的核心。
  • Demultiplexer: Libevent 内部会选择最佳的 I/O 多路复用机制 (epollkqueueselect 等)。
  • Handler: struct event 结构体,它将文件描述符、感兴趣的事件类型(EV_READEV_TIMEOUT 等)以及回调函数(业务逻辑)封装在一起。

区别:Reactor vs. Proactor

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
Kolkata
Hyderabad
后一页 Bangalore 前一页

Random Manga

Ads

نموذج الاتصال