设计目标
本系列旨在通过 C++ 实现一个基于 One Thread One Loop 模式的主从 Reactor 高并发服务器组件。目标是提供一个简洁、高性能的基础设施,让开发者能快速搭建支持 HTTP 等协议的高性能应用服务器。
需要明确的是,我们构建的是一个基础组件库,专注于网络 IO 与连接管理,不包含具体的业务逻辑。
HTTP 服务器基础
HTTP 是运行在 TCP 之上的应用层协议,本质上是请求 - 响应模型。虽然 HTTP 服务器涉及复杂的协议解析,但从底层看,它依然是一个 TCP 服务器。
实现高性能 HTTP 服务器的核心步骤包括:
- 搭建 TCP 服务器接收客户端请求。
- 按 HTTP 协议格式解析数据,识别客户端意图。
- 根据请求提供对应服务。
- 将结果封装为 HTTP 响应返回给客户端。
实现一个简单的 HTTP 服务器不难,但要做到高性能则需要引入更底层的网络模型。
Reactor 模型详解
Reactor 模式是一种事件驱动的处理模式,通过 I/O 多路复用统一监听事件,收到事件后分发给处理线程。它是编写高性能网络服务器的核心技术之一。
单 Reactor 单线程
此模式下,IO 多路复用与业务处理都在同一个线程中串行完成。
- 优点:流程简单,无需处理线程间通信及资源竞争问题。
- 缺点:无法利用 CPU 多核资源,容易成为性能瓶颈。
- 适用场景:客户端数量少且处理速度快的场景。
单 Reactor 多线程
主 Reactor 线程负责 IO 监听,触发事件后将业务处理分发给 Worker 线程池。
- 优点:充分利用多核资源,降低耦合度。
- 缺点:多线程共享数据控制复杂;单 Reactor 线程在高并发下可能成为瓶颈。
多 Reactor 多线程(主从模型)
这是 Muduo 等主流库采用的架构。主 Reactor 仅负责接受新连接,子 Reactor 负责已建立连接的 IO 监控,Worker 线程池负责业务处理。
- 优点:各司其职,充分利用 CPU 资源。
- 缺点:执行流增多会增加调度成本,架构复杂度提升。
功能模块划分
为了实现上述模型,我们将系统划分为以下核心模块:
Buffer 模块
用于管理用户态的接收和发送缓冲区,屏蔽底层 Socket 读写的细节。
Socket 模块
对套接字操作进行封装,提供统一的接口。
Channel 模块
描述符的事件管理单元。当 Poller 通知描述符就绪时,Channel 负责回调相应的处理函数(如可读、可写、错误等)。
Connection 模块
这是通信的核心对象,封装了 Buffer、Socket、Channel 以及生命周期管理。
- 内部结构:包含接收/发送缓冲区、Socket 对象、Channel 对象。
- 回调机制:提供连接建立、数据到达、关闭等回调接口。
- 工作流程:Poller 就绪 -> Channel 回调 -> 读取数据到 Buffer -> 触发用户回调 -> 写入响应 -> 注册写事件 -> 发送数据。
Acceptor 模块
封装监听套接字,负责接收新连接并创建对应的 Connection 对象。
TimerQueue 模块
基于 Linux timerfd 实现的定时器,用于管理非活跃连接的超时释放及定时任务。


