ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

简单深入理解高性能网络编程(Netty)中的Reactor模型(图文+代码)

2021-10-31 22:31:54  阅读:165  来源: 互联网

标签:Netty Reactor 事件 客户端 多线程 连接 服务端 图文


文章目录

定义

Reactor模型就是网络服务器用来处理高并发网络IO请求的一种编程模型。

传统网络交互方式

一般我们网络交互都是基于客户端服务端模式,然后就会有如下事件

  1. 当一个客户端和服务器要进行交互时,首先客户端会向服务端发送连接请求,和服务端建立连接。这就对应服务的的连接事件
  2. 无论客户端给服务端发送读或写请求,服务端都需要从客户端读取请求内容,所以这里读取客户端的请求内容就对应服务端的读事件
  3. 当连接建立完后,客户端会给服务器发送读请求,读取数据。服务端在处理读请求的时候后,需要向客户端返回(写)数据,这就对应了服务端的写事件

所以一般的网络请求就包含如上三种事件:连接事件、写事件、读事件

Reactor 模型组成

Reactor 模型中一般有三种角色。这三种角色分别与上面网络请求中的三种事件,即

  • Reactor -> 监听和分配事件
  • acceptor -> 连接事件
  • handler -> 读、写事件

本来看似 只需要acceptorhandler这两种角色就可以对应三毛的三种事件,为什么会多出来了Reactor这个角色呢。因为在高并发场景中,连接事件、读写事件会同时发生,所以我们需要一个角色专门去监听和分配事件,这个职责就落到了reactor头上来了。下面图片就三者的关系

image-20211030141510613

在理解了Reactor模型后,我们再来聊聊Netty中Reactor模型的实现

Netty中Reactor模型的实现

Reactor 单线程模式

		EventLoopGroup eventLoopGroup = new NioEventLoopGroup(1);
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        serverBootstrap.group(eventLoopGroup);

image-20211031221810137

可以看到从连接的建立,并创建handler来处理后续的各种业务时间,都是一个线程执行所有事情

缺点很明显:

  1. 在请求过多时,会无法支撑。因为只有一个线程,无法发挥多核CPU性能
  2. 一旦某个Handler发生阻塞,服务端就完全无法处理其他连接事件

非主从Reactor模式(单Reactor多线程模型)

		EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        serverBootstrap.group(eventLoopGroup);

image-20211031222101217

这里与上面的Reactor 单线程模式相比,我们没有设置NioEventLoopGroup的线程数,如果跟源码会发现如果没有设置线程数默认是CPu核数的2倍的线程数

优点:

​ 1. 使用了多线程去处理业务和连接,不会因为某个业务处理阻塞导致服务端无法处理请求

缺点:

1. 连接事件和业务处理没有分开,不够解耦
2. 可能因为业务的处理效率影响连接的处理

主从Reactor多线程模式

		EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        serverBootstrap.group(bossGroup, workerGroup);

image-20211031222125553

主从Reactor多线程模式中我们使用了两个NioEventLoopGroup线程池,将连接和业务处理分开了,用了一个专门的线程池去处理连接请求。这也就对应多Reactor多线程模型,也是目前最主流的使用方式

标签:Netty,Reactor,事件,客户端,多线程,连接,服务端,图文
来源: https://blog.csdn.net/qq_42651904/article/details/121071306

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有