面试之ActiveMQ?

java分布式面试题之消息队列ActiveMQ部分 面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等” 阅读详情

1.先讲严重的:服务挂掉。

这得从ActiveMQ的储存机制说起。在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的,它们的最大限制在配置文件的<systemUsage>节点中配置。但是,在非持久化消息堆积到一定程度,内存告急的时候,ActiveMQ会将内存中的非持久化消息写入临时文件中,以腾出内存。虽然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时文件会直接删除。

那如果文件增大到达了配置中的最大限制的时候会发生什么?我做了以下实验:

设置2G左右的持久化文件限制,大量生产持久化消息直到文件达到最大限制,此时生产者阻塞,但消费者可正常连接并消费消息,等消息消费掉一部分,文件删除又腾出空间之后,生产者又可继续发送消息,服务自动恢复正常。

设置2G左右的临时文件限制,大量生产非持久化消息并写入临时文件,在达到最大限制时,生产者阻塞,消费者可正常连接但不能消费消息,或者原本慢速消费的消费者,消费突然停止。整个系统可连接,但是无法提供服务,就这样挂了。

具体原因不详,解决方案:尽量不要用非持久化消息,非要用的话,将临时文件限制尽可能的调大。

详细配置信息见文档:http://activemq.apache.org/producer-flow-control.html

 

2.丢消息。

这得从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()方法会负责任的等待服务器的返回,也就不会关闭连接导致消息丢失了。

关于java.net.SocketException请看我的详细研究:http://blog.163.com/_kid/blog/static/3040547620160231534692/

 

3.持久化消息非常慢。

默认的情况下,非持久化的消息是异步发送的,持久化的消息是同步发送的,遇到慢一点的硬盘,发送消息的速度是无法忍受的。但是在开启事务的情况下,消息都是异步发送的,效率会有2个数量级的提升。所以在发送持久化消息时,请务必开启事务模式。其实发送非持久化消息时也建议开启事务,因为根本不会影响性能。

 

4.消息的不均匀消费。

有时在发送一些消息之后,开启2个消费者去处理消息。会发现一个消费者处理了所有的消息,另一个消费者根本没收到消息。原因在于ActiveMQ的prefetch机制。当消费者去获取消息时,不会一条一条去获取,而是一次性获取一批,默认是1000条。这些预获取的消息,在还没确认消费之前,在管理控制台还是可以看见这些消息的,但是不会再分配给其他消费者,此时这些消息的状态应该算作“已分配未消费”,如果消息最后被消费,则会在服务器端被删除,如果消费者崩溃,则这些消息会被重新分配给新的消费者。但是如果消费者既不消费确认,又不崩溃,那这些消息就永远躺在消费者的缓存区里无法处理。更通常的情况是,消费这些消息非常耗时,你开了10个消费者去处理,结果发现只有一台机器吭哧吭哧处理,另外9台啥事不干。

解决方案:将prefetch设为1,每次处理1条消息,处理完再去取,这样也慢不了多少。

详细文档:http://activemq.apache.org/what-is-the-prefetch-limit-for.html

 

5.死信队列。

如果你想在消息处理失败后,不被服务器删除,还能被其他消费者处理或重试,可以关闭AUTO_ACKNOWLEDGE,将ack交由程序自己处理。那如果使用了AUTO_ACKNOWLEDGE,消息是什么时候被确认的,还有没有阻止消息确认的方法?有!

消费消息有2种方法,一种是调用consumer.receive()方法,该方法将阻塞直到获得并返回一条消息。这种情况下,消息返回给方法调用者之后就自动被确认了。另一种方法是采用listener回调函数,在有消息到达时,会调用listener接口的onMessage方法。在这种情况下,在onMessage方法执行完毕后,消息才会被确认,此时只要在方法中抛出异常,该消息就不会被确认。那么问题来了,如果一条消息不能被处理,会被退回服务器重新分配,如果只有一个消费者,该消息又会重新被获取,重新抛异常。就算有多个消费者,往往在一个服务器上不能处理的消息,在另外的服务器上依然不能被处理。难道就这么退回--获取--报错死循环了吗?

