Netty线程模型

77 阅读3分钟

Netty线程模型基于Reactor线程模型。

Reactor线程模型分为Reactor单线程模型、Reactor多线程模型和主从Reactor多线程模型。

Reactor单线程模型

Reactor单线程模型使用一条NIO线程来完成所有的IO操作。

Reactor单线程模型.jpg

NIO线程的职责如下:

  • 作为NIO服务端,接收客户端的TCP连接请求。
  • 作为NIO客户端,向服务端发送TCP连接请求。
  • 读取通信对端的请求和应答消息。
  • 向通信对端发送请求消息和应答消息。

Reactor单线程模型的应用场景:

Reactor单线程模型只能应用于小容量的应用场景,不适合高负载、大并发的应用场景。原因如下:

  1. 一条NIO线程无法处理成百上千的链路,性能上无法满足。即便NIO线程的CPU使用率达到100%,也无法满足海量消息的编码、解码、读取和发送。
  2. NIO线程负载过高时,处理速度会变慢,导致大量客户端的TCP连接请求超时。超时之后,客户端往往会进行重发,更加加重了线程负载,最终导致大量消息堆积和处理超时。
  3. 可靠性问题:当NIO线程意外跑飞或陷入死循环,会导致整个系统的通信模块不可用,不能接受和处理消息,造成节点故障。

Reactor多线程模型

Reactor多线程模型和Reactor单线程模型区别在于:Reactor多线程模型不再使用一条NIO线程来处理IO操作,而是一组NIO线程。

Reactor多线程模型.jpg

Reactor多线程模型的特点:

  • 有专门一条线程——Reactor线程用于监听服务器,接收客户端的TCP连接。
  • 使用线程池来处理所有的IO操作。线程池可以使用标准的JDK线程池实现,由一个任务队列和N条可用的线程组成。
  • 一条线程可以同时处理多条链路,但一条链路只能对应一条线程,避免并发操作问题发生。

Reactor多线程模型的应用场景:

Reactor多线程模型能够满足大部分的应用场景,但是在一些特殊的应用场景下可能存在性能不足的问题。例如,上百万的客户端连接或者需要对客户端的握手进行认证,而认证本身十分损耗性能。在这种情况下,使用一条NIO线程来处理所有的客户端TCP请求会存在性能不足的问题。

于是,就出现了主从Reactor多线程模型。

主从Reactor多线程模型

主从Reactor多线程模型不再使用一条NIO线程来处理TCP请求,而是使用了线程池来处理TCP请求(可能包含认证)。

主从Reactor多线程模型.jpg

Netty线程模型

Netty线程模型并不是一成不变的,根据用户配置的启动参数的不同,Netty可以支持Reactor单线程模型、Reactor多线程模型和主从Reactor多线程模型。