Java 面试宝典:请说下你对 Netty 中Reactor 模式的理解

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。
本文已收录到我的技术网站:https://skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经


回答

Reactor 模式是一种高效处理并发网络事件的设计模式,它通过一组 Reactor 线程(事件循环组)来监听和分发网络事件(如连接、读取、写入),并结合非阻塞 I/O 和用户定义的事件处理器来实现。

Reactor 模式的核心思想是把响应 IO 事件和业务处理进行分离。它通过一个或者多个线程监听 I/O 事件,将已经准备就绪的 I/O 事件分发给业务线程去处理。其核心组件有三个:

  • Reactor 组件:这是 Reactor 模式的核心。Reactor 组件负责监听和分发事件。在一个无限循环中,它等待 I/O 事件的到来,然后将这些就绪的 I/O 事件快速分发给相应的处理程序。在 Netty 中,这通常对应于 EventLoop 组件。
  • Acceptor 组件:请求连接器。Reactor 组件接收到 client 连接事件后,会将其转发给 Acceptor,Acceptor 则会接受 Client 的连接,建立对应的Handler,并向 Reactor注册此Handler。
  • Handler 组件:求处理器,负责具体事件的处理程序。当 Reactor 组件将事件分发给它们时,它们负责处理这些事件。在 Netty 中,这些处理器通常是用户自定义的 ChannelHandler,用于处理特定的事件,如接收数据、异常处理等。

在 Reactor 模式中,主要有三种模型:

  • 单 Reactor 单线程模型。
  • 多线程 Reactor 模型。
  • 主从多 Reactor 多线程模型。

详解

单 Reactor 单线程模型

单线程 Reactor 模型,即所有的 I/O 处理和业务逻辑都在同一个线程(即 Reactor 线程)中执行。

处理流程如下

  • Reactor 通过 Select 监听 I/O 事件,收到事件后由 Dispatch 来分发。
  • 如果是建立连接事件,则由 Acceptor 进行处理,Acceptor 会通过 accept 方法获取链接,并创建一个 Handler 对象来处理后续的响应事件。
  • 如果不是建立连接事件,则将该事件交由当前连接的 Handler 来处理。Handler 按照 read —> 业务处理 —> send 的流程来完成整个事件。

优点

该模型是将所有处理逻辑放在一个线程中实现,模型简单,没有多线程、进程通信、竞争的问题

缺点

由于只有一个线程,无法充分利用多核CPU 的性能,性能堪忧。同时Handler 在处理某个连接上的业务时,整个进程无法处理其他连接事件,很容易导致性能瓶颈。

还有一个比较严重的可靠性问题,如果线程意外终止,或者进入死循环,则会导致整个线程都无法接受和处理事件了,造成节点故障。

单 Reactor 多线程

单线程存在性能瓶颈,那我们就引入多线程方案。

多线程 Reactor 模型,它将处理 I/O 就绪时间的线程和处理业务逻辑 Handler的线程分开了,每个 Handler 由一个独立的线程来处理。

Reactor 接受请求后,根据请求类型来进行分发,分发逻辑与单Reactor单线程模型一样,不同之处在于单 Reactor 多线程 的 Handler 不再进行业务处理了,它只负责接受和发送:Handler接受数据后,会将数据发送给 Worker 线程池中的线程处理,该线程才是处理业务的真正线程,线程将业务处理完成后,将数据发送给 Handler,由 Handler 再 send 出去。

优点

由于 Handler 使用了多线程模式,则可以利用充分利用CPU的性能。

缺点

Handler使用多线程模式,则会涉及到数据共享的问题,需要考虑互斥,实现肯定比单Reactor单线程模式复杂一些。但是在实际开发过程中,我们一般都会让业务处理是无状态的,一般不会用共享变量,所以在大多数业务场景中 Handler 的开发并不会复杂太多。

单Reactor,一个线程处理事件监听、分发、响应,对于高并发场景,容易造成性能瓶颈。

