netty线程模型

模型的演变过程

  1. 阻塞IO模型

优点:编程简单

缺点:1)一个客户端连接一个线程,高并发情况下会产生大量线程,浪费系统资源

           2)如果连接空闲,线程也必须等待,线程资源浪费

 

  2. reactor模型是对上面模型的改进

核心基于两点:

1)基于IO多路复用,一个线程可以处理多个客户端连接

2)基于线程池,业务复用线程资源

 

reactor模型包括三种:

      1. 单reactor单线程:一个线程采用selecor执行所有的accept请求、处理所有业务逻辑 (图片来源:https://www.jianshu.com/p/38b56531565d)

netty线程模型

缺点:1)单个线程不能利用多核cpu优势  2)不适用高并发场景  3)如果线程异常或者有死循环,会导致整个系统通信模块不可用。

       2. 单reactor多线程:一个线程通过selector不断轮询接收新的请求,将连接交给线程池中某个线程来处理(图片来源:https://www.jianshu.com/p/38b56531565d)

netty线程模型

缺点是:因为监听客户端连接的线程只有一个,可能存在单点问题

      3. 主从reactor: 主reator可以有多个线程来接收客户端连接,并将客户端连接绑定到从reactor上某个线程来处理(图片来源:https://www.jianshu.com/p/38b56531565d)

netty线程模型

缺点:编程相对复杂

 

netty线程模型(此图片来源于尚硅谷)

netty线程模型

说明:

1) netty线程模型是即可以是单reactor多线程模型,也可以是主从reactor模型,可以配置bossGroup和workerGroup中线程个数

2)一个BossGroup中包含多个NioEventLoop,一个NioEventLoop对应一个线程,用于监听客户端的连接事件,线程在不断执行 accept、processSelectedkeys、runAlltasks这几个事情

3)workerGroup中也包含多个NioEventLoop,一个NioEventLoop对应一个线程,用于处理客户端的读写事件,线程在不断执行select、processSelectedkeys、runAlltasks这几个事情

4)当BossGroup中某个NioEventLoop接收到客户端的连接请求后,将连接socketChannel封装成NioSocketChannel(这个channel会绑定一个相应的pipeline)注册到workerGroup中某个NioEventLoop (netty中根据workerGroup中NioEventLoop个数做了相应优化,如果个数是2的整数倍,则模上(个数-1)如果不是2的整数倍,则用一个院子累加器+1后模上总个数)

5)一个pipeline中包含多个channelHandler,执行具体的业务逻辑,netty已经自带了很多hendler

6)runAllTasks的使用场景还需要再具体了解下