核心概念

Reactor 模式是一种事件驱动的设计模式,用于处理并发 I/O 操作。在 Netty 中,Reactor 模式通过 事件循环(EventLoop) 来管理多个连接的 I/O 事件,避免了为每个连接创建线程的开销。

核心思想:一个或多个线程监听多个 I/O 事件,事件就绪后分发给相应的处理器(Handler)进行处理


原理与实现

Reactor 模式的三个核心角色

  1. Reactor(反应器):负责监听和分发事件,在 Netty 中对应 EventLoop
  2. Handler(处理器):负责处理具体的业务逻辑,在 Netty 中对应 ChannelHandler
  3. Acceptor(接收器):负责接收新连接,在 Netty 中由 Boss EventLoopGroup 处理

Netty 中的三种 Reactor 线程模型

1. 单 Reactor 单线程模型

EventLoopGroup group = new NioEventLoopGroup(1);
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(group)
    .channel(NioServerSocketChannel.class);
  • 特点:一个线程处理所有 I/O 事件(accept、read、write)
  • 适用场景:客户端连接少、业务处理简单
  • 缺点:性能瓶颈明显,无法充分利用多核 CPU

2. 单 Reactor 多线程模型

EventLoopGroup group = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(group)
    .channel(NioServerSocketChannel.class);
  • 特点:一个 Reactor 线程处理 I/O 事件,业务逻辑交给线程池
  • 优点:业务处理不阻塞 I/O 线程
  • 缺点:单个 Reactor 仍可能成为瓶颈

3. 主从 Reactor 多线程模型(Netty 推荐

EventLoopGroup bossGroup = new NioEventLoopGroup(1);      // 主 Reactor
EventLoopGroup workerGroup = new NioEventLoopGroup();     // 从 Reactor
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
    .channel(NioServerSocketChannel.class);
  • 特点
    • BossGroup:负责接收新连接(accept)
    • WorkerGroup:负责处理已建立连接的读写事件
  • 优点:职责分离,充分利用多核 CPU
  • 适用场景:高并发、高性能的服务端应用

源码关键点

EventLoop 的核心逻辑

// NioEventLoop.run() 核心循环
protected void run() {
    for (;;) {
        // 1. 检测是否有 I/O 事件就绪
        select(wakenUp.getAndSet(false));
        
        // 2. 处理 I/O 事件
        processSelectedKeys();
        
        // 3. 处理异步任务队列
        runAllTasks();
    }
}

事件分发流程

  1. Selector.select():阻塞等待 I/O 事件
  2. processSelectedKeys():处理就绪的 Channel(读/写/连接)
  3. pipeline.fireChannelRead():将事件传递到 ChannelPipeline
  4. Handler 链式处理:依次执行业务逻辑

性能优化与线程安全

优化点

  1. 零拷贝:通过 DirectByteBufferFileRegion 减少数据拷贝
  2. 内存池化:使用 PooledByteBufAllocator 复用内存
  3. 无锁化设计:每个 Channel 绑定到固定的 EventLoop,避免锁竞争

线程安全保证

  • Channel 与 EventLoop 绑定:同一个 Channel 的所有事件都在同一个 EventLoop 线程中处理
  • 任务队列机制:其他线程通过 eventLoop.execute() 提交任务,确保线程安全
// 保证线程安全的方式
if (channel.eventLoop().inEventLoop()) {
    // 已在 EventLoop 线程中,直接执行
    doSomething();
} else {
    // 提交到 EventLoop 的任务队列
    channel.eventLoop().execute(() -> doSomething());
}

总结

面试答题要点

  1. 核心:Reactor 模式通过事件循环机制实现高并发 I/O 处理
  2. 三种模型:单 Reactor 单线程、单 Reactor 多线程、主从 Reactor 多线程
  3. Netty 推荐:主从 Reactor 模型(BossGroup 负责 accept,WorkerGroup 负责读写)
  4. 优势:线程模型清晰、无锁化设计、高性能、易扩展

典型应用:RPC 框架(Dubbo)、消息中间件(RocketMQ)、实时通信系统。