ActiveMQ消息中间件面试专题

1.什么是 ActiveMQ?
activeMQ 是一种开源的,实现了 JMS1.1 规范的,面向消息(MOM)的中间件,为应用程序提供高效的、
可扩展的、稳定的和安全的企业级消息通信
2. ActiveMQ 服务器宕机怎么办?
这得从 ActiveMQ 的储存机制说起。在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存
储在文件中的,它们的最大限制在配置文件的<systemUsage>节点中配置。但是,在非持久化消息堆积
到一定程度,内存告急的时候,ActiveMQ 会将内存中的非持久化消息写入临时文件中,以腾出内存。虽
然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时
文件会直接删除。
那如果文件增大到达了配置中的最大限制的时候会发生什么?我做了以下实验:
设置 2G 左右的持久化文件限制,大量生产持久化消息直到文件达到最大限制,此时生产者阻塞,但消费
者可正常连接并消费消息,等消息消费掉一部分,文件删除又腾出空间之后,生产者又可继续发送消息,
服务自动恢复正常。
设置 2G 左右的临时文件限制,大量生产非持久化消息并写入临时文件,在达到最大限制时,生产者阻塞,
消费者可正常连接但不能消费消息,或者原本慢速消费的消费者,消费突然停止。整个系统可连接,但是
无法提供服务,就这样挂了。
具体原因不详,解决方案:尽量不要用非持久化消息,非要用的话,将临时文件限制尽可能的调大。
3. 丢消息怎么办?
这得从 java 的 java.net.SocketException 异常说起。简单点说就是当网络发送方发送一堆数据,然后调
用 close 关闭连接之后。这些发送的数据都在接收者的缓存里,接收者如果调用 read 方法仍旧能从缓存中
读取这些数据,尽管对方已经关闭了连接。但是当接收者尝试发送数据时,由于此时连接已关闭,所以会
发生异常,这个很好理解。不过需要注意的是,当发生 SocketException 后,原本缓存区中数据也作废了,
此时接收者再次调用 read 方法去读取缓存中的数据,就会报 Software caused connection abort: recv
failed 错误。
通过抓包得知,ActiveMQ 会每隔 10 秒发送一个心跳包,这个心跳包是服务器发送给客户端的,用来判
断客户端死没死。如果你看过上面第一条,就会知道非持久化消息堆积到一定程度会写到文件里,这个写
的过程会阻塞所有动作,而且会持续 20 到 30 秒,并且随着内存的增大而增大。当客户端发完消息调用
connection.close()时,会期待服务器对于关闭连接的回答,如果超过 15 秒没回答就直接调用 socket 层
的 close 关闭 tcp 连接了。这时客户端发出的消息其实还在服务器的缓存里等待处理,不过由于服务器心
跳包的设置,导致发生了 java.net.SocketException 异常,把缓存里的数据作废了,没处理的消息全部丢
失。
解决方案:用持久化消息,或者非持久化消息及时处理不要堆积,或者启动事务,启动事务后,commit()
方法会负责任的等待服务器的返回,也就不会关闭连接导致消息丢失了。 4. 持久化消息非常慢。
默认的情况下,非持久化的消息是异步发送的,持久化的消息是同步发送的,遇到慢一点的硬盘,发送消
息的速度是无法忍受的。但是在开启事务的情况下,消息都是异步发送的,效率会有 2 个数量级的提升。
所以在发送持久化消息时,请务必开启事务模式。其实发送非持久化消息时也建议开启事务,因为根本不
会影响性能。
5. 消息的不均匀消费。
有时在发送一些消息之后,开启 2 个消费者去处理消息。会发现一个消费者处理了所有的消息,另一个消
费者根本没收到消息。原因在于 ActiveMQ 的 prefetch 机制。当消费者去获取消息时,不会一条一条去
获取,而是一次性获取一批,默认是 1000 条。这些预获取的消息,在还没确认消费之前,在管理控制台
还是可以看见这些消息的,但是不会再分配给其他消费者,此时这些消息的状态应该算作“已分配未消费”,
如果消息最后被消费,则会在服务器端被删除,如果消费者崩溃,则这些消息会被重新分配给新的消费者。
但是如果消费者既不消费确认,又不崩溃,那这些消息就永远躺在消费者的缓存区里无法处理。更通常的
情况是,消费这些消息非常耗时,你开了 10 个消费者去处理,结果发现只有一台机器吭哧吭哧处理,另
外 9 台啥事不干。
解决方案:将 prefetch 设为 1,每次处理 1 条消息,处理完再去取,这样也慢不了多少。
6. 死信队列。
如果你想在消息处理失败后,不被服务器删除,还能被其他消费者处理或重试,可以关闭
AUTO_ACKNOWLEDGE,将 ack 交由程序自己处理。那如果使用了 AUTO_ACKNOWLEDGE,消息是什
么时候被确认的,还有没有阻止消息确认的方法?有!
消费消息有 2 种方法,一种是调用 consumer.receive()方法,该方法将阻塞直到获得并返回一条消息。这
种情况下,消息返回给方法调用者之后就自动被确认了。另一种方法是采用 listener 回调函数,在有消息
到达时,会调用 listener 接口的 onMessage 方法。在这种情况下,在 onMessage 方法执行完毕后,消
息才会被确认,此时只要在方法中抛出异常,该消息就不会被确认。那么问题来了,如果一条消息不能被
处理,会被退回服务器重新分配,如果只有一个消费者,该消息又会重新被获取,重新抛异常。就算有多
个消费者,往往在一个服务器上不能处理的消息,在另外的服务器上依然不能被处理。难道就这么退回--
获取--报错死循环了吗? 在重试 6 次后,ActiveMQ 认为这条消息是“有毒”的,将会把消息丢到死信队列里。如果你的消息不见
了,去 ActiveMQ.DLQ 里找找,说不定就躺在那里。
7. ActiveMQ 中的消息重发时间间隔和重发次数吗?
ActiveMQ:是 Apache 出品,最流行的,能力强劲的开源消息总线。是一个完全支持 JMS1.1 和 J2EE 1.4
规范的 JMS Provider 实现。JMS(Java 消息服务):是一个 Java 平台中关于面向消息中间件(MOM)
的 API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
首先,我们得大概了解下,在哪些情况下,ActiveMQ 服务器会将消息重发给消费者,这里为简单起见,
假定采用的消息发送模式为队列(即消息发送者和消息接收者)。
① 如果消息接收者在处理完一条消息的处理过程后没有对 MOM 进行应答,则该消息将由 MOM 重发.
② 如果我们队某个队列设置了预读参数(consumer.prefetchSize),如果消息接收者在处理第一条消息
时(没向 MOM 发送消息接收确认)就宕机了,则预读数量的所有消息都将被重发!
③ 如果 Session 是事务的,则只要消息接收者有一条消息没有确认,或发送消息期间 MOM 或客户端某
一方突然宕机了,则该事务范围中的所有消息 MOM 都将重发。
④ 说到这里,大家可能会有疑问,ActiveMQ 消息服务器怎么知道消费者客户端到底是消息正在处理中还
没来得急对消息进行应答还是已经处理完成了没有应答或是宕机了根本没机会应答呢?其实在所有的客户
端机器上,内存中都运行着一套客户端的 ActiveMQ 环境,该环境负责缓存发来的消息,负责维持着和
ActiveMQ 服务器的消息通讯,负责失效转移(fail-over)等,所有的判断和处理都是由这套客户端环境
来完成的。
我们可以来对 ActiveMQ 的重发策略(Redelivery Policy)来进行自定义配置,其中的配置参数主要有以
下几个:
可用的属性
属性 默认值 说明
l collisionAvoidanceFactor 默认值 0.15 , 设置防止冲突范围的正负百分比,只有启用
useCollisionAvoidance 参数时才生效。
l maximumRedeliveries 默认值 6 , 最大重传次数,达到最大重连次数后抛出异常。为-1 时不限制次
数,为 0 时表示不进行重传。
l maximumRedeliveryDelay 默认值-1, 最大传送延迟,只在 useExponentialBackOff 为 true 时有效
(V5.5),假设首次重连间隔为 10ms,倍数为 2,那么第二次重连时间间隔为 20ms,第三次重连时间
间隔为 40ms,当重连时间间隔大的最大重连时间间隔时,以后每次重连时间间隔都为最大重连时间间隔。
l initialRedeliveryDelay 默认值 1000L, 初始重发延迟时间
l redeliveryDelay 默认值 1000L, 重发延迟时间,当 initialRedeliveryDelay=0 时生效(v5.4)
l useCollisionAvoidance 默认值 false, 启用防止冲突功能,因为消息接收时是可以使用多线程并发处
理的,应该是为了重发的安全性,避开所有并发线程都在同一个时间点进行消息接收处理。所有线程在同 一个时间点处理时会发生什么问题呢?应该没有问题,只是为了平衡 broker 处理性能,不会有时很忙,
有时很空闲。
l useExponentialBackOff 默认值 false, 启用指数倍数递增的方式增加延迟时间。
l backOffMultiplier 默认值 5, 重连时间间隔递增倍数,只有值大于 1 和启用 useExponentialBackOff
参数时才生效。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么快速围绕“人、货、场”做零售数据分析?

