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里找找,说不定就躺在那里。
详细文档:http://activemq.apache.org/redelivery-policy.html
http://activemq.apache.org/message-redelivery-and-dlq-handling.html
相关推荐
本文将围绕ActiveMQ常见的问题进行总结,以帮助开发者更好地理解和解决实际操作中的问题。 **一、ActiveMQ基本概念** 1. **生产者(Producer)**:发布消息到消息队列的客户端。 2. **消费者(Consumer)**:从消息...
"工具"标签可能意味着博主使用了一些辅助工具来调试和监控ActiveMQ,比如使用JMX(Java Management Extensions)进行远程管理,或者使用像ActiveMQ Console这样的Web界面来查看队列状态和日志。此外,可能还涉及了如...
activemq学习心得 activemq是Apache软件基金会所研发的开放源代码消息队列iddleware,主要用来实现异步消息处理、解耦合和扩展系统。以下是activemq学习心得的知识点总结: 一、activemq配置文件 activemq的配置...
ActiveMQ 是一款开源的消息中间件,它遵循Java消息服务(JMS)标准,提供可靠的消息传递功能,使得分布式系统中的组件能够解耦通信,提高...理解并熟练掌握这些核心概念和特性,对于利用ActiveMQ解决实际问题至关重要。
这个文档可能包含了更广泛的ActiveMQ应用案例,最佳实践,或者是一些特定场景下的解决方案,例如错误排查、性能优化等。 5. **ActiveMQ架构设计图.doc**: 这里可能包含ActiveMQ的架构设计和工作流程的图形表示,...
然而,在这个过程中,可能会遇到一些问题,比如消息订阅者或发布者在切换过程中与ActiveMQ服务器的连接中断。 具体到本文所述的情况,即当Master节点发生故障后,Slave节点会尝试获取锁并变为新的Master节点。在这...
- **Winkeemq-cpp**:这是一个基于 ActiveMQ-CPP 封装的高级 API 库,它简化了许多常见的初始化和清理工作,同时也隐藏了一些不必要的细节,从而进一步简化了开发流程。 #### 三、术语解析 - **ActiveMQ**:一个...
在ActiveMQ中开启jmx监控需要进行一些配置,包括编辑bin/activemq文件和conf/activemq.xml文件,以及设置jmx.password和jmx.access文件的权限。在配置过程中,需要注意jmxremote.port和rmi.port的设置,确保它们不...
ActiveMQ是中国最流行的开源消息中间件之一,由Apache软件基金会开发。它基于Java Message Service (JMS) 规范,提供了可靠的消息传递功能,适用于分布式系统中的应用间通信。本压缩包“activeMQ收发工具.rar”包含...
如果启动或停止过程中遇到问题,检查以下常见原因: 1. 端口冲突:确保没有其他服务正在使用相同的端口。 2. 权限问题:确保执行启动和停止命令的用户有对ActiveMQ目录和文件的适当权限。 3. Java环境:ActiveMQ依赖...
Apache ActiveMQ 是一款开源的消息中间件,它遵循Java消息服务(JMS)规范,用于在分布式系统中传递消息。在本文中,我们将深入探讨ActiveMQ的安装与...同时,务必关注官方文档和社区资源,以便解决可能出现的问题。
17. 常见问题解答:提供了一些关于如何解决在使用ActiveMQ Artemis过程中可能遇到的问题的指南。 18. 更新和参考:提供了如何更新ActiveMQ Artemis的信息,以及配置参考。 19. Apache Karaf, Spring Integration, ...
在面试中,面试官可能会问到关于ActiveMQ的一些基础和深入的问题,比如ActiveMQ的特性、消息传递机制、故障处理、消息持久化、性能调优以及消息消费等方面的知识。 1. ActiveMQ的核心概念和功能 ActiveMQ提供了多种...
然而,在处理大量并发连接和消息时,ActiveMQ可能会遇到性能瓶颈,例如连接资源耗尽、消息处理不均等问题。本文将详细介绍ActiveMQ在高并发环境下的优化策略,包括异常处理、连接池使用、消费者公平调度以及系统整体...
**ActiveMQ配置文件详解** ...同时,ActiveMQ的源码分析也是一个深入学习的过程,可以揭示其内部工作原理,有助于解决实际问题。在实际操作中,记得根据自己的需求进行调整,确保服务器的稳定性和性能。
### ActiveMQ 概述 Apache ActiveMQ 是一款非常流行的开源消息中间件,它支持 Java 消息服务 (JMS) 标准,并提供了多种高级功能,例如持久化、集群、故障转移等。ActiveMQ 能够帮助开发者实现解耦、可靠的消息传输...
在5.15.0版本中,ActiveMQ可能还修复了前一版本的一些已知问题,增强了稳定性,并引入了新的特性和改进。通过下载并使用`apache-activemq-5.15.0`压缩包,开发者可以快速搭建一个高效、安全的消息传递系统,提升应用...
常见的连接器有TCP、SSL/TLS和NIO。 - 每个`<transportConnector>`元素代表一个监听端口,例如`uri="tcp://0.0.0.0:61616"`表示监听所有网络接口的61616端口。 3. **Policies** - `<policyEntries>`用于定义基于...
ActiveMQ路由配置方式 ActiveMQ路由配置是Apache ActiveMQ项目中的一种重要配置方式,它依赖另一个Apache项目Camel。ActiveMQ集成了Camel,启动时同时会启动Camel。通过Camel Web Console可以进行Routing配置。 ...
为了确保ActiveMQ的稳定运行,需要定期监控其性能和日志,排查可能的问题。可以使用Web管理界面或者通过JMX接口来获取运行状态信息。 总结来说,Apache ActiveMQ是Linux环境下的强大消息中间件,提供了丰富的特性和...