Netty运用Reactor模式到极致

常见的reactor模式有以下三种

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