在重试6次后,ActiveMQ认为这条消息是“有毒”的,将会把消息丢到死信队列里。如果你的消息不见了,去ActiveMQ.DLQ里找找,说不定就躺在那里。

 

6消息重发机制

  假如现在我手里有一个很重要的消息的,想要发给一个人,但是很不幸,消息发送失败了。这时候怎么办呢怎么解决这种尴尬的情况,这时候我们可以利用activeMQ的  消息重发机制(RedeliveryPolicy)  来解决这个烦人的问题。

1.写RedeliveryPolicy配置文件

      既然ctiveMQ提供了消息重发机制(RedeliveryPolicy),那么我们只需要在Spring ActiveMQ 整合(一): 一个简单的demo,测试消息的发送与接收  的基础上, 完善activemq的xml配置文件即可。

<!-- 定义ReDelivery(重发机制)机制 ,重发时间间隔是100毫秒,最大重发次数是3次 http://www.kuqin.com/shuoit/20140419/339344.html -->

<bean id="activeMQRedeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">

<!--是否在每次尝试重新发送失败后,增长这个等待时间 -->

<property name="useExponentialBackOff" value="true"></property>

<!--重发次数,默认为6次 这里设置为1次 -->

<property name="maximumRedeliveries" value="1"></property>

<!--重发时间间隔,默认为1秒 -->

<property name="initialRedeliveryDelay" value="1000"></property>

<!--第一次失败后重新发送之前等待500毫秒,第二次失败再等待500 * 2毫秒,这里的2就是value -->

<property name="backOffMultiplier" value="2"></property>

<!--最大传送延迟,只在useExponentialBackOff为true时有效(V5.5),假设首次重连间隔为10ms,倍数为2,那么第

二次重连时间间隔为 20ms,第三次重连时间间隔为40ms,当重连时间间隔大的最大重连时间间隔时,以后每次重连时间间隔都为最大重连时间间隔。 -->

<property name="maximumRedeliveryDelay" value="1000"></property>

</bean>

 

这一段配置就是消息重发机制(RedeliveryPolicy)的实现,  每一行都有详细的注释。

2.引用RedeliveryPolicy的配置:


<!--创建连接工厂 -->

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">

<property name="brokerURL" value="tcp://localhost:61616"></property>

<property name="redeliveryPolicy" ref="activeMQRedeliveryPolicy" /> <!-- 引用重发机制 -->

</bean>


在链接工厂里面引入刚才配置好的RedeliveryPolicy。

 

配置完成后,消息一旦发送失败,就会按照消息重发机制配置好的重发次数,时间间隔等因素,再次发送。

可以看到配置文件中:<property name="maximumRedeliveries" value="1"></property>

设置的重发一次,但是控制台打印出来两个条消息“2”。这就是第一次发送,失败后她又发送了一次,也就是两次。

ActiveMQ面试专题 https://blog.youkuaiyun.com/belvine/article/details/79399798 ... 阅读详情

相关推荐

分布式面试之ActiveMQ面试题

文章目录1、什么是ActiveMQ?2、ActiveMQ服务器宕机怎么办?3、丢消息怎么办?4.持久化消息非常慢。5、消息的不均匀消费。6、死信队列。7、ActiveMQ中的消息重发时间间隔和重发次数吗? 1、什么是ActiveMQ? activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信 2、ActiveMQ服务器宕机怎么办? 这得从ActiveMQ的储存机制说起。在通常的情况下,非持久化消息是存储在内存中的,持久化

用文字记录下每一个瞬间的感动和每一次思考的火花 18万+

ActiveMQ 重发机制(消息发送失败后的重新发送)

