服务突发性雪崩,原因竟然是。。。

不知道大家遇到过这样的场景没,服务跑着跑着突然就挂掉了,重启之后运行又好好的,监控了很久也没有问题,可以在某一个时刻又会突然挂掉。

image

场景说明

我们系统有一个服务就经常发生这样的问题,这个服务主要的作用是获取第三方接口数据,通过每一个商家的账号取第三方获取对应的接口数据,数据是以json返回的。

问题分析

服务挂掉的时候,full gc特别频繁,cpu和内存都超高负荷,所以猜测应该是第三方返回数据太大,解析json导致服务奔溃的,但是如果是这种情况应该服务一启动就挂掉,而不是突发性的挂掉。

发现原因

因为我们服务是部署在腾讯云上面的,所以可以在管理平台查看cpu、内存、流量等属性,后面发现在服务死掉的时候,外网入带宽流量超级大,所以推测应该跑到一个特殊的账号的时候导致服务奔溃的,后面用这个账号模拟复现的时候,果然就是这个问题引起的。

原因分析

我们的服务主要是用来监听MQ,进行队列消息消费,每一个服务都开启多线程进行队列消费,但是当跑到某些特殊的账号,多线程获取数据就是导致jvm内存溢出等问题。

image

处理方案

所以这边我们的处理策略是,对大账号进行筛选,如果是大账号则推送到延时队列中,其它的账号则按照现有的模式进行消费。这样就可以保证服务先消费普通账号数据,然后再消费大账号数据,因为大账号只是个别,所以对账号的数据获取并发可以设置为1,这样就可以保证不会因为多线程获取数据,导致jvm内存溢出。

image

总结

所以说系统运行的好好的,并不意味的没有任何问题,在数据增长到一定程度还是会出现各种问题的。我们一定要做到防范于未然,走在业务前面。

林老师带你学编程https://wolzq.com

林老师带你学编程 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!