性能优化之ActiveMQ问题分析及解决方案

举报
zuozewei 发表于 2021/11/25 21:31:40 2021/11/25
【摘要】 性能优化之MQ问题分析及解决方案

问题现象描述

  1. 发送消息或者接收消息不能正常进行,访问ActiveMQ挂起,交互无响应。
  2. ActiveMQ报内存溢出。
  3. 重启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问题分析及解决方案

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。