Reactor 模型详解:单 Reactor、主从 Reactor 与 Netty 思想

张开发
2026/4/11 14:34:50 15 分钟阅读

分享文章

Reactor 模型详解:单 Reactor、主从 Reactor 与 Netty 思想
引言前面讲完 IO 多路复用后还差最后一步“监听到事件之后到底该怎么组织线程和业务处理逻辑”Reactor 模型就是解决这个问题的经典方案。很多高性能网络框架本质上都在使用它比如 Netty。Reactor 的核心思想可以概括为一句话“由一个或多个 Reactor 线程负责监听事件再把事件分发给对应的处理器执行。”单 Reactor 单线程模型这是最基础的一种 Reactor 模型。工作流程如下Reactor 线程通过select或其他多路复用接口监听事件。如果是连接建立事件就交给Acceptor处理。如果是读写事件就分发给对应的Handler。Handler在同一个线程里完成读取、业务处理、发送响应。优点模型简单没有线程切换和锁竞争容易实现缺点所有连接和业务处理都挤在一个线程里一旦某个处理耗时整个系统都会被拖慢无法充分利用多核 CPU所以它适合连接数不多、业务处理很轻的场景。单 Reactor 单线程模型示意图如下单 Reactor 多线程模型在这个模型里Reactor 线程仍然只有一个但它不再承担具体业务处理而是把业务逻辑交给工作线程池。流程通常是Reactor 负责监听和分发事件。Acceptor负责处理新连接。Handler完成基础的读写。读取到的数据再交给 Worker 线程池做业务处理。业务处理完成后把结果回传给Handler发送给客户端。优点能利用多核 CPU 做业务处理比单线程模型吞吐更高缺点Reactor 线程仍可能成为瓶颈多线程共享数据后复杂度会明显上升这个模型适合连接监听压力不算特别大但业务处理相对耗时的场景。单 Reactor 多线程模型示意图如下主从 Reactor 多线程模型这是实际高并发服务器中更经典的一种结构。它把“接收连接”和“处理读写事件”分开了。典型流程主 Reactor 线程只负责监听连接建立事件。新连接建立后交给某个从 Reactor。从 Reactor 负责监听该连接后续的读写事件。连接对应的Handler负责数据收发。业务逻辑交给 Worker 线程池处理。处理结果再回到Handler发送给客户端。优点主线程职责很清晰只负责接入连接子线程专注于连接读写更容易发挥多核能力在高并发、大流量场景下更稳定这也是很多成熟网络框架采用的思路。主从 Reactor 多线程模型示意图如下三种 Reactor 模型怎么选可以按业务规模来理解单 Reactor 单线程适合简单教学 Demo轻量级服务低并发场景单 Reactor 多线程适合中等并发连接监听压力还好业务处理较重主从 Reactor 多线程适合高并发服务器连接数多需要充分利用多核 CPUNetty 为什么使用 Reactor 思想Netty 并不是简单地“封装了 Socket”它的价值很大一部分来自对高性能网络模型的抽象。Netty 的思路本质上接近主从 Reactor 多线程模型Boss线程组负责接收新连接Worker线程组负责处理已建立连接上的读写事件业务逻辑可以继续交给单独线程池这样做的好处是网络事件和业务逻辑分层清晰支持高并发连接扩展性更强Reactor 和前面 IO 多路复用的关系这两个概念容易被混为一谈但它们不是同一层面的东西。可以这样理解IO 多路复用解决的是“如何高效监听多个连接”Reactor 模型解决的是“监听到事件后如何组织处理流程和线程模型”也就是说Reactor 常常建立在select、poll、epoll这类多路复用机制之上。总结Reactor 模型的重点不在于名词而在于职责拆分谁负责接收连接谁负责监听读写事件谁负责真正业务处理从单 Reactor 到主从 Reactor本质上就是不断把职责拆开让系统更适合高并发场景。如果你在学习 Netty这篇内容一定要和前面的epoll、NIO 一起理解。只有把这三者连起来才算真正看懂高性能网络服务的底层设计。如果这篇文章对你有帮助欢迎继续阅读本系列后续内容。若文中有不准确或需要补充的地方也欢迎指出。

更多文章