做零售数据分析多了&#xff0c;不难发现零售数据分析的关键就是“人、货、场”&#xff0c;那么怎么又快又灵活地分析这三个关键点&#xff1f;不妨参考下奥威BI零售数据分析方案。 奥威BI零售数据分析方案是一套吸取大量项目经验&#xff0c;结合零售企业数据分析共性需求打…

【Java8新特性】四、强大的Stream api

​ 这里写自定义目录标题 一、了解Stream二、流(stream)到底是什么&#xff1f;三、Stream操作的三个步骤四、创建Stream的四种方式五、Stream 的中间操作1、筛选和切片2、map 映射3、排序 六、Stream 的终止操作1、查找和匹配2、归约3、收集 一、了解Stream Stream是Java8中…

同旺科技 USB TO SPI / I2C 专业版 极限测试 ---- 读取数据

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 备注&#xff1a;带EXCEL调试的只适用于专业版&#xff1b; 软件配置&#xff1a; 设置如下&#xff0c;读取65500个字节&#xff0c;单条指令&#xff0c;速率20Mhz; 数据&#xff1a; 时钟信号&#…

Day10:学习尚上优选项目

学习计划&#xff1a;完成尚硅谷的尚上优选项目 学习进度&#xff1a;尚上优选项目 知识点&#xff1a; 五、尚上优选微信小程序端 订单支付 需求分析 页面效果功能分析对应接口 开发接口 创建service-payment模块 创建子模块service-payment创建配置文件创建启动类引入依赖…

