混沌工程-经典案例分享

目录

前言

案例

1、强弱依赖不合理

2、预案不生效

3、异常数据不兼容

4、监控体系缺陷

5、系统缺整体架构设计

总结


前言

        我们公司从启动混沌工程到现在已经几乎覆盖了线上的所有核心业务,先后进行过2000次演练共挖掘出120个漏洞。这些漏洞有些得了及时修复避免了生产故障的发生,也有些因为各种原因推进缓慢没能在引爆之前得到修复,通过血泪教训验证了混沌工程的价值。本篇将通过梳理这120个漏洞以及我们混沌中发现的一些共性的问题拿来一起分享下,希望对大家有所帮助。

案例

1、强弱依赖不合理

        我们在演练电商业务线时发现当某商品的库存服务不可访问时会导致该商品页无法正常打开,这是个典型的强弱依赖不合理的经典案例。

         在应用场景中商品信息与库存信息应该是弱依赖,因为用户只是想浏览和了解商品而已,凭什么因为不知道有多少货就不给用户看了呢?库存信息与交易信息才是强依赖,当用户真正决定购买时才涉及到有多少货的问题。

        这种强弱依赖不仅是代码端做好降级判断等问题,更理想的做法是做好服务拆分,从物理上进行节点的隔离,这样就能更好的根据强弱依赖进行不同等级的高可用设计。例如商品的评论服务节点对于所有的电商模块来说都是弱依赖,那我们就可以在评论相关的资源配备上采用更激进的策略节约成本

2、预案不生效

        案例场景:A调用B、B调用C,当B调用不到C时就用本地缓存获取数据返回给A。

        这个场景中B的设计就是典型的利用缓存做降级的预案设计,每个研发可能都会信誓旦旦的表示这么简单的逻辑绝对不会有问题,但我们在实际的混沌演练中确实发现此类预案没有生效!不生效的原因基本都聚焦到对降级条件的判断上。B从C拿到不完整的数据要不要启用本地缓存?B到C网路延时、延时多少要用缓存?

3、异常数据不兼容

        混沌工程在网络层面的故障注入常用的方法是模拟4层异常,例如域名解析错误、网络延时、通信丢包、网络不通等,这确实可以发现大部分因网络问题引发的故障,但不能发现7层引发的问题,例如异常的数据格式。

        案例场景:A调用B,如果B返回200就从B的body中按协商好的Json格式进行解析。

        那么问题来了,当B返回非200A会怎样?返回200但body无数据A会怎样?body有数据但Json格式与协商不一样会怎样?甚至说body返回的就不是一个Json会怎样?这些异常是真实会发生而且一定会发生的,那么演练一定要覆盖到,所以这里就需要用到7层的网络异常注入了。

4、监控体系缺陷

        有个成语叫“手眼通天”,混沌工程中像ChaosBlade这类的异常注入工具只是我们的“手”,手帮我们造成混乱,但混乱造成的影响需要靠“眼”来看到,监控体系就是混沌工程的“眼”。手的能力和眼的视野决定了混沌演练效果的上限。 实践中发现很多时候我们的“眼”是有缺陷的,明明用户体验已经严重受损但我的监控健康度仍然100分;明明用户体验一切正常但我们的告警已经达到灾难级,或者演练时我们需要关注某些指标但我们提供不了,这些都是现有监控系统需要优化改造的点。

5、系统缺整体架构设计

        案例:后端服务分别部署在两个集群节点,对接同一套数据库,前端通过主域名和备用域名的跨域名重试实现多节点容灾设计,当我们模拟主节点到数据库网络异常时,期望前端通过备用域名仍能提供稳定的用户体验。

        如图:

        经过演练发现用户的前端界面在卡顿6秒后才能正常展示,并不符合我们的预期,于是逐层去分析原因。 

        前端:先尝试主域名请求,因为不清楚后端服务是否具备幂等性所以必须等待后端明确返回非200的状态码后才能进行跨域名重试。

        后端:数据库链接超时2秒,重试3次,3次都不成功返回500+。

        前后端的设计都合情合理,甚至说无懈可击,但组合在一起就造成了这6秒延时,从系统架构来看明明可以快速失败进行跨域名重试,从而提高用户体验的,而这些设计并不是前端、后端具体某一个团队负责的,需要整体架构设计与相应的规范。

总结

        混沌工程是一种产生新数据的技术,通过演练不仅能提前发现隐患避免故障的大范围爆发,还能发现运维体系的盲区和整体架构设计的缺陷,可以说混沌工程本身就是优秀架构设计的试金石。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/725621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevEco Studio编译时候自动生成js、js.map文件导致项目无法运行

这算是开发工具的bug吧,估计后期能修复。 解决办法,手动删除.js、.js.map文件即可; 文件太多,删除很麻烦,有个大佬写了个插件,可一键删除:ArkCompilerSupport DevEco Studio 运行项目有时会自动…

二叉树进阶leetcode

