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

引言

前面讲完 IO 多路复用后,还差最后一步:

"监听到事件之后,到底该怎么组织线程和业务处理逻辑?"

Reactor 模型就是解决这个问题的经典方案。很多高性能网络框架,本质上都在使用它,比如 Netty。

Reactor 的核心思想可以概括为一句话:

"由一个或多个 Reactor 线程负责监听事件,再把事件分发给对应的处理器执行。"

单 Reactor 单线程模型

这是最基础的一种 Reactor 模型。

工作流程如下:

  1. Reactor 线程通过 select 或其他多路复用接口监听事件。
  2. 如果是连接建立事件,就交给 Acceptor 处理。
  3. 如果是读写事件,就分发给对应的 Handler
  4. Handler 在同一个线程里完成读取、业务处理、发送响应。

优点

  • 模型简单
  • 没有线程切换和锁竞争
  • 容易实现

缺点

  • 所有连接和业务处理都挤在一个线程里
  • 一旦某个处理耗时,整个系统都会被拖慢
  • 无法充分利用多核 CPU

所以它适合连接数不多、业务处理很轻的场景。

单 Reactor 单线程模型示意图如下:

单 Reactor 多线程模型

在这个模型里,Reactor 线程仍然只有一个,但它不再承担具体业务处理,而是把业务逻辑交给工作线程池。

流程通常是:

  1. Reactor 负责监听和分发事件。
  2. Acceptor 负责处理新连接。
  3. Handler 完成基础的读写。
  4. 读取到的数据再交给 Worker 线程池做业务处理。
  5. 业务处理完成后,把结果回传给 Handler 发送给客户端。

优点

  • 能利用多核 CPU 做业务处理
  • 比单线程模型吞吐更高

缺点

  • Reactor 线程仍可能成为瓶颈
  • 多线程共享数据后,复杂度会明显上升

这个模型适合连接监听压力不算特别大,但业务处理相对耗时的场景。

单 Reactor 多线程模型示意图如下:

主从 Reactor 多线程模型

这是实际高并发服务器中更经典的一种结构。

它把"接收连接"和"处理读写事件"分开了。

典型流程

  1. 主 Reactor 线程只负责监听连接建立事件。
  2. 新连接建立后,交给某个从 Reactor。
  3. 从 Reactor 负责监听该连接后续的读写事件。
  4. 连接对应的 Handler 负责数据收发。
  5. 业务逻辑交给 Worker 线程池处理。
  6. 处理结果再回到 Handler 发送给客户端。

优点

  • 主线程职责很清晰,只负责接入连接
  • 子线程专注于连接读写
  • 更容易发挥多核能力
  • 在高并发、大流量场景下更稳定

这也是很多成熟网络框架采用的思路。

主从 Reactor 多线程模型示意图如下:

三种 Reactor 模型怎么选

可以按业务规模来理解:

单 Reactor 单线程

适合:

  • 简单教学 Demo
  • 轻量级服务
  • 低并发场景

单 Reactor 多线程

适合:

  • 中等并发
  • 连接监听压力还好
  • 业务处理较重

主从 Reactor 多线程

适合:

  • 高并发服务器
  • 连接数多
  • 需要充分利用多核 CPU

Netty 为什么使用 Reactor 思想

Netty 并不是简单地"封装了 Socket",它的价值很大一部分来自对高性能网络模型的抽象。

Netty 的思路本质上接近主从 Reactor 多线程模型:

  • Boss 线程组负责接收新连接
  • Worker 线程组负责处理已建立连接上的读写事件
  • 业务逻辑可以继续交给单独线程池

这样做的好处是:

  • 网络事件和业务逻辑分层清晰
  • 支持高并发连接
  • 扩展性更强

Reactor 和前面 IO 多路复用的关系

这两个概念容易被混为一谈,但它们不是同一层面的东西。

可以这样理解:

  • IO 多路复用解决的是"如何高效监听多个连接"
  • Reactor 模型解决的是"监听到事件后,如何组织处理流程和线程模型"

也就是说,Reactor 常常建立在 selectpollepoll 这类多路复用机制之上。

总结

Reactor 模型的重点不在于名词,而在于职责拆分:

  1. 谁负责接收连接
  2. 谁负责监听读写事件
  3. 谁负责真正业务处理

从单 Reactor 到主从 Reactor,本质上就是不断把职责拆开,让系统更适合高并发场景。

如果你在学习 Netty,这篇内容一定要和前面的 epoll、NIO 一起理解。只有把这三者连起来,才算真正看懂高性能网络服务的底层设计。


如果这篇文章对你有帮助,欢迎继续阅读本系列后续内容。若文中有不准确或需要补充的地方,也欢迎指出。

相关推荐
一个心烑2 小时前
奖项届定获取方式
java
cch89182 小时前
Laravel与ThinkPHP5.x核心对比
android
weixin_704266052 小时前
redis 的集群
java·数据库·redis
被摘下的星星2 小时前
Java的类加载
java·开发语言
真上帝的左手2 小时前
8. 测试-性能测试-JMeter实战
java·压力测试
cheems95272 小时前
[SpringMVC] SpringWebMVC常见注解介绍
java·springmvc·注解
me8322 小时前
【Java】Spring MVC接口执行流程详解:从前端请求到参数封装全解析(前端到底是怎么和后端交互的?)
java·spring·mvc
skilllite作者2 小时前
SkillLite 多入口架构实战:CLI / Python SDK / MCP / Desktop / Swarm 一页理清
开发语言·人工智能·python·安全·架构·rust·agentskills
niucloud-admin2 小时前
插件开发——upgrade 插件版本升级
java