SpringCloud服務啟動夯住解決方法

2020年4月14日17:25:33 發表評論 4,624 ℃

項目已經上線一段時間,最近有個新需求,新增加了一個服務。當天上線的時候,發現這個服務在生產環境服務器怎么也啟動不了,總是卡在下圖的界面:

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: