在面试中经常会碰到activemq的问题,相信小伙伴们都挺烦恼的吧,这里小编精心整理了一些关于activemq的面试题,下面快一起来看看吧。

一、activemq是什么?

activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。

二、说说activemq的作用及原理

Activemq 的作用就是系统之间进行通信。 当然可以使用其他方式进行系统间通信, 如果使用 Activemq 的话可以对系统之间的调用进行解耦,

实现系统间的异步通信。 原理就是生产者生产消息, 把消息发送给activemq。 Activemq 接收到消息, 然后查看有多少个消费者,

然后把消息转发给消费者, 此过程中生产者无需参与。 消费者接收到消息后做相应的处理和生产者没有任何关系

三、activemq有哪些通信方式?

publish(发布)-subscribe(订阅)(发布-订阅方式)

发布/订阅方式用于多接收客户端的方式.作为发布订阅的方式,可能存在多个接收客户端,并且接收端客户端与发送客户端存在时间上的依赖。一个接收端只能接收他创建以后发送客户端发送的信息。作为subscriber

,在接收消息时有两种方法,destination的receive方法,和实现message listener 接口的onMessage 方法

p2p(point-to-point)(点对点)

p2p的过程则理解起来比较简单。它好比是两个人打电话,这两个人是独享这一条通信链路的。一方发送消息,另外一方接收,就这么简单。在实际应用中因为有多个用户对使用p2p的链路

相互通信的双方是通过一个类似于队列的方式来进行交流。和前面pub-sub的区别在于一个topic有一个发送者和多个接收者,而在p2p里一个queue只有一个发送者和一个接收者。

四、如何解决消息重复问题?

所谓消息重复,就是消费者接收到了重复的消息,一般来说我们对于这个问题的处理要把握下面几点,

①.消息不丢失(上面已经处理了)

②.消息不重复执行

一般来说我们可以在业务段加一张表,用来存放消息是否执行成功,每次业务事物commit之后,告知服务端,已经处理过该消息,

这样即使你消息重发了,也不会导致重复处理

大致流程如下:

业务端的表记录已经处理消息的id,每次一个消息进来之前先判断该消息是否执行过,如果执行过就放弃,如果没有执行就开始执行消息,消息执行完成之后存入这个消息的id。

五、死信队列是什么?

ActiveMQ中引入了 死信队列 的概念,即一条消息再被重发多次后(默认是6)

将会被ActiveMQ移入死信队列,程序员 也就是我们可以在这个Queue中查看处理出错的消息,进行人工干预。

死信队列的使用:处理失败的消息

一般生产环境中,使用MQ的时候,设计两个队列:一个核心队列,一个死信队列

核心业务队列就是比如用订单系统发送订单消息,然后另外一个死信队列用来处理异常的情况。

假如第三方物流系统故障了,此时无法请求,那么仓储系统每次消费到一条订单消息,尝试通知发货和配送都会遇到对方的接口报错。此时仓储系统就可以把这条消息拒绝访问或者标志为处理失败。一旦标志这条消息处理失败后,MQ就会把这条消息转入提前设置好的一个死信队列中,然后你会看到的就是在第三方的物流系统故障期间,所以订单消息全部处理失败,全部转入死信队列,然后你的仓储系统得到专门有一个后台线程监控第三方物流系统是否正常运行,能否请求到,不停的监控,一旦发现对方恢复正常,这个后台线程就可以从死信队列消费出来

处理失败的订单,重新执行发货和配送的通知逻辑

六、ActiveMQ服务器宕机怎么办?

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

那如果文件增大到达了配置中的最大限制的时候会发生什么?我做了以下实验:设置2G左右的持久化文件限制,大量生产持久化消息直到文件达到最大限制,此时生产者阻塞,但消费者可正常连接并消费消息,等消息消费掉一部分,文件删除又腾出空间之后,生产者又可继续发送消息,服务自动恢复正常。

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

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

七、持久化消息速度慢怎么办?

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

八、消息的不均匀消费怎么解决?

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

以上就是关于activemq面试题的所有内容了,还想了解更多其他java面试题内容,请继续关注我们了解具体吧。

推荐阅读:

