NIO多路复用与Netty Reactor模式

2019-12-08  本文已影响0人  ssochi

NIO多路复用

所谓的NIO多路复用指,只创建一个线程通过轮询的方式来处理多个IO请求。

与BIO的区别

BIO收到一个网络连接请求便会建立一个线程或进程来处理,由于会创建很多个线程或进程,所以会浪费很多的内存,并且会让cpu花很多时间在上下文切换上。
而NIO只创建一个线程来处理IO请求,收到请求之后才将请求后便抛入线程池中进行下一步的处理。这样可见,NIO的线程个数有限,并使用了线程池技术,因此线程带来的内存开销和上下文切换的代价都很小

Netty Reactor模式

Reactor的中文意思的反应堆,在Netty当中可以理解为将IO请求转化为业务代码中可以直接处理的数据结构。举个例子,在日常业务中,我们通过netty来处理请求接受->有效性验证->编解码,最后到业务代码手中就是直接可读的数据结构。

而netty的Reactor的实现比上述描述稍微复杂一些。首先它使用了一个环状线程池workGroup,每一个workGroup中的线程会被分配给一个channel(这里的channel不同与NIO的channel,是Netty里的),而每个channel里持有一个selector。
同时Netty同时拥有两级Reactor,第一集负责建立连接,而第二级,处理这个连接带来的各个请求。我们主要讲第二级。
当第二级收到了一个请求,这个请求对于的channel里的selector就会通过轮询发现这个请求,继而进行处理。这样分多个线程来搭建Reactor的好处是能更快的接受协议,但坏处是线程数配置不当会导致cpu的无效空转。

上一篇 下一篇

猜你喜欢

热点阅读