混沌工程-经典案例分享

目录

前言

案例

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秒延时,从系统架构来看明明可以快速失败进行跨域名重试,从而提高用户体验的,而这些设计并不是前端、后端具体某一个团队负责的,需要整体架构设计与相应的规范。

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C if...else 语句

一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为 false 时执行。 语法 C 语言中 if…else 语句的语法: if(boolean_expression) {/* 如果布尔表达式为真将执行的语句 */ } else {/* 如果布尔表达式为假将执行的语句 */ }如果布尔表…

Java Day2 面向对象

这里写目录标题 1、static总结1.1 代码块1.1.1 静态代码块1.1.2 实例代码块1.1.3 小例子 2、继承2.1 权限修饰符2.2 方法重写2.3 子类访问成员特点2.4子类构造器的特点 3、多态4、final、常量4.1 final4.2 常量 5 抽象类5.1 概念5.2 模板设计方法 6、接口6.1 接口新方法6.2 接口…

openEuler学习——部署MGR集群

本文介绍如何利用GreatSQL 8.0.25构建一个三节点的MGR集群。 1.安装准备 IP端口角色192.168.20.1103306mgr1192.168.20.1113306mgr2192.168.20.1123306mgr3 配置hosts解析 [rootMGR1 ~]# cat >> /etc/hosts << EOF > 192.168.20.110 MGR1 > 192.168.20.1…

Qt QtCreator打开pro项目时出现假死现象

在Windows系统下&#xff0c;QtCreator打开pro项目时出现假死现象&#xff0c;左侧项目树形图无法展开&#xff0c;项目根节点一直在转圈。尝试关掉所有QtCreator进程&#xff0c;重新打开pro也是无济于事。 解决方案&#xff1a; 打开“运行”窗口&#xff08;快捷键&#x…

overleaf latex 笔记

overleaf: www.overleaf.com 导入.tex文件 1.代码空一行&#xff0c;代表文字另起一段 2. 1 2 3 排序 \begin{enumerate} \item \item \item \end{enumerate} 3.插入图片 上传图片并命名 \usepackage{float}导包\begin{figure}[H]&#xff1a;表示将图…

鸿蒙开发报错解决方案: cannot be smaller than version 10 declared in library [:library]

由于报错信息不详&#xff0c;即使给hvigor.js 提供--stacktrace 级别的日志也无法定位具体模块。 解决方案&#xff1a;修改编译源码js。 1、定位具体js&#xff1a;我的定位是&#xff1a;/Users/xdg/.hvigor/project_caches/489b334bc29a5a8428674c766cdae532/workspace…

智能边缘计算网关实现工业自动化与数据处理的融合-天拓四方

随着物联网&#xff08;IoT&#xff09;技术的迅速发展和普及&#xff0c;越来越多的设备被连接到互联网上&#xff0c;产生了海量的数据。如何有效地处理和分析这些数据&#xff0c;同时确保数据的安全性和实时性&#xff0c;成为了摆在企业面前的一大挑战。智能边缘计算网关作…

图像处理与视觉感知---期末复习重点(1)

文章目录 一、概述二、图像处理基础2.1 视觉感知要素2.2 像素间的一些基本关系2.2.1 相邻像素2.2.2 连通性2.2.3 距离度量 2.3 基本坐标变换2.4 空间变换与灰度值 一、概述 1. 图像的概念及分类。  图像是用各种观测系统以不同形式和手段观测客观世界而获得的、可以直接或间接…

百度AI已经实现盈利,普通人如何通过AI短视频直播拿到结果?

从百度最新的财报数据来看&#xff0c;百度AI为广告业务、智能云业务带来了增长动力。除了直接带来商业收入&#xff0c;AI还为百度带来了新增长。2023年&#xff0c;百度用户总数、用户时长及用户粘性、付费率等都有所增加。数据显示&#xff0c;2023年12月&#xff0c;百度Ap…

刚刚,OpenAI官方发文驳斥马斯克,自曝8年间邮件往来截图