606. 根据二叉树创建字符串 要点:前序遍历,当左子树为空时,右结点有数字时要给左边加括号 class Solution { public:string tree2str(TreeNode* root) {string s;//创建一个字符串if(rootnullptr){return s;}sto_string(root->val);//保存…

网络、网络协议模型、UDP编程——计算机网络——day01

今天来到了网络编程,主要讲了网络、网络协议模型以及UDP编程 网络 网络主要是进行:数据传输和数据共享 网络协议模型 OSI协议模型应用层 实际发送的数据表示层 发送的数据是否加密会话层 是否建立会话连接传…

调研图基础模型(Graph Foundation Models)

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 图基础模型(Graph Foundation Models,简称 GFMs) 是一种经过预训练的图大模型,旨在处理不同领域的图数据和任务。让我们详细探讨一下这个概念。 Github …

详解openGauss客户端工具gsql的高级用法

前言: gsql是openGauss提供在命令行下运行的数据库连接工具,可以通过此工具连接服务器并对其进行操作和维护,除了具备操作数据库的基本功能,gsql还提供了若干高级特性,便于用户使用。 gsql的基本功能 连接数据库&…

https 加密解密过程是什么?

HTTPS 加密通信过程中,主要涉及到以下几个步骤: 握手阶段(handshake phase): 客户端向服务器端发送一个加密通信请求,并提供自己的加密能力列表,以及一个随机生成的密钥(Pre-master secret)。…

uniapp让输入框保持聚焦状态,不会失去焦点

使用场景:当输入框还有发送按钮的时候,点击发送希望软键盘不消失,还可以继续输入,或者避免因输入图片标签造成的屏闪问题 多次尝试后发现一个很实用的方法,适用input输入框和editor输入框 解决办法:把cli…

AXI4总线解析

一、读地址 AWVALID和AWREADY同时为高时,在这个上升沿,图中黄线,将接下来的数据写入地址40000000中。 在

基于状态机的按键消抖实现

摸鱼记录 Day_14 !(^O^)y review 在day_13中以按键状态判断为例学习了状态分析基于状态机的按键消抖原理-CSDN博客 分析得到了下图: 今日任务:完成此过程 !(^O^)y 小梅哥对应视频: 15B 基于状态机的按键消抖Verilog实现_哔哩哔哩…

springboot/ssm图书管理系统Java图书馆图书统计系统web

springboot/ssm图书管理系统Java图书馆图书统计系统web 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql …

DataFunSummit 2023:洞察现代数据栈技术的创新与发展(附大会核心PPT下载)

随着数字化浪潮的推进,数据已成为企业竞争的核心要素。为了应对日益增长的数据挑战,现代数据栈技术日益受到业界的关注。DataFunSummit 2023年现代数据栈技术峰会正是在这样的背景下应运而生,汇聚了全球数据领域的精英,共同探讨现…

Linux 文件操作命令

1 文件与目录操作 cd /home 进入 ‘/home’ 目录 cd .. 返回上一级目录cd ../.. 返回上两级目录cd - 返回上次所在目录cp file1 file2 将file1复制为file2cp -a dir1 dir2 复制一个目录 cp -a /tmp/dir1 . 复制一个…

nginx作为tcp的负载均衡

背景: 之前总以为nginx只能当静态资源web容器和web的负载均衡,现在才知道原来也可以当tcp的负载均衡。现在我们项目测试服就是一个nginx对应了2个测试服的负载均衡。配置如下: [rootlocalhost conf]# cat nginx.conf#user nobody; worker_processes …

【Qt】初识Qt

文章目录 一. 行业岗位介绍二. 什么是客户端?三. GUI 开发的各自技术方案四. 什么是框架?五. Qt 的发展史五. Qt 支持的系统六. Qt 的优点 一. 行业岗位介绍 二. 什么是客户端? 既然 Qt 是用来进行客户端开发的,那我们就要了解什…

如何保证ES和数据库的数据一致性?

在业务中,我们通常需要把数据库中的数据变更同步到ES中,那么如何保证数据库和ES的一致性呢?通常有以下几种做法: 双写 在代码中,对数据库和ES进行双写,并且先操作本地数据库,后操作ES&#xff…

Ubuntu20.04安装并配置vscode

Ubuntu20.04安装并配置vscode vscode安装miniconda安装创建虚拟python3.8环境pytorch和匹配的cuda安装 vscode安装 VSCode可以通过 Snapcraft 商店或者微软源仓库中的一个 deb 软件包来安装。 我们这里选用安装VSCode snap版,打开你的终端(CtrlAltT)并且运行下面的…

Apache Paimon 使用之 Creating Table

1.创建 Catalog 管理的 Tables 在Paimon Catalog中创建的Tables由Catalog管理,当Tables从Catalog中删除时,其table files也将被删除。 当使用Paimon Catalog,创建一个名为MyTable的managed table,在Catalog的default数据库中有五…

px2rem实现vue项目响应式布局

第一步 首先需要在项目中安装px2rem插件 npm install postcss-px2rem px2rem-loader --save 第二步 在项目src目录下新建util文件夹,在util文件夹下新建rem.js文件,内容如下: // rem等比适配配置文件 // 基准大小 const baseSize 14 //…

【机器学习300问】27、什么是决策树?

〇、两个预测任务 (1)任务一:银行预测偿还能力 当前,某银行正致力于发掘潜在的放贷用户。他们掌握了每位用户的三个关键特征:房产状况、婚姻状况以及年收入。此外,银行还拥有过往这些用户的债务偿还能力的…

刚工作菜鸟的小总结2

刚工作菜鸟的小总结2 1. using 关键字 using关键字可以用来定义一个类型的别名。例如 using SI_Error = int ,它的作用是将 SI_Error 这个名称与 int 类型进行关联,也就是说在后续代码中,可以使用 SI_Error 来代替 int 类型。如果程序中出现了 SI_Error ,我们就能清晰知道…