记一次公司项目缓存击穿
介绍
好久没分享自己这边的文章了,上周公司有个线上项目出了个问题,来给大家分享一下,问题让人细思极恐,感觉自己之前写的很多代码都会引发。
正文
我们先说业务问题,该项目是一个微服务项目,逻辑是A服务启动后会把自己的一个业务数据放到redis缓存服务中,然后B服务的一个接口就会去从redis缓存服务去获取这个数据然后和自己的数据库业务数据关联,处理返回给客户端。
正常情况下我们的业务处理步骤。
## 连接redis服务器获取数据
## 打开数据库连接
## 查询数据
## 关闭数据库
## 内存业务处理
## 返回
但是当我们将我们加入工作单元然后将工作单元AOP到接口层,我们的步骤就会改变。
## AOP打开数据库连接
## 连接redis服务器获取数据
## 打开数据库连接
## 查询数据
## 内存业务处理
## 返回
## AOP关闭数据库
这个时候如果我们的redis缓存服务器宕机了,好玩的事情就来了,我们批量设置的缓存服务器超时是5秒过期我们会从A服务的业务接口去拿数据,但是这个接口的业务并发量如果在每秒钟2w,那么从第一个请求进来开启数据库连接,
到第一个请求的数据库连接被关闭,理想情况这里要经过5+1+1,也就是14w个占用,但是数据库连接是非常占用内存的,在还不到14w个连接的时候服务器的内存和CPU就会被吃满,满了之后你的业务服务就会因为没有资源使用而崩溃掉。
解决方案也比较简单,正常我们使用的框架比如ABP vNext,我们可以在接口定义默认不开启工作单元,然后我们在业务部分手动去开。
那么这个事情为什么是细思极恐呢,因为我们正常微服务请求,采用AOP开启工作单元,我们业务部分请求多个串联的服务器接口,某一环节接口宕机,在加上我们的重试机制,这个业务时间是要超过7秒的,在高并发的请求下就会出问题
结语
联系作者:加群:867095512 @MrChuJiu