• 记一次公司项目缓存击穿


    介绍

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

    正文

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

    公众号

  • 相关阅读:
    __weak&__block&__unsafe__unretain
    Unable to convert MySQL date/time value to System.DateTime 错误
    做最好的自己,人生十件事(事业,人生,情感)
    52张扑克牌的Suit(花色)和Rank(牌面大小)排序算法
    windows service在服务器上部署时的问题
    "Unable to compile template. Check the Errors list for details" 问题解决办法
    Javascript中的一些自有方法
    winform中的webbrowser里面操作html代码问题
    Javascript,Jquery实现页面图片预加载百分比展现
    【delphi XE 】 Margin属性 转
  • 原文地址:https://www.cnblogs.com/MrChuJiu/p/15919578.html
Copyright © 2020-2023  润新知