阿汤博客-承接中小企业服务器维护和网站维护,有意者可以联系博主!

springcloud服务启动夯住解决方法

运维问题 385℃ 0评论

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

springcloud服务启动夯住解决方法

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

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

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

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

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

解决办法

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

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

转载请注明:阿汤博客 » springcloud服务启动夯住解决方法

喜欢 (0)or分享 (0)