事故背景

公司最近安排了一波商品抢购活动,由于后台小哥操作失误最终导致活动效果差,被用户和代理商投诉了。经理让我带同事们一起复盘这次线上事故。

什么原因造成的?

抢购活动计划是零点准时开始,

22:00 运营人员通过后台将商品上线

23:00后台小哥已经将商品导入缓存中,提前预热

抢购开始的瞬间流量非常大,按计划是通过Redis承担大部分用户查询请求,避免请求全部落在数据库上。

如上图预期大部分请求会命中缓存,但是由于后台小哥预热缓存的时候将所有商品的缓存时间都设置为2小时过期,所有的商品在同一个时间点全部失效,瞬间所有的请求都落在数据库上,导致数据库扛不住压力崩溃,用户所有的请求都超时报错。

实际上所有的请求都直接落到数据库,如下图:

什么时候发现的?

凌晨01:02 SRE 收到系统告警,登录运维管理系统发现数据库节点 CPU和内存飙升超过阈值,迅速联系后台开发人员定位排查。

为什么没有早点发现?

由于缓存设置过期时间是2小时,凌晨1点前缓存可以命中大部分请求,数据库服务处于正常状态。

发现时采取了什么措施?

后台小哥通过日志定位排查发现问题后,进行了一系列操作:

首先通过API Gateway(网关)限制大部分流量进来

接着将宕机的数据库服务重启

再重新预热缓存

确认缓存和数据库服务正常后将网关流量正常放开,大约01:30 抢购活动恢复正常。

如何避免下次出现?

这次事故的原因其实就是出现了缓存雪崩,查询数据量巨大,请求直接落到数据库上,引起数据库压力过大宕机。

在业界解决缓存雪崩的方法其实比较成熟了,比如有:

  • 均匀过期
  • 加互斥锁
  • 缓存永不过期

(1)均匀过期

设置不同的过期时间,让缓存失效的时间点尽量均匀。通常可以为有效期增加随机值或者统一规划有效期。

(2)加互斥锁

跟缓存击穿解决思路一致,同一时间只让一个线程构建缓存,其他线程阻塞排队。

(3)缓存永不过期

跟缓存击穿解决思路一致,缓存在物理上永远不过期,用一个异步的线程更新缓存。

最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

  • RabbitMQ实战指南

  • 手写RocketMQ笔记

  • 手写“Kafka笔记”

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

资料领取方式:戳这里免费领取

Java项目代码结构相关推荐

  1. Java项目目录结构与解析

    一个正规的Java项目目录结构首先要清晰. 所以打包的结构就很关键. 如上图所示: bean层 : 放置数据的类 client层 : 放置与用户交互的代码 dao层: 访问数据库层 dao.util层 ...

  2. Octotree | 树形展示 GitHub 项目代码结构

    经常逛 GitHub 的你,是不是有这样一种困惑,每次看到一个项目,想看下项目代码结构,需要一层一层点进去,想看别的目录,又得返回去,效率太低了. 今天推荐的工具是「Octotree」,它能解决以上困 ...

  3. 优秀的 Java 项目代码都是如何分层的?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://rrd.me/ej56f 1.背景 2.如何进 ...

  4. 项目代码结构 Dao,Service,Controller,Util,Model 含义

    DAO = Data Access Object = 数据存取对象 Service = 服务 Controller = 控制器 Util = 工具 Model = 模型 首先,一个代码是不是有完善的结 ...

  5. Python项目代码结构详解

    目录结构组织方式 简要解释一下: bin/: 存放项目的一些可执行文件,当然你可以起名script/之类的也行. luffy/: 存放项目的所有源代码.(1) 源代码中的所有模块.包都应该放在此目录. ...

  6. Java项目代码依赖包安全漏洞检测插件Dependency Check

    最近在搞Java的后端项目,需要更新jar依赖包,找到了一个jar包漏洞检测的插件Dependency Check. Dependency-Check是OWASP(Open WebApplicatio ...

  7. (一)深度学习项目代码结构

    1.代码结构 参考链接:李宏毅2021年机器学习HW2 Phoneme Classification 2.代码细节 获得运行设备 这两种写法的返回值都是字符串 #check device def ge ...

  8. JAVA项目代码手写吗_一个老程序员是如何手写Spring MVC的

    见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十多 ...

  9. idea创建java项目目录结构_用IDEA创建一个简单的Maven的JavaWeb项目

    1.项目环境 IDEA:2016.2 JDK:1.8.0_76 Maven:3.2.5 2.File-->New-->Project-->Maven 3.选择Project SDK: ...

最新文章

  1. UNIX/Linux系统管理技术手册(3)----bash 数组和算术运算
  2. VC嵌入断点中断INT3
  3. pytorch 区间loss 损失函数
  4. mysql nosql引擎_nosql与mysql的区别是什么
  5. python 制作wordcloud词云
  6. Java程序员的日常
  7. 消息中间件之ActiveMQ入门
  8. php时钟制作心得,电子钟课程设计心得
  9. 计算机网络和物联网的区别与联系,3.5.2 从网络端系统接入的角度看互联网与物联网的区别与联系...
  10. Python爬取某宝商品数据案例:100页的价格、购买人数等数据
  11. 软件测试行业中ta表示什么意思,软件测试架构师(TA)的职位特点
  12. 前端前端开发工程师_我们庞大的工程师团队会使用此前端开发指南
  13. 3D艺术家推荐——4款最佳3D建模软件
  14. 微信公众平台开发入门教程(图文)
  15. zbursh2021尝新,安装包
  16. Rabin-Karp算法 (拉宾-卡普)
  17. vue内使用 cytoscape(数据可视化)
  18. HDU--2602--Bone Collector 【01背包】
  19. 爆火的《看漫画学Python》出PDF版了,文末自取
  20. 2021牛客多校#1 Alice and Bob(博弈论)

热门文章

  1. pbar PermissionError
  2. eltwise_layer.cpp:170: error: (-215:Assertion failed) inputs.size() = 2 in function 'cv::dnn::Eltwi
  3. Protobuf windows
  4. KL 损失的边界框回归
  5. layui table 滚动 键盘
  6. Elasticsearch6 去重
  7. windows msys编译64位x264和ffmpeg
  8. mysql所有表查询
  9. mysql 截断表_入门MySQL——基础语句篇
  10. oracle如何删除可回收归档,Oracle正确删除归档并回收空间的方法