某个周六的中午,领导突然找我说线上有大量报错,让我看一下。我发现日志中出现了很多下面的报错信息,而且持续了一段时间(后面才发现收到了告警邮件,但是当时手机没有提醒,强行甩锅…):
org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'xxxController': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:208) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.web.method.HandlerMethod.createWithResolvedBean(HandlerMethod.java:323) at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367)
双写+读阶段
,故赶紧将读请求转移到原始项目 docker的cpu使用率
和 docker的内存使用率
在某个时间节点开始发生了持续的断层(容器自动重启),仔细一看,在断层开始前,系统流量出现了一个小高潮。然后赶紧找运维同事帮忙检查下容器自身的配置。果不其然,本服务的几个实例配置的JVM堆内存不够用了,增大配置后,调用请求恢复了正常。 系统出现峰值的时候,确实流量上去了一些,但是伴随出现了一些慢请求(上面提到的慢查询sql),当时的请求由于数据关联性比较强,要查询的数据比较多,创建的对象也就比较多,从而造成频繁的GC,导致各个请求的延时都比较严重。Springboot自带的测活接口(/alive)也不例外,出现了测活超时,从而导致容器频繁自动重启,在容器重启的时候,会发生下面的情况: