线程模型设计的好坏,决定了系统的吞吐量,并发性和安全性能架构质量属性。Netty线程模型被精心的设计,既提升了并发性,又在很大程度避免锁,局部进行了无锁优化。
Netty线程模型
imageNetty服务端在启动的时候,创建了两个NioEventLoopGroup,它们实际是两个独立的Reactor线程池,一个用于接收客户端的TCP连接,另一个用于处理I/O相关的读写操作,或者执行系统Task,定时任务Task等。
Netty用于接收客户端请求的线程池职责如下:
- 接收客户端TCP连接,初始化Channel参数
- 将链路状态变更事件通知给ChannelPipeline
Netty处理I/O操作的线程池职责如下:
- 异步读取通信对端的数据报,发送读事件到ChannelPipeLine
- 异步发送消息到通信对端,调用ChannelPipeLine的消息发送接口
- 执行系统调用Task
- 执行定时任务Task
最佳实践
Netty的多线程编程最佳实践如下:
- 尽量不要再ChannelHandler中启动用户线程(解码后用于将POJO消息派发到后端业务线程的除外)
- 解码要放在NIO线程调度用的解码Handler中进行,不要切换到用户线程完成消息的解码。专门的类做专门的事,Netty内部提供了编码与解码的抽象类
- 如果用户业务逻辑复杂,不要再NIO线程上完成,建议派发到业务线程中执行,以保证NIO线程尽快被释放
- 如果用户业务逻辑简单,可以直接在NIO线程上完成。
最后
学习Netty的笔记,参考《Netty 权威指南》
网友评论