Netty运用Reactor模式到极致
常见的reactor模式有以下三种
单线程reactor
多线程reactor
主从reactor
0x01、单线程reactor
ractor 单线程模式是指所有的I/O操作都在一个NIO线程完成,该线程的职责:
1.作为NIO服务端,接收客户端TCP连接
2.作为NIO客户端,向客户端发送TCP连接
3.READ/WRITE 客户端的请求
不过单线程的reactor 模式无法发挥多核的优势,因此对于高并发量的系统仍然存在瓶颈,主要原因如下:
1、reactor 线程既要处理来自客户端的连接,又要处理READ/WRITE/编码/解码。即便cpu 100% 也难以满足实际场景的需求
多线程Reactor 解决了这些问题
0x02、多线程reactor模型
reactor 多线程的实现最大的区别是拥有一个专门用来处理实际I/O 操作是线程池
优点:
1、拥有一个Acceptor 专门用来监听请求的I/O 类型
2、使用专门线程池可以提高acceptor的并发量,并且可以将同一个SocketChannel 放于同一个I/O 线程处理,同一个I/O线程可以处理多个SocketChannel的READ/WRITE事件
在大部分场景,该线程模型都能处理,但存在这样一种场景:单个Acceptor 线程 可能会因为需要监听大量的 SocketChannel 连接 或 I/O事件处理或在建立建立时需要进行安全的握手认证、黑白名单过滤,而导致出现性能瓶颈。所以这种场景下,单独一个Accceptor 会导致性能不足,便出现了第三种线程模型,主从Reactor 模型
0x03、主从reactor 多线程模型
相比多线程reactor模型,主从reactor多线程模型拥有了一个独立处理 SocketChannel 连接的线程池,当客户端从Acceptor建立连接之后,便将该连接绑定到subreactor 线程池中的某个线程中,然后由该线程绑定客户端感兴趣的I/O事件(READ/WRITE),监听客户端连接请求,最后处理。
mainReactor : 监听 ServerSocketChannel 、建立与 SocketChannel 的连接、将完成建立连接之后的Socket 交给subReactor
subReactor : 监听SocketChannel的 I/O事件,完成编解码、相应的业务处理(默认为CPU个数)
Netty运用Reactor模式到极致,Netty支持以上三种Reactor线程模型。通过在启动辅助类中创建不同的EventLoopGroup实例并通过适当的参数配置,就可以支持。正是因为Netty 对Reactor线程模型的支持提供了灵活的定制能力,所以可以满足不同业务场景的性能诉求。
看了这本书,也不是很厚,如果想了解Netty的不妨看看。