多 Reactor 多线程模型

单Reactor多线程模式虽然解决了 Handler 单线程的性能问题,但是 Reactor 还是单线程的,对于高并发场景还是会有性能瓶颈,所以需要对 Reactor 也调整为多线程模式

  • 主线程中的 MainReactor 对象通过 select 监听事件,接收到事件后通过 Dispatch 进行分发,如果事件类型为建立连接则将事件分发给 Acceptor 进行连接建立
  • 如果收到的事件不是连接,则他将事件分发个某个 SubReactor,SubrReactor 将连接加入到连接队列进行监听,并创建 Handler 进行各种事件处理
  • 如果有新的事件发生,SubReactor 则会调用当前连接的 Handler 来进行处理。Handler 通过 read 读取数据后,将数据发送给 Worker 线程进行处理,Worker 线程池则会分配线程进行业务处理,处理完成后返回结果,Handler 接受结果后,通过 send 发送给客户端

优点

该模式主线程和子线程分工明确,主线程只负责接收新连接,子线程负责完成后续的业务处理,同时主线程和子线程的交互也很简单,子线程接收主线程的连接后,只管业务处理即可,无须关注主线程

缺点

模型复杂。

这种模式适用于高并发场景,广泛运用于各种项目中,如大名鼎鼎的Netty。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/506035.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQLite3进行数据库各项常用操作

目录 前言1、SQLite介绍2、通过SQLite创建一个数据库文件3、往数据库文件中插入数据4、数据库文件信息查询5、修改数据库中的内容6、删除数据库中的内容 前言 本文是通过轻量化数据库管理工具SQLite进行的基础操作和一些功能实现。 1、SQLite介绍 SQLite是一个广泛使用的嵌入…

GEE土地分类——基于遥感影像数据的不同作物的分类

简介 这里我们首先要更改原始代码的中的影像和研究区矢量的问题,这个为了防止我们计算的过程超限,建议先将我们的研究区影像和样本点先存在自己的assets中,然后导入到新的脚本中。然周本文就是对其进行影像进行归一化处理,然后进行样本点值提取至点,然后训练样本点,进行…

系统架构体系

一、单体架构 1.浏览器,DNS服务器(解析域名,转换为IP地址),一台计算机就相当于一个服务器(用端口号进行区分Tomcat(web服务),数据库服务) 2.本次架构解决…

3D转换1111

1.三维坐标系 1.3D位移: translate3d(x,y,z)  translform:translateX(100px):仅仅是在x轴上移动  translform:translateY(100px):仅仅是在Y轴上移动  translform:translateZ(100px):仅仅是在Z轴上移动(注意&#xff1…

HTTP/1.1 如何优化?(计算机网络)

有三种方法: 第一个思路是,通过缓存技术来避免发送 HTTP 请求。客户端收到第一个请求的响应后,可以将其缓存在本地磁盘,下次请求的时候,如果缓存没过期,就直接读取本地缓存的响应数据。如果缓存过期&#…

Uibot6.0 (RPA财务机器人师资培训第6天 )发票验真机器人案例实战

类似于小北的这篇博客:Uibot (RPA设计软件)Mage AI智能识别(发票识别)———课前材料五_uibot 添加mageai-CSDN博客https://blog.csdn.net/Zhiyilang/article/details/135591297?spm1001.2014.3001.5501训练网站:泓江…

122、内网安全——域信息收集应用网络凭据CS插件AdfindBloodHound

文章目录 理解域域信息搜集 理解域 假设有1000台计算机,运维人员需要为每一台计算机进行软件的安装、环境部署,实际上运维人员不可能亲自对每一台计算机进行软件的安装和环境部署。实际,将所有1000台计算机放入一个域中,域内有一…

简单爬虫,爬取某东某商品评论前十页

商品链接地址:【博世四坑5系 6x100x160】博世(BOSCH)四坑5系(1支装)圆柄两坑两槽混凝土钻头 6x100x160mm【行情 报价 价格 评测】-京东 首先抓包,用搜索框搜索评论,看评论在哪个包中 为了好看筛…

Python - 深度学习系列31 - ollama的搭建与使用

说明 做这个的主要目的是为了搭建Langchain的本地环境,使用LangChain让LLM具备调用自定义函数的功能。 内容 1 安装server 以下将ollama的安装方式,以及使用做一个简单的说明(记录)。之前对这个工具没有了解,只是从快速实践的…

【python】pip清华大学镜像

1、修改pip源为清华源: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple2、结果是自动给我创建了一个文件: 3、打开这个文件所在的文件夹: 4、打开文件: 5、如果不想指定清华的,就删掉…

微信小程序引导组件【添加到我的小程序】

微信小程序引导组件,点击按钮,弹窗引导用户【添加到我的小程序】 源代码 https://ext.dcloud.net.cn/plugin?id17303

算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)