activemq原理 java_面试题activemq的原理详解相关推荐

  1. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)...

    上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢? 测试代码 publi ...

  2. 共模扼流圈的工作原理与作用以及特点和应用详解

    共模扼流圈的工作原理与作用以及特点和应用详解 - 电子常识 - 电子发烧友网 http://www.elecfans.com/dianzichangshi/20170609523118.html 共模 ...

  3. 图像仿射变换原理3:仿射变换类型及变换矩阵详解

    ☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython ░ 仿射变换博文传送门(带星号的为付费专栏文章): *图像仿射变换原理1:齐次坐标来龙去脉详解 ...

  4. 21年最新Python面试题及答案汇总详解(上)

    错过三月找工作的机会,还要错过四月的好时期吗?Python面试你做准备了吗?下面小编整理了一套2021年最新Python常见面试题目,及Python面试题目答案汇总.希望能够帮助到大家. 21年最新P ...

  5. Java经典面试题整理及答案详解(八)

    简介: Java经典面试题第八节来啦!本节面试题包含了进程.线程.Object类.虚拟内存等相关内容,希望大家多多练习,早日拿下心仪offer- 了解更多: Java经典面试题整理及答案详解(一) J ...

  6. Java经典面试题整理及答案详解(三)

    简介: 以下是某同学面试时,面试官问到的问题,关于面试题答案可以参考以下内容- 上一篇:Java经典面试题整理及答案详解(二) Java面试真题第三弹接住!相信通过前两节的学习,大家对于Java多少有 ...

  7. Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解

    Redis内存回收机制 Redis的内存回收主要围绕以下两个方面: 1.Redis过期策略:删除过期时间的key值 2.Redis淘汰策略:内存使用到达maxmemory上限时触发内存淘汰数据 Red ...

  8. jvm压缩指针原理以及32g内存压缩指针失效详解

    目录: java虚拟机汇总 class文件结构分析 1).class文件常量池中的常量项结构 2). 常用的属性表的集合 类加载过程 1).类加载器的原理以及实现 虚拟机结构分析 1).jdk1.7和 ...

  9. mysql中锁原理及for update悲观锁的详解

    mysql 中有多种多样的锁,今天我们具体分享一下: 一.mysql中乐观锁和悲观锁原理及种类: ​        乐观锁并不是数据库自带的,如果需要使用乐观锁,那么需要自己去实现,一般情况下,我们会 ...

最新文章

  1. Bootstrap 栅格系统 理解与总结
  2. 偶然发现的QQ的一个挺讨厌的BUG
  3. Python 技术篇-使用pygame库展示界面添加图片不显示问题解决办法
  4. 在MATLAB中使用tensorflow
  5. swift语言实战晋级-第9章 游戏实战-跑酷熊猫-7-8 移动平台的算法
  6. 解决Spring框架下中文乱码的问题
  7. hue 用oozie调度shell(sqoop)脚本问题
  8. 一个简单的适用于Vue的下拉刷新,触底加载组件
  9. 大数据为什么需要安全分析
  10. 正则式转化nfa 代码_从0到1打造正则表达式执行引擎(二)
  11. FLASH透明背景代码大全
  12. DirectX 11
  13. MT5自定义均线指标(含弹窗、App、邮箱预警)
  14. Gerry。沙漠苦旅。
  15. Cisco ❀ IPV4协议数据报头部
  16. Python安装火狐浏览器驱动
  17. OpenCV3.4.8实现立体视觉校正与标定
  18. 用VSCode编写Latex时遇到的问题(Mac系统下)
  19. 革命展馆沙盘拍照打卡学习活动制作方案,border-color 属性用于设置四个边框的颜色。
  20. Android即时通讯--仿QQ即时聊天:(一)初识Socket

热门文章

  1. docker 上的mongodb数据库操作命令
  2. java8 数值流 装箱和拆箱讲解
  3. RS485通信模块使用及代码【简】
  4. 微信小程序---常用的指令/组件
  5. 【NLP | 机器学习】隐马尔科夫模型与代码实现
  6. cglib 的BeanCopier高性能解密
  7. BeanCopier 详解
  8. 【牛客网华为机试】HJ16 购物单
  9. vue+element之carousel走马灯的使用(The use of vue+element carousel)
  10. 数据结构之什么是二叉树(满二叉树和完全二叉树)以及和树的区别