Reactor模式#
一句话答案#
Reactor 用少量线程监听多连接 IO 事件再分发处理,Netty 用主从 Reactor:BossGroup 接连接 + WorkerGroup 处理 IO。
核心要点
三种模型:
| 模型 | 结构 | 适用 |
|---|---|---|
| 单 Reactor 单线程 | 1个线程处理一切 | 小规模 |
| 单 Reactor 多线程 | Reactor监听+线程池处理 | 中等规模 |
| 主从 Reactor | 主Reactor接连接+从Reactor处理IO | 高并发(Netty) |
Netty: BossGroup(accept) + WorkerGroup(IO) + Pipeline(Handler链)
(Netty 4.2 起 NioEventLoopGroup 等按传输区分的 EventLoopGroup 被标记废弃,改为 MultiThreadIoEventLoopGroup + NioIoHandler.newFactory() 这类 IoHandlerFactory 写法;Boss/Worker 主从结构不变)
面试回答(2分钟版)
Reactor模式是一种基于事件驱动和IO多路复用的网络编程模型,核心思想是用少量线程监听大量连接的IO事件,事件就绪后分发给对应的处理器处理。它有三种演进形式:单Reactor单线程就是一个线程干所有事,适合小规模场景;单Reactor多线程是Reactor线程负责监听事件,业务处理交给线程池,适合中等规模;主从Reactor是目前高并发场景的主流方案,主Reactor(BossGroup)只负责接收新连接,从Reactor(WorkerGroup)负责处理已建立连接的IO读写,业务逻辑再交给Handler链处理。Netty就是典型的主从Reactor实现,BossGroup接受连接后注册到WorkerGroup的某个NioEventLoop上,每个EventLoop绑定一个线程负责该连接后续所有IO操作,通过Pipeline中的Handler链来处理编解码和业务逻辑。和Proactor的区别在于Reactor是同步非阻塞,应用程序自己读数据;Proactor是异步的,OS完成IO后通知应用。
追问与易错
追问方向:
- “单 Reactor 和主从 Reactor 区别?”→ 单 Reactor 一个线程监听所有事件(accept+IO 竞争),主从 Reactor 主线程只负责 accept,从线程处理 IO 读写,互不干扰
- “Netty 的线程模型?”→ 典型主从 Reactor:BossGroup(1个 EventLoop 负责 accept)+ WorkerGroup(多个 EventLoop 各绑定一个线程处理 IO)+ Pipeline Handler 链
- “Reactor 和 Proactor 区别?”→ Reactor 是同步非阻塞(应用程序自己读数据),Proactor 是异步(OS 完成 IO 后通知应用直接拿结果),Linux 传统 AIO(libaio)基本只支持 O_DIRECT 文件 IO、不适合网络,所以主流用 Reactor;Linux 5.1 起的 io_uring 提供了真正的异步接口,Netty 4.2 已把 io_uring transport 从孵化器转为正式模块
易错点:
- ❌ Reactor 是多线程模型——核心是事件驱动+IO 多路复用
- ❌ 一个 Channel 的 IO 事件会被 WorkerGroup 里多个线程轮流处理——Channel 注册后终身绑定一个 EventLoop(一个线程),一个 EventLoop 则服务多个 Channel,所以同一连接的 Handler 天然串行、无需加锁
- ❌ Handler 里可以直接跑耗时业务(查库、RPC)——会阻塞该 EventLoop 上所有连接的 IO,耗时逻辑应交给业务线程池或指定 EventExecutorGroup