Reactor 模式是一种高性能的事件驱动设计模式,广泛应用于网络服务器、中间件等需要高并发的场景(如 Redis、Nginx、Netty)。它的核心思想是通过事件分发机制处理大量并发请求,避免为每个连接创建线程/进程的开销。
Reactor 模式的核心组件
Reactor(反应器)
- 负责监听和分发事件(如 I/O 事件),通过事件循环(Event Loop)轮询多路复用器(如
epoll
/select
)。 - 将就绪的事件分发给对应的处理器(Handler)。
- 负责监听和分发事件(如 I/O 事件),通过事件循环(Event Loop)轮询多路复用器(如
Demultiplexer(多路复用器)
- 底层使用系统调用(如
epoll
、kqueue
)监听多个文件描述符(Socket),返回就绪的事件列表。
- 底层使用系统调用(如
EventHandler(事件处理器)
- 定义处理事件的接口,通常包含
handle_event()
方法,处理读/写/错误等事件。
- 定义处理事件的接口,通常包含
Concrete Handler(具体处理器)
- 实现业务逻辑,例如解析 HTTP 请求、数据库查询等。
工作流程
- 注册事件:将需要监听的事件(如 Socket 可读/可写)注册到多路复用器。
- 事件循环:Reactor 通过多路复用器阻塞等待事件发生。
- 事件触发:当某个 Socket 就绪时,多路复用器返回就绪的事件列表。
- 分发处理:Reactor 调用对应的事件处理器处理业务逻辑。
Reactor 的常见变种
单线程 Reactor
- Reactor + Handler 全部运行在单个线程中(如 Redis)。
- 优点:简单,无锁竞争。
- 缺点:无法利用多核 CPU,耗时任务会阻塞事件循环。
- Reactor + Handler 全部运行在单个线程中(如 Redis)。
多线程 Reactor
- Reactor 在单线程运行,但 Handler 交给线程池处理(如 Nginx)。
- 优点:利用多核资源。
- Reactor 在单线程运行,但 Handler 交给线程池处理(如 Nginx)。
主从 Reactor (Master-Slave)
- Main Reactor 负责接收连接,Sub Reactor(s)负责处理 I/O (如 Netty)。
- 优点:进一步解耦连接建立和数据处理。
- Main Reactor 负责接收连接,Sub Reactor(s)负责处理 I/O (如 Netty)。
代码示例(C++伪代码)
// Reactor核心伪代码
class Reactor {
public:
void register_handler(EventHandler* handler, EventType type);
void run() {
while (true) {
// 通过epoll等获取就绪事件
events = demultiplexer.wait();
for (auto& event : events) {
// 分发到对应handler
event.handler->handle_event(event.type);
}
}
}
};
应用场景
- Web服务器(Nginx)
- RPC框架(gRPC)
- 实时通信系统(WebSocket)
- KV存储服务端(Redis)
如果需要更具体的实现细节或开源库分析,可以进一步讨论!
内容由零声教学AI助手提供,问题来源于学员提问