算法学习——LeetCode力扣图论篇3 127. 单词接龙 127. 单词接龙 - 力扣(LeetCode) 描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk: 每一对相…

动态内存管理-错题合集讲解

空指针的解应用操作(错误信息合集) 越界访问 首先我们上一个代码,看看这个的代码的问题 这个代码的问题显而易见 ,就是在循环里面,产生了越界访问的问题,这里你开辟了10个整形空间,但是从0-1…

爬虫的验证码处理

1.我们先进入chrome浏览器的审查页面找到input方法: 为了不少找到一个input,我们ctrlf的方法输入input来查找 看见我们有6个需要输入的参数。 除了上面几个的input参数,我们还需要获取验证码的图片,后续要将字母填入进去。 二.安…

XDMA windos 编译

1、先安装 Visual Studio 2019 2、Download the Windows Driver Kit (WDK) - Windows drivers | Microsoft Learn 以前的 WDK 版本和其他下载 - Windows 驱动程序 |Microsoft学习 注意版本:下载2004的版本 3、 选择使用10.0.19041.0 安装这个sdk. 先按vs2019 然后…

后端SpringBoot+Mybatis 查询订单数据库奇怪报错加一

排错过程: 看报错意思是SQL语句存在错误,然后使用图形化工具运行这个SQL语句 其实这里稍微细心想一下就能发现问题,但是当时没深入想,就觉得order表前加了数据库名字影响不大,所以感觉SQL语句是没问题的,然…

HarmonyOS实战开发-一次开发,多端部署-视频应用

介绍 随着智能设备类型的不断丰富,用户可以在不同的设备上享受同样的服务,但由于设备形态不尽相同,开发者往往需要针对具体设备修改或重构代码,以实现功能完整性和界面美观性的统一。OpenHarmony为开发者提供了“一次开发&#x…

【Java与数学】若不等式x^2-a*x+a<0的解集中恰有3个整数,求a的范围?

【分析】 既然不等式存在解集,说明一元二次方程x^2-a*xa0有解; 解之间横跨三个整数,说明Δ大于0; 三个整数必然是连续的,因为f(x)x^2-a*xa最多只与x存在两个交点,这是题设里的隐含条件。 【传统解法】 …

2024 3.23~3.29周报

上周工作 SVInvNet论文研读 本周计划 加入DenseNet,修改网络架构,跑代码 总结 DenseNet 密集块:DenseNet将网络分成多个密集块(Dense Block)。在每个密集块内,每一层都连接到前面所有的层。这种跳跃连接有助于解…

Mac m1 Flink的HelloWorld

首先在官方下载Downloads | Apache Flink 下载好压缩包后解压,得到Flink文件夹 进入:cd flink-1.19.0 ls 查看里面的文件: 执行启动集群 ./bin/start-cluster.sh 输出显示它已经成功地启动了集群,并且正在启动 standalonesessio…