Netty线程模型

线程模型设计的好坏,决定了系统的吞吐量,并发性和安全性能架构质量属性。Netty线程模型被精心的设计,既提升了并发性,又在很大程度避免锁,局部进行了无锁优化。

Netty线程模型

image

Netty服务端在启动的时候,创建了两个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 权威指南》

你可能感兴趣的:(Netty线程模型)