简单深入理解高性能网络编程(Netty)中的Reactor模型(图文+代码)
2021/10/31 22:39:43
本文主要是介绍简单深入理解高性能网络编程(Netty)中的Reactor模型(图文+代码),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 定义
- 传统网络交互方式
- Reactor 模型组成
- Netty中`Reactor`模型的实现
- Reactor 单线程模式
- 非主从Reactor模式(单Reactor多线程模型)
- 主从Reactor多线程模式
定义
Reactor模型就是网络服务器用来处理高并发网络IO请求的一种编程模型。
传统网络交互方式
一般我们网络交互都是基于客户端服务端模式,然后就会有如下事件
- 当一个客户端和服务器要进行交互时,首先客户端会向服务端发送连接请求,和服务端建立连接。这就对应服务的的连接事件
- 无论客户端给服务端发送读或写请求,服务端都需要从客户端读取请求内容,所以这里读取客户端的请求内容就对应服务端的读事件
- 当连接建立完后,客户端会给服务器发送读请求,读取数据。服务端在处理读请求的时候后,需要向客户端返回(写)数据,这就对应了服务端的写事件
所以一般的网络请求就包含如上三种事件:连接事件、写事件、读事件
Reactor 模型组成
Reactor 模型中一般有三种角色。这三种角色分别与上面网络请求中的三种事件,即
- Reactor -> 监听和分配事件
- acceptor -> 连接事件
- handler -> 读、写事件
本来看似 只需要acceptor
、handler
这两种角色就可以对应三毛的三种事件,为什么会多出来了Reactor
这个角色呢。因为在高并发场景中,连接事件、读写事件会同时发生,所以我们需要一个角色专门去监听和分配事件,这个职责就落到了reactor
头上来了。下面图片就三者的关系
在理解了Reactor
模型后,我们再来聊聊Netty中Reactor
模型的实现
Netty中Reactor
模型的实现
Reactor 单线程模式
EventLoopGroup eventLoopGroup = new NioEventLoopGroup(1); ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(eventLoopGroup);
可以看到从连接的建立,并创建handler来处理后续的各种业务时间,都是一个线程执行所有事情
缺点很明显:
- 在请求过多时,会无法支撑。因为只有一个线程,无法发挥多核CPU性能
- 一旦某个Handler发生阻塞,服务端就完全无法处理其他连接事件
非主从Reactor模式(单Reactor多线程模型)
EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(eventLoopGroup);
这里与上面的Reactor 单线程模式相比,我们没有设置NioEventLoopGroup
的线程数,如果跟源码会发现如果没有设置线程数默认是CPu核数的2倍的线程数
优点:
1. 使用了多线程去处理业务和连接,不会因为某个业务处理阻塞导致服务端无法处理请求
缺点:
1. 连接事件和业务处理没有分开,不够解耦 2. 可能因为业务的处理效率影响连接的处理
主从Reactor多线程模式
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup);
主从Reactor多线程模式中我们使用了两个NioEventLoopGroup
线程池,将连接和业务处理分开了,用了一个专门的线程池去处理连接请求。这也就对应多Reactor多线程模型,也是目前最主流的使用方式
这篇关于简单深入理解高性能网络编程(Netty)中的Reactor模型(图文+代码)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-23【JS逆向百例】爱疯官网登录逆向分析
- 2024-12-21Vue3教程:新手入门到实践应用
- 2024-12-21VueRouter4教程:从入门到实践
- 2024-12-20Vue3项目实战:从入门到上手
- 2024-12-20Vue3项目实战:新手入门教程
- 2024-12-20VueRouter4项目实战:新手入门教程
- 2024-12-20如何实现JDBC和jsp的关系?-icode9专业技术文章分享
- 2024-12-20Vue项目中实现TagsView标签栏导航的简单教程
- 2024-12-20Vue3入门教程:从零开始搭建你的第一个Vue3项目
- 2024-12-20从零开始学习vueRouter4:基础教程