记一次公司项目缓存击穿

介绍

好久没分享自己这边的文章了,上周公司有个线上项目出了个问题,来给大家分享一下,问题让人细思极恐,感觉自己之前写的很多代码都会引发。

正文

我们先说业务问题,该项目是一个微服务项目,逻辑是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

公众号

posted @ 2022-02-21 16:46  初久的私房菜  阅读(361)  评论(0编辑  收藏  举报
作者:初久的私房菜
好好学习,天天向上
返回顶部小火箭
好友榜:
如果愿意,把你的博客地址放这里
张弛:https://blog.zhangchi.fun/