Netty线程模型基于Reactor线程模型。
Reactor线程模型分为Reactor单线程模型、Reactor多线程模型和主从Reactor多线程模型。
Reactor单线程模型
Reactor单线程模型使用一条NIO线程来完成所有的IO操作。
NIO线程的职责如下:
- 作为NIO服务端,接收客户端的TCP连接请求。
- 作为NIO客户端,向服务端发送TCP连接请求。
- 读取通信对端的请求和应答消息。
- 向通信对端发送请求消息和应答消息。
Reactor单线程模型的应用场景:
Reactor单线程模型只能应用于小容量的应用场景,不适合高负载、大并发的应用场景。原因如下:
- 一条NIO线程无法处理成百上千的链路,性能上无法满足。即便NIO线程的CPU使用率达到100%,也无法满足海量消息的编码、解码、读取和发送。
- NIO线程负载过高时,处理速度会变慢,导致大量客户端的TCP连接请求超时。超时之后,客户端往往会进行重发,更加加重了线程负载,最终导致大量消息堆积和处理超时。
- 可靠性问题:当NIO线程意外跑飞或陷入死循环,会导致整个系统的通信模块不可用,不能接受和处理消息,造成节点故障。
Reactor多线程模型
Reactor多线程模型和Reactor单线程模型区别在于:Reactor多线程模型不再使用一条NIO线程来处理IO操作,而是一组NIO线程。
Reactor多线程模型的特点:
- 有专门一条线程——Reactor线程用于监听服务器,接收客户端的TCP连接。
- 使用线程池来处理所有的IO操作。线程池可以使用标准的JDK线程池实现,由一个任务队列和N条可用的线程组成。
- 一条线程可以同时处理多条链路,但一条链路只能对应一条线程,避免并发操作问题发生。
Reactor多线程模型的应用场景:
Reactor多线程模型能够满足大部分的应用场景,但是在一些特殊的应用场景下可能存在性能不足的问题。例如,上百万的客户端连接或者需要对客户端的握手进行认证,而认证本身十分损耗性能。在这种情况下,使用一条NIO线程来处理所有的客户端TCP请求会存在性能不足的问题。
于是,就出现了主从Reactor多线程模型。
主从Reactor多线程模型
主从Reactor多线程模型不再使用一条NIO线程来处理TCP请求,而是使用了线程池来处理TCP请求(可能包含认证)。
Netty线程模型
Netty线程模型并不是一成不变的,根据用户配置的启动参数的不同,Netty可以支持Reactor单线程模型、Reactor多线程模型和主从Reactor多线程模型。