WebServer 02 Reactor模式

一、简介

有两种高效的事件处理模式,Reactor、Proactor。同步IO模型通常用于实现Reactor模式,异步IO模型通常用于实现Proactor模型。(同步IO/异步IO的概念在 本专栏webserver 00 里面有介绍)

1.1 服务端要处理的 事件 通常有什么?

· IO事件 :

来源:客户端或外部系统

服务端的收发消息操作机会。

以 socket 通讯为例:当 socket 的状态发生变化时,操作系统会触发可读或可写事件,

服务端的 IO 处理单元就会执行相应的读/写操作,从 socket 读取数据,或者向 socket 写入数据。(对应服务端的 数据接收行为 和 数据发送行为)

· 信号:

来源:操作系统或服务端自身触发

指系统或进程发送的信号,用于通知服务端某些异步状态。

例如:系统终止信号(SIGTERM)、挂起信号(SIGSTOP)或自定义的应用信号。

服务端可以通过捕获信号做一些清理工作或者重新加载配置。

· 定时事件:

来源:服务端自身

指按照设定时间间隔触发的事件,用于处理周期性任务。

例如:定期检查超时连接、定时刷新缓存、周期性统计日志等。

二、Reactor模式介绍

要求 主线程(上篇里面提到的 IO处理单元)只负责监听文件描述符上是否有事件发生。

有的话就通知工作线程(逻辑单元,工作线程一般有很多个),将socket可读可写事件 放入请求队列,交给工作线程处理。(注意:这里面主线程并没有进行读写事件,读写事件是工作线程处理的)除此之外,主线程不做任何其他工作。


三、Reactor模式工作流程

scss 复制代码
 客户端请求
│
▼
Reactor (事件分发器)
│
├─ 可读事件 → 读 Handler → 处理请求
│
└─ 可写事件 → 写 Handler → 发送响应  

可以把 Reactor 模型想象成一个"前台接待员 + 部门"的系统:

  1. 客户端请求到来
    • 客户端向服务器发送请求(例如 HTTP 请求)。
  1. Reactor 捕获事件
    • Reactor 负责监听所有 socket 的状态变化(可读、可写、异常)。
    • 当某个 socket 可读时,Reactor 就知道有数据可以处理了。
  1. 事件分发给 Handler
    • Reactor 把事件分发给对应的 Handler(工作线程)。
    • Handler 执行具体业务逻辑,比如读取请求、处理数据、生成响应。
  1. Handler 执行完成
    • 如果需要写数据,也会通过 Reactor 通知可写事件。Reactor在唤醒一个工作线程往socker里面写数据。
相关推荐
一灯架构6 小时前
90%的人答错!一文带你彻底搞懂ArrayList
java·后端
W23035765737 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
.Ashy.7 小时前
2026.4.11 蓝桥杯软件类C/C++ G组山东省赛 小记
c语言·c++·蓝桥杯
minji...8 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
mldong8 小时前
Python开发者狂喜!200+课时FastAPI全栈实战合集,10大模块持续更新中🔥
后端
GreenTea8 小时前
从 Claw-Code 看 AI 驱动的大型项目开发:2 人 + 10 个自治 Agent 如何产出 48K 行 Rust 代码
前端·人工智能·后端
CoderCodingNo10 小时前
【GESP】C++三级真题 luogu-B4499, [GESP202603 三级] 二进制回文串
数据结构·c++·算法
Moment10 小时前
AI 全栈指南:NestJs 中的 Service Provider 和 Module
前端·后端·面试
IT_陈寒10 小时前
为什么我的JavaScript异步回调总是乱序执行?
前端·人工智能·后端
Moment10 小时前
AI全栈入门指南:NestJs 中的 DTO 和数据校验
前端·后端·面试