SpringCloud服务启动夯住解决方法

2020年4月14日17:25:33 发表评论 3,197 ℃

项目已经上线一段时间,最近有个新需求,新增加了一个服务。当天上线的时候,发现这个服务在生产环境服务器怎么也启动不了,总是卡在下图的界面:

SpringCloud服务启动夯住解决方法

然后在测试环境,反反复复发布了两周多,也没出现这个问题。没办法经过1个多小时的排除,未找到原因,只好把这个服务推迟上线。

后面经过反复测试,发现在预生产环境也无法启动,测试环境偶尔也会出现这个情况,到目前为止找不到方向,想着debug模式启动看下是否有异常信息,这个时候却正常启动了。

然后把日志改回info反复测试,又可以启动了,越来越诡异,百思不得其解。于是把服务停了,第二天发现又无法启动了...此时内心是崩溃的。

最后突然才想起,可以使用java的堆栈分析命令jstack,打印堆栈信息,就知道什么原因导致启动夯住了。

导出日志分析才发现大部分线程都是Blocked(阻塞)状态,而这些阻塞的原因都与RocketMQ相关,日志中还有线程Deadlock(死锁)状态,相关堆栈信息也是和RocketMQ相关,然后让开发人员去排查,发现是RocketMQ消费方面的代码;最后经过分析原因是:因为这个服务是新上线的,然而服务在启动的过程中,MQ就已经启动了,并且要去消费消息,而此时服务还未完全启动,第一次发布此服务会有大量的消息需要消费,导致线程阻塞并且死锁。

解决办法

1、调整服务启动时RocketMQ的启动顺序,貌似不好实现。

2、改成debug模式启动成功以后,消费了以前的消息,再改回来重新发布。(至于为什么debug模式就不会夯住,目前还没找到原因)

【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: