Netty 的高性能离不开其精巧的线程模型。从 Boss 线程接收连接到 Worker 线程处理 IO,主从 Reactor 模型如何落地?

一、Netty 线程模型概述

  • 1.1 BossGroup 和 WorkerGroup 的职责划分
  • 1.2 EventLoop——Netty 的线程抽象
  • 1.3 一个 EventLoop 绑定一个线程——thread-safe 的保证

二、EventLoopGroup 的创建

  • 2.1 NioEventLoopGroup——Boss / Worker 的创建
  • 2.2 线程数设置——new NioEventLoopGroup(1) vs new NioEventLoopGroup()
  • 2.3 MultithreadEventExecutorGroup 的初始化过程

三、EventLoop 的执行机制

  • 3.1 每个 EventLoop 包含一个 Selector
  • 3.2 run() 方法——死循环处理 IO 事件和任务
  • 3.3 ioRatio ——IO 事件和任务的时间比例
  • 3.4 任务队列——taskQueuescheduledTaskQueue

四、Boss EventLoop 的工作

  • 4.1 监听 OP_ACCEPT 事件
  • 4.2 接收新连接——NioServerSocketChannel
  • 4.3 将 NioSocketChannel 注册到 Worker EventLoop
  • 4.4 负载均衡——next() 选择 Worker

五、Worker EventLoop 的工作

  • 5.1 监听 OP_READ / OP_WRITE 事件
  • 5.2 Channel 与 EventLoop 的绑定——一旦绑定不再变更
  • 5.3 Pipeline 中的 Handler 执行——保证线程安全

六、主从 Reactor 的完整流程

  • 6.1 架构图——Boss → Worker → Handler
  • 6.2 源码走读——NioEventLoop.run()processSelectedKeys()
  • 6.3 事件传播——ChannelPipeline.fireChannelRead()

七、性能优化技巧

  • 7.1 Boss Group 通常只需要 1-2 个线程
  • 7.2 Worker Group 线程数 = CPU 核心数 * 2
  • 7.3 避免在 EventLoop 中执行耗时任务——使用 DefaultEventExecutorGroup
  • 7.4 addLast(EventExecutorGroup, ChannelHandler) 指定业务线程池

八、总结

  • Netty 线程模型的三个核心——EventLoop、Selector、Pipeline
  • 与 Tomcat 线程模型的对比