Netty 线程模型详解
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)vsnew NioEventLoopGroup() - 2.3
MultithreadEventExecutorGroup的初始化过程
三、EventLoop 的执行机制
- 3.1 每个 EventLoop 包含一个 Selector
- 3.2
run()方法——死循环处理 IO 事件和任务 - 3.3
ioRatio——IO 事件和任务的时间比例 - 3.4 任务队列——
taskQueue和scheduledTaskQueue
四、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 线程模型的对比
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!