Netty源码剖析与应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 Netty线程模型

从本节开始了解Netty的特性,首先从线程模型开始。在第1章中,讲到过两个线程组,即Boss线程组和Worker线程组。其中,Boss线程组一般只开启一条线程,除非一个Netty服务同时监听多个端口。Worker线程数默认是CPU核数的两倍,Boss线程主要监听SocketChannel的OP_ACCEPT事件和客户端的连接(主线程)。

当Boss线程监听到有SocketChannel连接接入时,会把SocketChannel包装成NioSocketChannel,并注册到Worker线程的Selector中,同时监听其OP_WRITE和OP_READ事件。当Worker线程监听到某个SocketChannel有就绪的读I/O事件时,会进行以下操作。

(1)向内存池中分配内存,读取I/O数据流。

(2)将读取后的ByteBuf传递给解码器Handler进行解码,若能解码出完整的请求数据包,就会把请求数据包交给业务逻辑处理Handler。

(3)经过业务逻辑处理Handler后,在返回响应结果前,交给编码器进行数据加工。

(4)最终写到缓存区,并由I/O Worker线程将缓存区的数据输出到网络中并传输给客户端。

Netty主从线程模型如图2-3所示,图中有个任务队列,这个任务队列主要是用来处理一些定时任务的,如连接的心跳检测。同时,当开启了额外业务线程时,写回响应结果也会被封装成任务,交给I/O Worker线程来完成。

图2-3 Netty主从线程模型