面试知识库
中 困难

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