一、重新传递消息的情况 ActiveMQ在接收消息的Client有以下几种操作的时候,需要重新传递消息: 1:Client用了transactions(事务),且在session中调用了rollback() 2:Client用了transactions,且在调用commit()之前关闭 3:Client在CLIENT_ACKNOWLEDGE的传递模式下,在session中调...

ancl290591的博客 1641

ActiveMQ消息中间件面试专题

ActiveMQ消息中间件面试专题。

s13166803785的博客 84

ActiveMQ面试 —— 面试专题

前言 消息队列面试资料推荐 入门专题推荐 ActiveMQ专题0 —— 前言说明 ActiveMQ专题1 —— 入门概述 ActiveMQ专题2 —— ActiveMQ下载和安装(Linux版) ActiveMQ专题3 ——Java编码实现ActiveMQ通讯(Queue) ActiveMQ专题4 ——ActiveMQ专题4 ——Java编码实现ActiveMQ通讯(Topic) ActiveMQ专题5 ——JMS规范和落地产品 ActiveMQ专题6 ——ActiveMQ的Broker ActiveMQ专

xiaozhegaa的博客 393

icem二维非结构网格划分_ICEM CFD网格装配

正文共:718字7图 预计阅读时间:2分钟1 前言 对于一些大型的复杂的网格划分,可以将整个模型切分成多个子模型(二维几何用线切分,三维模型用面切分),然后对各个模型单独划分网格,最终装配在一起。这和机械设计的零件设计和装配设计有点相似,这个功...

weixin_39908758的博客 1625

嵌入式系统实战:DroneCAN协议栈移植与避坑指南

本文详细介绍了在嵌入式系统中移植DroneCAN协议栈的完整流程与实战技巧。内容涵盖移植前的准备工作、内存管理优化、CRC校验实现、多帧数据处理及硬件平台适配等关键环节,并以STM32F4为例提供了具体的移植步骤和避坑指南,帮助开发者高效完成DroneCAN在嵌入式设备上的集成与应用。

solidity8miner的博客 547

ActiveMQ 面试备战指南

ActiveMQ 面试备战指南

宋发元 1369

QDMA工程搭建/windows驱动编译与性能测试