微信扫码授权登录成功后,重定向用户回到他们最初尝试访问的URL

你的需求是在微信扫码授权登录成功后&#xff0c;重定向用户回到他们最初尝试访问的URL&#xff0c;而不是重定向到一个固定的页面。为了实现这一点&#xff0c;你需要在用户登录前&#xff0c;将他们尝试访问的页面URL保存起来&#xff0c;然后在登录成功后&#xff0c;使用这…

了解 Python 中 gc.collect() 命令

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在 Python 中&#xff0c;gc.collect() 命令是用于手动触发垃圾回收机制&#xff0c;以回收无法访问的对象所占用的内存。Python 的垃圾回收机制主要基于引用计数&#xff0c;辅以 “标记-清除” 和 “…

echarts坐标轴、轴线、刻度、刻度标签

坐标轴 x、y轴 x 轴和 y 轴都由轴线、刻度、刻度标签、轴标题四个部分组成。部分图表中还会有网格线来帮助查看和计算数据 普通的二维数据坐标系都有x轴和y轴&#xff0c;通常情况下&#xff0c;x轴显示在图表底部&#xff0c;y轴显示在左侧&#xff0c;一般配置如下&#xf…

【数据结构】树与森林(树的存储结构、森林与二叉树的转化、树与森林的遍历)

目录 树和森林树的存储结构一、树的双亲表示法&#xff1a;二、树的孩子表示法方法一&#xff1a;定长结点的多重链表方法二&#xff1a;不定长结点的多重链表方法三&#xff1a;孩子单链表表示法 三、树的二叉链表(孩子-兄弟)存储表示法 森林与二叉树的转换树和森林的遍历先根…

QT使用单例模式创建全局引用类

单例模式介绍 单例模式是一种设计模式,用于确保类只能创建一个实例,并提供一种全局访问该实例的方式。在单例模式中,类的构造函数被私有化,这样就不能通过常规方式创建对象实例。相反,类提供一个静态方法或静态变量来获取其唯一的实例。 单例模式通常用于管理全局状态或…

设计一个健壮的漏洞检测模块需要考虑多个方面