文章开篇表示&#xff1a;「OpenAI 的使命是确保 AGI 惠及全人类&#xff0c;这意味着既要构建安全、有益的 AGI&#xff0c;又要帮助创造广泛的利益。我们正在分享我们在实现使命方面所学到的知识&#xff0c;以及有关我们与马斯克关系的一些事实。我们打算驳回马斯克的所有主…

Spring事务管理与模板对象

1.事务管理 1.事务回顾 事务指数据库中多个操作合并在一起形成的操作序列 事务的作用 当数据库操作序列中个别操作失败时&#xff0c;提供一种方式使数据库状态恢复到正常状态&#xff08;A&#xff09;&#xff0c;保障数据库即使在异常状态下仍能保持数据一致性&#xff…

Netty权威指南——基础篇5 IO基础 备份

1 什么是I/O 在UNIX世界里一切皆是文件&#xff0c;而文件是什么&#xff1f;文件就是一串二进制流而已&#xff0c;其实不管是Socket&#xff0c;还是FIFO&#xff08;先进先出队列&#xff09;、管道、终端。对计算机来说&#xff0c;一切都是文件&#xff0c;一切都是流。在…

JSP实现数据传递与保存

1.HTML页面转换JSP页面 直接再HTML页面最顶端添加page指令&#xff0c;修改文件后缀名&#xff1b;反之&#xff1b; 2.JSP内置对象 对象 描述 request 每当客户端请求JSP页面时&#xff0c;JSP引擎会制造一个新的request对象来代表这个请求。 response 当服务器创建req…

内存溢出(OOM)-汇总指南

目录 java.lang.OutOfMemoryError:Java heap space 原因分析 示例 解决方案 java.lang.OutOfMemoryError:GC overhead limit exceeded 原因分析 示例 解决方案 java.lang.OutOfMemoryError:Permgen space 原因分析 示例 解决方案 java.lang.OutOfMemoryError:Metas…

Learn C the hard way :一些简单问题处理

Preface&#xff1a;本次学习主要是以复习态度而来&#xff0c;意在加强C语言的理解&#xff0c;本文主要针对于网站中出现的一些问题 我的简单Makefile&#xff1a; CFLAGS-Wall cc gcc cflag -Wall -g allfiles ex1.c ex2.c ex3.c ex4.c ex5.c ex4-1.c objs $(allfiles:.c…

Claude 3击败GPT-4,地表最强AI易主,坐等翻车

北京时间3月4日晚22点00分&#xff0c;Claude 3发布了&#xff0c;一举超越了GPT-4&#xff01; 震惊&#xff0c;居然有人能超越霸主地位&#xff0c;赶紧进官网详细的看一下&#xff1a; https://www.anthropic.com/news/claude-3-family 刷到第一的成绩单 Claude3 Opus的…

MyBatis操作数据库(SQL注入)

本文主要来讲解6大标签&#xff0c;以便更好的MyBatis操作数据库&#xff01; <if>标签<trim>标签<where>标签<set>标签<foreach>标签<include>标签 前提需求&#xff1a; MyBatis是一个持久层框架&#xff0c;和Spring没有任何关系&…

java VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城 小程序商城搭建

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

Nodejs 第五十章(lua的基本使用)

lua基本使用 全局变量局部变量 全局变量是在全局作用域中定义的变量&#xff0c;可以在脚本的任何地方访问。全局变量在定义时不需要使用关键字&#xff0c;直接赋值即可。 xiaoman xmzsprint(xiaoman)局部变量是在特定作用域内定义的变量&#xff0c;只能在其所属的作用域…

腾讯云4核8G12M轻量服务器优惠价格446元一年,646元15个月

腾讯云4核8G12M轻量服务器优惠价格446元一年&#xff0c;646元15个月&#xff0c;180GB SSD云硬盘&#xff0c;2000GB月流量。 一张表看懂腾讯云服务器租用优惠价格表&#xff0c;一目了然&#xff0c;腾讯云服务器分为轻量应用服务器和云服务器CVM&#xff0c;CPU内存配置从2核…