请注意,根据您的目标操作系统,您可能需要在windows启动配置中启用测试签名的驱动程序,以便启用此驱动程序的安装。右键单击设备,选择更新驱动程序软件,然后选择构建的QDMA驱动程序的文件夹(通常为。创建一个新工程,在IP Catalog中搜索QDMA,双击创建qdma ip核。驱动程序安装安装驱动程序最简单的方法是通过Windows的“设备管理器”。如果系统提示未经验证的驱动程序发布者,请选择无论如何安装此驱动程序软件。本节主要介绍QDMA驱动在Windows系统的源文件、编译和安装过程。

qq_28455081的博客 2287

ActiveMQ 基础到进阶 && 高级面试

activemq查漏补缺 基础 带日志自定义启动 ./activemq start > /myactiveMQ/run_time.log 注意如果启动不了amq,有一种原因是:linux机器名带有下滑线_,腾讯云服务器也会带下划线,会在日志中报错。 activemq图解 通过ConnectionFactory获取connection,connection生成Session,然后session可以生成Message,MessageProducer和MessageConsumer。 消费者 一个生产者

村里的原振侠的博客 768

Error: dependent ‘..\..\..\..\Qt\5.15.2\msvc2019\include\QtWidgets\QMainWindow‘ does not exist.

核心问题:修改 Build 目录为源码子目录后,MSVC 编译报错,本质是变量设置异常,导致 qmake 生成多余回溯路径;临时解决:在 .pro 文件添加;最优解决:将上述配置写入 Qt 的 msvc 对应 qmake.conf 全局文件,一劳永逸;禁止 qmake 计算路径时向上回溯,避免生成异常路径。

mumufan05的专栏 878

流体仿真软件:COMSOL Multiphysics二次开发_(3).流体仿真基础理论

流体仿真基础理论包括流体的基本性质、流体运动方程、边界条件、初始条件、湍流模型和网格生成等。在使用COMSOL Multiphysics进行流体仿真时,正确设置这些参数和条件是获得准确仿真结果的关键。通过实际应用案例,可以更好地理解如何在COMSOL中进行流体仿真,并提取和分析仿真结果。希望本文对流体仿真初学者和从业人员有所帮助。

kkchenjj的博客 1341

JAVA面试题 - ActiveMQ

JAVA面试题 总目录篇 目录 queue 与 topic 区别?ActiveMQ如何调优?怎么解决消息丢失的问题?怎么解决重复消费的问题?如何保证消费顺序? queue 与 topic 区别? 1、点对点(point-to-point,简称PTP)Queue消息传递模型: 在该消息传递模型下,一个消息生产者向消息服务器端一个特定的队列发送消息,一个消费者从该队列中读取消息。在这种模型下,消息生产者知道消息消费者的队列并直接将消息发送到消息消费者的队列。这种模型的特点为:能够保证数据安全; 2、发布/订阅(

梦想攻城狮的博客 325

11、RK3566/3568 Android11切割屏幕 长条屏 显示

在使用 RK3566 平台进行 Android 11 开发时,遇到切割屏(长条屏)显示画面不全。本文将详细介绍如何配置,以及如何修改 HWComposer 来调整显示区域,解决图像缩放问题。我这边屏幕是lvds接口的,分辨率1920 1080实际的屏物理尺寸是1920x463。

qq_39451352的博客 252

ActiveMQ面试专题总结

ActiveMQ面试专题总结 1.什么是 ActiveMQ? activeMQ 是一种开源的,实现了 JMS1.1 规范的,面向消息(MOM)的中间件,为应用程序提供高效的、 可扩展的、稳定的和安全的企业级消息通信 2. ActiveMQ 服务器宕机怎么办? 这得从 ActiveMQ 的储存机制说起。在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存 储在文件中的,它们的最大限制在配置文件的节点中配置。但是,在非持久化消息堆积 到一定程度,内存告急的时候,ActiveMQ 会将内存中的非持久

九离的博客 242

SAP 消息号T-CODE

SAP消息号修改汇总 确实有很多消息是可以修改的 FI: oBA5|oFMG|oFPM MM: oMRM|oKZZ|oMT4|oMCQ|o04C| SD: oVAH(V4)|oVM1(VL) CO:  oPR4_ACT|oPR4_CK|oPR4_CKML|oPR4_CKPF|oPR4_KKA|oPR4_KKP|oPR4_KKS| oPR4_KKS1|oPR4_P

heng0757的专栏 1万+

实战交易策略 篇二十二:情绪流龙头交易策略

在股票市场中,机构主导趋势,游资驱动热点,散户易被情绪裹挟,形成“金字塔”式生态链,并存在情绪传递、强者恒强、物极必反的规律特点。股市是资金驱动的情绪博弈场,价格波动由群体心理、资金博弈和预期差共同驱动,核心是资本逐利性与人性贪婪恐惧的交织,兼具资源配置、财富再分配与风险定价功能。涨停加速与逃逸缺口(主升强化)凹字板/平台突破(趋势延续)天量弱转强(分歧买点)不参与首波(二波策略)情绪周期(道术合一)主线思维(聚焦核心)开盘抢筹(竞价博弈)一字助攻(情绪强化)分批进出(滚动操作)

生活在别处 1487

ActiveMQ面试总结

ActiveMQ面试专题 1. ActiveMQ服务器宕机怎么办? 这得从ActiveMQ的储存机制说起。在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的,它们的最大限制在配置文件的节点中配置。但是,在非持久化消息堆积到一定程度,内存告急的时候,ActiveMQ会将内存中的非持久化消息写入临时文件中,以腾出内存。虽然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时文件会直接删除。 那如果文件增大到达了配置中的最大限制的时候会发生什么?我做了以

zhangyuliang6430的博客 182

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ActiveMQ知识整理 + 面试题

AcitveMQ 首先,说起ActiveMQ,就必须先聊聊JMS(Java Message Service)规范,也就是Java消息服务,它定义了Java中访问消息中间件的接口的规范。JMS只是接口,并没有给予实现,实现JMS接口的消息中间件称为 “JMS Provider”,目前知名的开源 MOM (Message Oriented Middleware,也就是消息中间件)系统包括Apache的ActiveMQ、RocketMQ、Kafka,以及RabbitMQ,可以说他们都 “基本遵循” 或 “参考”

qq_42832874的博客 704

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ActiveMQ面试题总结

ActiveMQ面试题总结:https://blog.youkuaiyun.com/Future_LL/article/details/86767855

qq_44837912的博客 626

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

activeMQ面试总结

1. 大量的消息每页被消费,能否发生oom异常? 1. 可以控制每个消息队列中数据的大小,不允许无线填充数据,避免该队列多大,导致过度消耗系统资源问题; 可以控制队列的内存大小; 2. activeMQ数据丢失怎么办? 可以使用对数据进行持久化JDBC,AMQ(日志文件),KahaDB和LevelDB,3. activeMQ如何持久化数据? *** 准确答案:http://www.360doc....

寒山空明月 1万+

ActiveMQ教程以及面试题

目录 消息中间件的引用场景 JMS消息模型: 点对点模型的特点: 发布/订阅模型的特点: 核心API: 使用API创建生产者 使用API创建消费者 JMS消息组成格式 结构: JMS Message组成 消息头 消息体 消息属性 ActiveMQ的高级特性 ActiveMQ消息持久化 消息事务 消息确认机制 消息投递方式 1、异步投递 VS 同步投递 2、延迟投递 定时投递 死信队列 ActiveMQ企业经典面试问题 ActiveMQ宕机了怎么办? 如何防止

invisible-wing的博客 1254

2024年Java最全ActiveMQ——Java连接ActiveMQ(点对点)(2),java面试常问

本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!MySQL50道高频面试题整理:本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取。

2401_84689725的博客 1202

activemq原理 java_面试题activemq的原理详解

在面试中经常会碰到activemq的问题,相信小伙伴们都挺烦恼的吧,这里小编精心整理了一些关于activemq的面试题,下面快一起来看看吧。一、activemq是什么?activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。二、说说activemq的作用及原理Activemq 的作用就是系统之间进行通信。 当...

weixin_42470969的博客 3341

java分布式面试题之消息队列ActiveMQ部分,java 面试 知识点

在互联网应用中,基本都会有用户注册的功能。在注册的同时,我们会做出如下操作:收集用户录入信息,保存到数据库向用户的手机或邮箱发送验证码如果是传统的集中式架构,实现这个功能非常简单:开启一个本地事务,往本地数据库中插入一条用户数据,发送验证码,提交事物。但是在分布式架构中,用户和发送验证码是两个独立的服务,它们都有各自的数据库,那么就不能通过本地事物保证操作的原子性。这时我们就需要用到ActiveMQ(消息队列)来为我们实现这个需求。

2301_82242988的博客 606

【面试】Kafka / RabbitMQ / ActiveMQ

摘要:本文总结了Kafka、RabbitMQ和ActiveMQ三大消息队列的面试常见问题。Kafka适用于高吞吐场景,通过分区保证顺序消费,采用多副本防止消息丢失;RabbitMQ功能丰富,支持灵活路由和延迟队列,通过ACK机制确保可靠性;ActiveMQ兼容JMS,适合传统企业应用。三者对比显示,Kafka吞吐量最高但功能简单,RabbitMQ均衡灵活,ActiveMQ功能齐全但性能较低。文中还详细解答了消息积压、顺序消费、延迟消息等具体问题的解决方案。

1616
上一篇: 分布式锁
下一篇: Integer和int的区别
GoldWashing
博客等级 码龄8年 18粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值