ActiveMQ面试题(一)

这篇具有很好参考价值的文章主要介绍了ActiveMQ面试题(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

  1. 什么是ActiveMQ
  2. ActiveMQ 服务器宕机怎么办?
  3. 丢消息怎么办
  4. 持节化消息非常慢
  5. 消息的不均匀消费

一、什么是ActiveMQ

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


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

这得从 ActiveMQ 的储存机制说起。
在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的,它们的最大限制在配置文件的 systemUsage 节点中配置。
但是,在非持久化消息堆积到一定程度,内存告急的时候,ActiveMQ 会将内存中的非持久化消息写入临时文件中,以腾出内存。虽然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时文件会直接删除。
那如果文件增大到达了配置中的最大限制的时候会发生什么?我做了以下实验:
设置 2G 左右的持久化文件限制,大量生产持久化消息直到文件达到最大限制,此时生产者阻塞,但消费者可正常连接并消费消息,等消息消费掉一部分,文件删除又腾出空间之后,生产者又可继续发送消息,服务自动恢复正常。
设置 2G 左右的临时文件限制,大量生产非持久化消息并写入临时文件,在达到最大限制时,生产者阻塞,消费者可正常连接但不能消费消息,或者原本慢速消费的消费者,消费突然停止。整个系统可连接,但是无法提供服务,就这样挂了。
具体原因不详,解决方案:尽量不要用非持久化消息,非要用的话,将临时文件限制尽可能的调大。

三、丢消息怎么办

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

四、持节化消息非常慢

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

五、消息的不均匀消费

有时在发送一些消息之后,开启 2 个消费者去处理消息。会发现一个消费者处理了所有的消息,另一个消费者根本没收到消息。原因在于 ActiveMQ 的 prefetch 机制。当消费者去获取消息时,不会一条一条去获取,而是一次性获取一批,默认是 1000 条。这些预获取的消息,在还没确认消费之前,在管理控制台还是可以看见这些消息的,但是不会再分配给其他消费者,此时这些消息的状态应该算作“已分配未消费”,如果消息最后被消费,则会在服务器端被删除,如果消费者崩溃,则这些消息会被重新分配给新的消费者。但是如果消费者既不消费确认,又不崩溃,那这些消息就永远躺在消费者的缓存区里无法处理。更通常的情况是,消费这些消息非常耗时,你开了 10 个消费者去处理,结果发现只有一台机器吭哧吭哧处理,另外 9 台啥事不干。
解决方案:将 prefetch 设为 1,每次处理 1 条消息,处理完再去取,这样也慢不了多少。文章来源地址https://www.toymoban.com/news/detail-733157.html


总结

  1. 什么是ActiveMQ
  2. ActiveMQ 服务器宕机怎么办?
  3. 丢消息怎么办
  4. 持节化消息非常慢
  5. 消息的不均匀消费

到了这里,关于ActiveMQ面试题(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python接收activemq服务器的消息,转发到另外两个activemq服务器消息中

    要使用Python接收ActiveMQ服务器的消息并将其转发到另外两个ActiveMQ服务器,您可以使用Python的pika库。pika是一个流行的AMQP(高级消息队列协议)客户端库,可以与ActiveMQ等消息代理进行交互。 以下是一个简单的示例,演示如何使用pika从ActiveMQ服务器接收消息,并将其转发到另外

    2024年01月19日
    浏览(47)
  • Zabbix监控ActiveMQ

    当我们在线上使用了 ActiveMQ 后,我们需要对一些参数进行监控,比如 消息是否有阻塞,哪个消息队列阻塞了,总的消息数是多少等等。下面我们就通过 Zabbix 结合 Python 脚本来实现对 ActiveMQ 的监控。 一、创建 Activemq Python 监控脚本 因为 CentOS 系统默认安装的是 Python2.7 ,为了

    2024年02月14日
    浏览(41)
  • Activemq存储KahaDb详解

    ActiveMQ在不提供持久化的情况下,数据保存在内存中,一旦应用崩溃或者重启之后,数据都将会丢失,这显然在大部分情况下是我们所不希望的。对此ActiveMQ提供了两种持久化方式以供选择。 kahaDB是一个基于文件,支持事务的、可靠,高性能,可扩展的消息存储器,目前是a

    2024年02月04日
    浏览(33)
  • SpringBoot整合ActiveMQ

    🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈,计算机系列(火速更新中) 💭 格言:种一棵树最好的时间是十年前,其次是现在 🏡动动小手,点个关注不迷路,感

    2024年02月19日
    浏览(35)
  • 如何使用ActiveMQ

    ActiveMQ是Apache的一款开源消息总线,主要用来做消息的分发。使用ActiveMQ,通常需要以下步骤: 一、启动ActiveMQ 首先需要下载ActiveMQ,然后进行启动。启动后,可以在控制台创建队列,初始用户名和密码通常为admin/admin。 二、编写生产者代码 创建一个ConnectionFactory对象,需要指

    2024年01月17日
    浏览(33)
  • ActiveMQ 02 常用API

    事务 用来提交/回滚事务 Purge 清理消息 签收模式 签收代表接收端的session已收到消息的一次确认,反馈给broker ActiveMQ支持自动签收与手动签收 Session.AUTO_ACKNOWLEDGE 当客户端从receiver或onMessage成功返回时,Session自动签收客户端的这条消息的收条。 Session.CLIENT_ACKNOWLEDGE 客户端通过

    2024年04月16日
    浏览(61)
  • 七、ActiveMQ的传输协议

    官网地址:http://activemq.apache.org/configuring-version-5-transports.html ActiveMQ支持的client-broker通讯协议有:TVP、NIO、UDP、SSL、Http(s)、VM。 其中配置Transport Connector的文件在ActiveMQ安装目录的conf/activemq.xml中的transportConnectors标签之内。 URI描述信息的头部都是采用协议名称,唯独在进行op

    2024年02月19日
    浏览(35)
  • ActiveMQ基础学习简单记录

    本文为Activemq简单入门文章 JMS即Java Message Service,是JavaEE的消息服务接口。JMS主要有两个版本:1.1和2.0。2.0和1.1相比,主要是简化了收发消息的代码。 JMS为Java程序提供了一种通用方法, 用于创建、发送、接收和读取企业消息系统中的消息。 JMS是一组接口定义,如果我们要使用

    2024年02月06日
    浏览(44)
  • 什么是 Apache ActiveMQ?

    ActiveMQ 是一种流行的消息传递服务,可促进企业系统中大规模的不同数据。在本 ActiveMQ 教程中,我们概述了 ActiveMQ、它的优点、它的工作原理以及何时应该使用它。 什么是 ActiveMQ? ActiveMQ 是一种流行的开源消息传递服务,它构建在 Java 之上。它用作面向消息的中间件 ( MoM

    2024年02月07日
    浏览(46)
  • 二、ActiveMQ安装

    环境:Centos7.9 安装ActiveMQ版本:5.15.9 JDK8 安装教程:https://qingsi.blog.csdn.net/article/details/136129131 ActiveMQ版本:5.15.9 任意版本下载地址 5.15.9版本下载地址 如果有防火墙,需要开通端口 http://127.0.0.1:8161/admin 默认的用户名和密码是admin/admin

    2024年02月19日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包