性能优化之ActiveMQ问题分析及解决方案
问题现象描述
- 发送消息或者接收消息不能正常进行,访问ActiveMQ挂起,交互无响应。
- ActiveMQ报内存溢出。
- 重启ActiveMQ后控制恢复正常。
分析过程
1) ActiveMQ消息发送有两种方式:同步和异步。一般为提高消息处理能力,通过异步方式解耦实现逻辑同业务分离,提高消息处理效率。
2) 发送消息一般有持久化消息和非持久化消息两类。持久化消息在一些事务较为严格的应用场景下为确保一致性以及可靠性选用,相反非持久化不要求可靠性非常高,但吞吐率等性能相对较高,通常消息发送默认类型为持久化消息。
3) 可视化消息处理机制采用的是默认的异步+持久化消息。
4) 消息发送与接收由代理,生产和消费三个主体构成。生产出来的消息无论是持久化还是非持久化消息均通过代理将消息存至消息存储器,如果消费者处理速度与生产者生产速度相当,那么消息存储器将保持相对平衡稳定状态,如果消息者速度低于生产者速度,那么消息存储器消息将会存满。这就好比长江中的水,平时供需平衡,而到了夏季可能会涝,冬季可能会旱,平衡被打破。同理,可视化消息处理需要防止爆的可能性,一旦爆,就会导致上述现象产生。
5) 通过模拟生产环境,持续发送消息,消息总量控制在几十万到几百万之间。用一个消费者模拟消费异常堵塞状况,实验环节对消息解码后的逻辑处理部分改成休眠方式。
6) 测试过程:
生产端
每次发送12800字节,消息一直不停生产。
消费端:
接收到消息后,并不立即处理消息,而是将消息处理的逻辑休眠,使消息一直处理不能被消费的情形.
结论:上述环境就绪后,在发送8万多条信息时,ACTIVEMQ就会报内存溢出。
图1:ACTIVEMQ控制台截屏
图2:WEB监控截屏
图3:测试程序异常
解决方案
1) 修改ActiveMQ相关配置项(找到ACTIVEMQ安装目录下,进入conf目录,打开activemq.xml文件),有如下两种修改方案:
A.通过修改消息游标实现。目前默认的消息超容后放到内存,而一旦内存压力大的话,MQ就可能会爆,因此将超过容量后的消息转移至文件系统不失为一个解决方案。
B.放大消息存储器使用内存(首先看该部分是否有被注释,如有先取消注释部分)
2)程序优化建议
A.防止接收消息处理主线程过长,可以将接收消息与处理消息业务逻辑分离,通过异步实现
B.由于对消息可靠性要求不是特别高,可以采用非持久化方式
C.消息最好设置生命周期,例如控制在10S之内,可有效降低消息处理中转速度
D.消息处理程序部分最好是可配置的,不要在程序当中出现硬编码。
性能优化之MQ问题分析及解决方案
- 点赞
- 收藏
- 关注作者
评论(0)