文章目录先说结论为什么需要Reactor模式三种Reactor模型单Reactor单线程单Reactor多线程主从Reactor多线程Netty采用Netty的Reactor实现Boss Group 做什么Worker Group 做什么为什么Boss只要1个线程回答技巧与点评加分回答面试官点评个人网站Netty 为什么这么快很多人说因为用了 NIO但 NIO 只是基础真正让 Netty 高性能的核心设计是Reactor 模式。面试官问这题他想听的是Reactor 模式有哪几种Netty 用的是哪种为什么先说结论维度说明Reactor 模式基于 I/O 多路复用的事件驱动模型三种变体单 Reactor 单线程、单 Reactor 多线程、主从 ReactorNetty 采用主从 Reactor 多线程模型Boss Group主 Reactor负责 Accept 连接Worker Group从 Reactor负责 I/O 读写和业务处理一句话记住Reactor 模式就像餐厅的迎宾和服务员——迎宾Boss只管接客服务员Worker只管上菜各司其职效率最高为什么需要Reactor模式传统 BIO 模型一个连接一个线程。客户端1 → 线程1阻塞等待读 客户端2 → 线程2阻塞等待读 客户端3 → 线程3阻塞等待读 ... 客户端10000 → 线程10000 线程爆炸一万个连接就要一万个线程CPU 在线程切换上累死真正干活的没几个。Reactor 模式的思路一个线程监听多个连接的 I/O 事件谁有数据就处理谁。Selector一个线程监听 10000 个连接 ├── 连接1 有数据可读 → 处理 ├── 连接5 有数据可读 → 处理 └── 连接99 有新连接 → Accept就像餐厅迎宾——不需要一个服务员盯着一桌客人迎宾统一看哪个客人招手了就安排对应服务员去服务。三种Reactor模型单Reactor单线程Reactor 线程 ├── Accept 连接 ├── Read 请求 ├── 业务处理 └── Write 响应所有工作都在一个线程中完成。简单但性能差——一个慢请求会阻塞所有其他请求。就像小餐馆老板一个人又迎宾又点菜又炒菜——客人多了就忙不过来。单Reactor多线程Reactor 线程 ├── Accept 连接 └── Read 请求 → 提交到线程池 ├── Worker1 处理业务 Write 响应 ├── Worker2 处理业务 Write 响应 └── Worker3 处理业务 Write 响应一个线程负责 Accept 和 Read业务处理交给线程池。比单线程好但Reactor 线程仍是瓶颈——所有连接的 Accept 和 Read 都由它一人承担。就像餐馆升级了——老板只管迎宾和接单炒菜交给厨师团队。但老板一个人接单还是忙不过来。主从Reactor多线程Netty采用MainReactorBoss Group ├── Boss1: Accept 连接 → 分配给 Worker └── Boss2: Accept 连接 → 分配给 Worker SubReactorWorker Group ├── Worker1: Read Write ├── Worker2: Read Write └── Worker3: Read WriteMain Reactor 只负责 Accept 连接Sub Reactor 负责 I/O 读写业务处理可以交给 Worker 线程或单独的业务线程池。就像大餐厅——迎宾团队Boss Group只管带客人入座服务员团队Worker Group只管点菜上菜分工明确效率最高。Netty的Reactor实现// Netty 的主从 Reactor 模型EventLoopGroupbossGroupnewNioEventLoopGroup(1);// 主 Reactor1个线程EventLoopGroupworkerGroupnewNioEventLoopGroup();// 从 Reactor默认 CPU*2 个线程ServerBootstrapbnewServerBootstrap();b.group(bossGroup,workerGroup)// 配置主从 Reactor.channel(NioServerSocketChannel.class).childHandler(newChannelInitializerSocketChannel(){OverrideprotectedvoidinitChannel(SocketChannelch){ch.pipeline().addLast(newMyHandler());// 业务处理}});Boss Group 做什么// Boss EventLoop 的工作循环while(true){SelectionKeykeyselector.select();// 监听 OP_ACCEPT 事件if(key.isAcceptable()){SocketChannelclientserverChannel.accept();// 接受新连接workerGroup.register(client);// 把连接分配给 Worker}}Boss 只关心一件事有没有新连接进来。1 个线程就够了——Accept 操作非常轻量。Worker Group 做什么// Worker EventLoop 的工作循环while(true){SelectionKeykeyselector.select();// 监听 OP_READ / OP_WRITEif(key.isReadable()){readData(channel);// 读取数据pipeline.fireChannelRead(msg);// 交给 Pipeline 处理}}Worker 关心两件事读数据、写数据。每个 Worker 负责一批连接的 I/O 操作。为什么Boss只要1个线程Accept 操作是 O(1) 的——只是从全连接队列取一个连接非常快。1 个线程完全够用多了反而浪费。如果 Boss 有多个线程多个线程同时 Accept 同一个 ServerSocketChannel还需要同步——反而降低性能。Reactor 模式全景 三种变体 ├── 单 Reactor 单线程 —— 简单但性能差 ├── 单 Reactor 多线程 —— Reactor 仍是瓶颈 └── 主从 Reactor 多线程 —— Netty 采用性能最优 Netty 实现 ├── Boss Group主 Reactor—— Accept1个线程 ├── Worker Group从 Reactor—— Read/WriteCPU*2 个线程 └── Pipeline —— 业务处理链 核心优势 ├── 职责分离Accept vs I/O ├── 非阻塞 I/OSelector 多路复用 └── 事件驱动谁有数据处理谁 口诀单Reactor性能差多线程还是瓶颈 主从Reactor最优秀Boss接客Worker忙 Boss只要一个线Accept轻量不费时 Worker默认CPU乘2读写分离效率高回答技巧与点评标准回答Reactor 模式是基于 I/O 多路复用的事件驱动模型有三种变体单 Reactor 单线程、单 Reactor 多线程、主从 Reactor 多线程。Netty 采用主从 Reactor 多线程模型Boss Group主 Reactor负责 Accept 新连接Worker Group从 Reactor负责 I/O 读写。Boss 通常 1 个线程Accept 操作轻量Worker 默认 CPU 核数×2 个线程。这种模型将连接建立和数据读写分离充分利用多核性能。加分回答Reactor 模式的来源Reactor 模式由 Douglas C. Schmidt 在 1995 年提出最初用于 ACEAdaptive Communication Environment框架。Netty 的实现是对这个模式的工业级优化EventLoop 的本质Netty 的 EventLoop 是一个单线程事件循环每个 Channel 在整个生命周期中只绑定一个 EventLoop保证了 Channel 的操作是线程安全的无需加锁业务线程池如果业务处理耗时可以在 Pipeline 中添加自定义线程池DefaultEventExecutorGroup避免阻塞 Worker 的 I/O 操作——这实际上是在主从 Reactor 之外加了一层业务处理线程池面试官点评这道题考的是你对Netty 架构设计的理解深度。能说出三种 Reactor 变体和 Netty 采用主从模型算及格高分的关键在于讲清楚 Boss 和 Worker 的职责分离以及为什么 Boss 只要 1 个线程。如果你能提到 EventLoop 的单线程绑定和业务线程池的扩展说明你理解得很透彻。原文阅读内容有帮助点赞、收藏、关注三连评论区等你