Netty对Reactor支持

Netty对Reactor支持教程

我们在上一篇文章中了解到,Netty 是对 NIO 模型的支持。讲到 NIO 模型,那么我们就必须要了解一下 Reactor 模式。

Reactor详解

Reactor 设计模式是 event-drivenarchitecture 的一种实现方式,处理多个客户端并发的向服务端请求服务的场景。它主要有三种线程模型,单线程模型、多线程模型和主从多线程模型。它的核心流程如下:

注册感兴趣的事件 --> 扫描是否有感兴趣的事件发生 --> 事件发生后做出相应的处理。

单线程Reactor

06 单线程Reactor.png

单线程就是将 Acceptor 的处理和 Handler 的处理都在同一个线程中。一个请求对应一个 Handler。这边当请求量增加的时候 handler 也会增加,如果有一批 Handler 处理时间比较长,没有处理完成,那么就有可能导致新请求的连接请求不进来。

多线程Reactor

07 多线程Reactor.png

它与单线程相比,处理的 Handler 放在了一个线程池里面,每次请求数据的时候会从线程池里面获取,而不是单独开启一个线程。当客户端请求量增加的时候,如果 Handler 没有处理完,那么只能够等待,等待线程池中的线程释放。

主从线程Reactor

08 主从多线程Reactor.png

主从 Reactor 模型和多线程模型类型,只是在主从 Reactor 多线程模型的 Acceptor 线程池中获取线程,然后通过认证鉴权后进行派遣,再分配给 Reactor 线程池进行处理。

Netty对Reactor支持

上面我们讲到 Reactor 模式的核心流程:注册感兴趣的事件 --> 扫描是否有感兴趣的事件发生 --> 事件发生后做出相应的处理。在 Netty 中,对应的类监听事件如下:

client/Server SocketChannel/
ServerSocketChannel
OP_ACCEPT OP_CONNECT OP_WRITE OP_READ
client SocketChannel Y Y Y
server ServerSocketChannel Y
server SocketChannel Y Y

Netty使用Reactor模式

模式 使用代码
Reactor 单线程模式 EventLoopGroup eventGroup = new NioEventLoopGroup(1);
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(eventGroup);
Reactor 多线程模式 EventLoopGroup eventGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(eventGroup);
主从 Reactor 多线程模式 EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup,workerGroup);

从上面的代码中可以看到 Netty 对 Reactor 模式的支持切换的方便性。

Netty对Reactor支持总结

本章节我们了解到了三种 Reactor 模式,并且简单的介绍了 Netty 中对 Reactor 模式的支持方式。单线程模式是一个请求对应一个处理线程,多线程模式是一个请求然后利用线程池来处理。主从线程是将请求接收用一个线程处理,具体的处理逻辑用另外一个线程处理,各司其职,提升效率。