设计一个健壮的漏洞检测模块需要考虑多个方面&#xff0c;包括漏洞数据库、扫描策略、结果解析和报告生成等。以下是一个简化的设计概述和一些模拟数据及测试示例。 漏洞检测模块设计 漏洞数据库&#xff1a; 包含一个已知的漏洞列表&#xff0c;每个漏洞都有唯一的标识符、描…

MPP-媒体软件V5.0开发参考

0. 写在前面 本篇博文用于记录工作项目中遇到的ss928板端视频获取相关内容。、 1. API参考 系统控制实现MPP(Media Process Platform)系统初始化、系统绑定解绑、获取MPP版本号、视频缓存池初始化、创建视频缓存池等功能。 ●ss_mpi_sys_set_cfg:配置系统控制参数。 ●ss_mp…

uni-app实现分页--(1)准备工作,首页下拉触底加载更多

实现流程如下: 分析&#xff1a;需要在滚动容器中添加滚动触底&#xff0c;在猜你喜欢中获取数据。难点&#xff1a;如何在父页面调用子组件内的方法。父组件中用ref&#xff0c;并定义组件实例类型&#xff0c;子组件中暴露方法 具体代码如下&#xff1a; 1.在父组件中添加…

sqlplus / as sysdba下中文乱码问题

export NLS_LANGamerican_america.AL32UTF8 export LANGen_US.UTF-8 set NLS_LANGamerican_america.AL32UTF8 set LANGen_US.UTF-8 select userenv(language) from dual;可以查出数据库的字符集 select * from nls_database_parameters where parameter LIKE %CHARACTERSET%…

计算机专业考研考哪些专业课

https://zhuanlan.zhihu.com/p/182416996 计算机专业考研的专业课通常包括以下几个主要科目&#xff0c;但具体的考试科目和内容可能会根据不同的学校和专业方向有所差异&#xff1a; 数据结构&#xff1a; 这是计算机科学的基础课程之一&#xff0c;涉及算法和数据结构的设计、…

计算机视觉——基于深度学习UNet实现的复杂背景文档二值化算法实现与模型训练

1. 引言 阈值分割可以被视为一个分类问题&#xff0c;通常涉及两个类别&#xff0c;这也是为什么阈值分割也被称为二值化。对于文档图像&#xff0c;我们期望阈值算法能够正确地将墨水分类为黑色&#xff0c;将纸张分类为白色&#xff0c;从而得到二值化图像。对于数字灰度图像…

OpenCV | 基于视频的基础操作

目录 一. OpenCV 关于视频的基础操作1. cv.VideoCapture ( ) 读取摄像头 / 视频文件2. cv.VideoCapture ( ).set ( ) 设置视频属性3. cv.VideoCapture ( ).get ( ) 打印视频属性4. cv.VideoCapture ( ).read ( ) 读帧5. capture.release ( ) 释放资源6. cv.VideoWriter ( ) 视频…

ruoyi-nbcio-plus基于vue3的flowable的自定义业务撤回申请组件的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

《前端面试题》- JS基础 - 简单谈谈ES6新增了哪些内容

问题 简单谈谈ES6新增了哪些内容 回答 ES新增的对象有&#xff1a; Symbol、Set、Map、WeakSet和WeakMap、ArrayBuffer、TypedArray、DataView、Promise、GeneratorFunction 和 Generator、Reflect、Proxy 具体可参考&#xff1a;https://www.jianshu.com/p/b54f7ad1cae3ht…

想做产品经理,应该选择什么专业?

产品经理作为互联网公司的核心职位&#xff0c;一直以来备受关注。随着互联网的不断发展&#xff0c;产品经理的需求也越来越高&#xff0c;很多人都想要了解哪些专业适合做产品经理。本文将为大家介绍几个适合做产品经理的专业。 1、心理学相关专业 C端产品工作的本源&#x…

【产品】ANET智能通信管理机 物联网网关 电力监控/能耗监测/能源管理系统

产品概述 本系列智能通信管理机是一款采用嵌入式硬件计算机平台&#xff0c;具有多个下行通信接口及一个或者多个上行网络接口&#xff0c;用于将一个目标区域内所有的智能监控/保护装置的通信数据整理汇总后&#xff0c;实时上传主站系统&#xff0c;完成遥信、遥测等能源数据…