Reactor模型
Reactor 是一种模式,它要求主线程只负责监听文件描述符(I/O处理单元)是否有事件发生,有的话就立即将该事件通知工作线程(逻辑单元)完成处理。除此之外,主线程不做任何其他实质性的工作。读写数据以及处理客户请求均在工作线程中完成。
Netty中的Reactor模型
Netty 中的 Reactor 模型主要由多路复用器 (Acceptor)、事件分发器 (Dispatcher)、事件处理器 (Handler) 组成,可以分为单线程模型,多线程模型和主从Reactor多线程模型三种。
-
Reactor单线程模型
-
Reactor多线程模型
-
主从Reactor多线程模型
Reactor 模式可以参考:Reactor模式详解+源码实现
1. 单线程模型
所有 I/O 操作都由一个线程完成,即多路复用、事件分发和处理都是在一个 Reactor 线程上完成的,一个 Reactor 线程就是一个 NIO 线程。
Reactor 单线程模型使用的是一个 NIO 线程, NIO 使用的是非阻塞 I/O,所有的 I/O 操作都不会阻塞,所以一个线程可以处理多个 TCP 连接请求。
对于一些小容量应用场景,可以使用单线程模型,但是对于高负载、大并发的应用却不合适,主要原因如下:
-
一个 NIO 线程同时处理成百上千的链路,性能上无法支撑。即便 NIO 线程的CPU负荷达到100%,也无法满足海量消息的编码、解码、读取和发送;
-
当 NIO 线程负载过重之后,处理速度将变慢,这会导致大量客户端连接超时,超时之后往往进行重发,这更加重了 NIO 线程的负载,最终导致大量消息积压和处理超时,NIO 线程会成为系统的性能瓶颈;
-
可靠性问题。一旦 NIO 线程意外跑飞,或者进入死循环,会导致整个系统通讯模块不可用,不能接收和处理外部信息,造成节点故障。
2 Reactor多线程模型
Reactor多线程模型与单线程模型最大区别就是有一组 NIO 线程处理 I/O 操作,它的特点如下:
-
有一个专门的 NIO 线程用于监听服务端,接收客户端的TCP连接请求;
-
网络I/O读、写操作等由一个 NIO 线程池负责,线程池可以采用标准的 JDK 线程池实现(Netty 扩展了 JDK 线程池)