当我们讨论Netty线程模型的时候,一般首先会想到的是经典的Reactor线程模型,尽管不同的NIO框架对于Reactor模式的实现存在差异,但本质上还是遵循了Reactor的基础线程模型。下面浅谈一下我对Reactor线程模型的认识
1.Reactor单线程模型,是指所有的I/O操作都在同一个NIO线程上面完成。NIO线程的职责如下
作为NIO服务端,接收客户端的TCP连接
作为NIO客户端,向服务端发起TCP连接
读取通信对端的请求或者应答消息
向通信对端发送消息请求或者应答消息
对于小容量的应用可以用单线程,但是对于高负载、大并发的应用不适用,因为性能上无法支撑
2.Rector多线程模型与单线程模型最大的区别就是有一组NIO线程来处理I/O操作,特点如下:
有专门一个NIO线程---Acceptor线程用于监听服务端,接收客户端的TCP连接请求
网络I/O操作--读、写等由一个NIO线程池负责,线程池可以采用标准的JDK线程池实现
一个NIO线程可以同时处理N条链路,但是一个链路只对应一个NIO线程,防止发生并发操作
大多数情况下,用多线程模型就可以满足性能需求,但是如果一个NIO线程负责监听和处理大量连接也有可能会存在性能问题。
3.主从Reactor多线程模型
服务端用于接收客户端连接的不在是一个单独的NIO线程,而是一个独立的NIO线程池。Acceptor接收到客户端TCP连接请求并处理完成后(可能包含介入认证等),将新创建的SocketChannel注册到I/O线程池的某个I/O线程上,由它负责SocketChannel的读写和编解码工作,可以解决一个服务端监听线程性能不足的问题,因此Netty的官方demo中,推荐使用该线程模型
时间: 2024-10-26 11:53:18