当前位置: 首页 > news >正文

Netty:底层模式:Reactor 模式

Netty:底层模式:Reactor 模式

底层模式:Reactor 模式

什么是 Reactor 模式?

Reactor 模式是一种事件驱动的并发处理模式,通过 I/O 多路复用监听事件,当事件就绪时分发到对应的处理器处理。Netty 的线程模型就是基于 Reactor 模式实现的。

三种 Reactor 模式对比

模式 结构 优点 缺点 适用场景
单 Reactor 单线程 1 个线程处理所有事件 简单、无并发问题 性能瓶颈、单点故障 连接数少、处理快
单 Reactor 多线程 1 个 Reactor + 多个 Worker 线程 充分利用多核 CPU Reacto 仍是瓶颈 中等并发
主从 Reactor 多线程 MainReactor + SubReactor + Worker 高性能、高可用 复杂度高 高并发场景(Netty 采用)

模式一:单 Reactor 单线程

                    ┌─────────────────┐
客户端连接 ────────→ │   Reactor       ││   (单线程)       ││                 ││  - 监听事件      ││  - 分发事件      ││  - 处理业务      │└─────────────────┘

特点:

  • 一个线程完成:监听连接、分发事件、处理业务
  • 线程安全,无需加锁
  • 性能瓶颈:处理慢会阻塞后续事件

代码示意:

while (true) {selector.select();      // 监听事件Set<SelectionKey> keys = selector.selectedKeys();for (SelectionKey key : keys) {if (key.isAcceptable()) {// 处理连接} else if (key.isReadable()) {// 处理读取(业务逻辑也在同一线程)}}
}

模式二:单 Reactor 多线程

                    ┌─────────────────┐
客户端连接 ────────→ │   Reactor       ││   (单线程)       ││                 ││  - 监听事件      │──────→ ┌─────────────┐│  - 分发事件      │        │ Handler 线程池 │└─────────────────┘        │  - 处理业务   │└─────────────┘

特点:

  • Reactor 线程:只负责监听和分发
  • Handler 线程池:负责处理业务逻辑
  • 瓶颈:Reactor 单线程处理分发,高并发时仍有瓶颈

模式三:主从 Reactor 多线程(Netty 采用)

                    ┌─────────────────────┐
客户端连接 ────────→ │  MainReactor (Boss)  ││  - 监听连接          │└──────────┬───────────┘│ 接收新连接▼┌─────────────────────┐│  SubReactor (Worker) ││  - 监听读写事件      │──────→ ┌─────────────┐│  - 分发事件          │        │ Handler 线程池 │└─────────────────────┘        │  - 处理业务   │└─────────────┘

特点:

  • MainReactor(Boss):专门处理连接请求(Accept)
  • SubReactor(Worker):处理已建立连接的 I/O 读写
  • Handler 线程池:处理耗时业务逻辑(可选)
  • 无瓶颈:MainReactor 和 SubReactor 各司其职

Netty 对应实现:

// Boss Group:对应 MainReactor,处理连接
EventLoopGroup bossGroup = new NioEventLoopGroup(1);// Worker Group:对应 SubReactor,处理读写
EventLoopGroup workerGroup = new NioEventLoopGroup();ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)  // 主从 Reactor.channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ch.pipeline().addLast(new MyHandler());}});

Netty 为什么选择主从 Reactor?

对比项 单线程 多线程 主从 Reactor
并发处理能力 ❌ 低 ⚠️ 中 ✅ 高
CPU 利用率 ❌ 低 ⚠️ 中 ✅ 高
编程复杂度 ✅ 简单 ⚠️ 中等 ❌ 复杂(Netty 封装了)
可扩展性 ❌ 差 ⚠️ 中 ✅ 好

总结: Netty 通过封装主从 Reactor 模式,既保留了高性能,又降低了使用复杂度。