记一次生产ActiveMQ消息积压
Posted 小青年在外
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次生产ActiveMQ消息积压相关的知识,希望对你有一定的参考价值。
总结是一个好习惯,把遇到的问题总结下来,分享出来,可能这就是所谓的经验吧。
1、现象(消息堆积)
ActiveMQ集群上出现消息数据慢慢的积压、但是消息的数量也在缓慢下降(一分钟消费一条)。总结一下就是生产者发送消息速度快于消费者消费消费消息的速度,也称消息堆积。同时消费者的数量不断上升,最终上升到消费者数量的最大值 此处设置为20即,又因为微服务为高可用的框架双节点 所以消费者个数即乘以2即40个消费者:
@JmsListener(destination = "destinationName", concurrency = "1-20")
2、尝试方案一(重启应用)
因为前几天同事的部门,也出现此现象,在杀死一个节点后,问题解决(原因未知)。犯了经验性的错误 直接重启应用,结果不好使。
3、开始排查,查询生产的elk日志
根据日志的链路分析。发现程序在执行某一条sql的时候,只打印了开始执行sql(根据查询结果进行update),然后就没有任何日志了,然后又跟踪了其他的几条链路,发现都是这种情况。然后怀疑是SQL的问题。拿出SQL到生产的Read用户执行一下果然很慢。然后在read权限的用户下面 F5看执行计划 在UPDATE时,根据字段查询执行的为全表扫描操作
TABLE ACCESS FULL
(此处sql在更新时需要查询其他表数据); 感觉似乎找到了问题:
马上找dba老师创建索引,由于程序仍然在使用的过程中,创建索引的过程漫长(10分钟左右) 消息消费速度加快,没有积压。问题解决
4、原因分析:
项目刚开始上线时,没有这么大数据量,创建索引反而会影响查询速度,但是随着业务的增加和时间的推移、数据量的不断增加。查询速度越来越慢,这时就需要创建索引了。
注意:个人建议 可以使用update写的,千万不要使用forupdate实现,一个是个人认为很low,另外一个就是会造成锁表。
以上是关于记一次生产ActiveMQ消息积压的主要内容,如果未能解决你的问题,请参考以下文章