核心概念
Reactor 模式是一种事件驱动的设计模式,用于处理并发 I/O 操作。在 Netty 中,Reactor 模式通过 事件循环(EventLoop) 来管理多个连接的 I/O 事件,避免了为每个连接创建线程的开销。
核心思想:一个或多个线程监听多个 I/O 事件,事件就绪后分发给相应的处理器(Handler)进行处理。
原理与实现
Reactor 模式的三个核心角色
- Reactor(反应器):负责监听和分发事件,在 Netty 中对应
EventLoop - Handler(处理器):负责处理具体的业务逻辑,在 Netty 中对应
ChannelHandler - 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();
}
}
事件分发流程
- Selector.select():阻塞等待 I/O 事件
- processSelectedKeys():处理就绪的 Channel(读/写/连接)
- pipeline.fireChannelRead():将事件传递到 ChannelPipeline
- Handler 链式处理:依次执行业务逻辑
性能优化与线程安全
优化点
- 零拷贝:通过
DirectByteBuffer和FileRegion减少数据拷贝 - 内存池化:使用
PooledByteBufAllocator复用内存 - 无锁化设计:每个 Channel 绑定到固定的 EventLoop,避免锁竞争
线程安全保证
- Channel 与 EventLoop 绑定:同一个 Channel 的所有事件都在同一个 EventLoop 线程中处理
- 任务队列机制:其他线程通过
eventLoop.execute()提交任务,确保线程安全
// 保证线程安全的方式
if (channel.eventLoop().inEventLoop()) {
// 已在 EventLoop 线程中,直接执行
doSomething();
} else {
// 提交到 EventLoop 的任务队列
channel.eventLoop().execute(() -> doSomething());
}
总结
面试答题要点:
- 核心:Reactor 模式通过事件循环机制实现高并发 I/O 处理
- 三种模型:单 Reactor 单线程、单 Reactor 多线程、主从 Reactor 多线程
- Netty 推荐:主从 Reactor 模型(BossGroup 负责 accept,WorkerGroup 负责读写)
- 优势:线程模型清晰、无锁化设计、高性能、易扩展
典型应用:RPC 框架(Dubbo)、消息中间件(RocketMQ)、实时通信系统。