Netty:底层模式:Reactor 模式

[复制链接]
发表于 2026-3-12 09:32:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
底层模式:Reactor 模式

什么是 Reactor 模式?
Reactor 模式是一种事故驱动的并发处置处罚模式,通过 I/O 多路复用监听事故,当事故停当时分发到对应的处置处罚器处置处罚。Netty 的线程模子就是基于 Reactor 模式实现的。
三种 Reactor 模式对比

模式布局优点缺点实用场景单 Reactor 单线程1 个线程处置处罚全部事故简单、无并发题目性能瓶颈、单点故障毗连数少、处置处罚快单 Reactor 多线程1 个 Reactor + 多个 Worker 线程充实使用多核 CPUReacto 还是瓶颈中等并发主从 Reactor 多线程MainReactor + SubReactor + Worker高性能、高可用复杂度高高并发场景(Netty 接纳)模式一:单 Reactor 单线程
  1.                     ┌─────────────────┐
  2. 客户端连接 ────────→ │   Reactor       │
  3.                     │   (单线程)       │
  4.                     │                 │
  5.                     │  - 监听事件      │
  6.                     │  - 分发事件      │
  7.                     │  - 处理业务      │
  8.                     └─────────────────┘
复制代码
特点:

  • 一个线程完成:监听毗连、分发事故、处置处罚业务
  • 线程安全,无需加锁
  • 性能瓶颈:处置处罚慢会壅闭后续事故
代码表现:
  1. while (true) {
  2.     selector.select();      // 监听事件
  3.     Set<SelectionKey> keys = selector.selectedKeys();
  4.     for (SelectionKey key : keys) {
  5.         if (key.isAcceptable()) {
  6.             // 处理连接
  7.         } else if (key.isReadable()) {
  8.             // 处理读取(业务逻辑也在同一线程)
  9.         }
  10.     }
  11. }
复制代码
模式二:单 Reactor 多线程
  1.                     ┌─────────────────┐
  2. 客户端连接 ────────→ │   Reactor       │
  3.                     │   (单线程)       │
  4.                     │                 │
  5.                     │  - 监听事件      │──────→ ┌─────────────┐
  6.                     │  - 分发事件      │        │ Handler 线程池 │
  7.                     └─────────────────┘        │  - 处理业务   │
  8.                                                └─────────────┘
复制代码
特点:

  • Reactor 线程:只负责监听和分发
  • Handler 线程池:负责处置处罚业务逻辑
  • 瓶颈:Reactor 单线程处置处罚分发,高并发时仍有瓶颈
模式三:主从 Reactor 多线程(Netty 接纳)
  1.                     ┌─────────────────────┐
  2. 客户端连接 ────────→ │  MainReactor (Boss)  │
  3.                     │  - 监听连接          │
  4.                     └──────────┬───────────┘
  5.                                │ 接收新连接
  6.                                ▼
  7.                     ┌─────────────────────┐
  8.                     │  SubReactor (Worker) │
  9.                     │  - 监听读写事件      │──────→ ┌─────────────┐
  10.                     │  - 分发事件          │        │ Handler 线程池 │
  11.                     └─────────────────────┘        │  - 处理业务   │
  12.                                                    └─────────────┘
复制代码
特点:

  • MainReactor(Boss):专门处置处罚毗连哀求(Accept)
  • SubReactor(Worker):处置处罚已创建毗连的 I/O 读写
  • Handler 线程池:处置处罚耗时业务逻辑(可选)
  • 无瓶颈:MainReactor 和 SubReactor 各司其职
Netty 对应实现:
  1. // Boss Group:对应 MainReactor,处理连接
  2. EventLoopGroup bossGroup = new NioEventLoopGroup(1);
  3. // Worker Group:对应 SubReactor,处理读写
  4. EventLoopGroup workerGroup = new NioEventLoopGroup();
  5. ServerBootstrap b = new ServerBootstrap();
  6. b.group(bossGroup, workerGroup)  // 主从 Reactor
  7. .channel(NioServerSocketChannel.class)
  8. .childHandler(new ChannelInitializer<SocketChannel>() {
  9.      @Override
  10.      protected void initChannel(SocketChannel ch) {
  11.          ch.pipeline().addLast(new MyHandler());
  12.      }
  13. });
复制代码
Netty 为什么选择主从 Reactor?

对比项单线程多线程主从 Reactor并发处置处罚本领❌ 低⚠️ 中✅ 高CPU 使用率❌ 低⚠️ 中✅ 高编程复杂度✅ 简单⚠️ 中等❌ 复杂(Netty 封装了)可扩展性❌ 差⚠️ 中✅ 好总结: Netty 通过封装主从 Reactor 模式,既生存了高性能,又低沉了使用复杂度。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表