当前位置: 首页 > news >正文

聊聊混沌工程

这是鼎叔的第五十四篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。

欢迎关注本专栏和微信公众号《敏捷测试转型》,大量原创思考文章陆续推出。

混沌工程是一门新兴学科,它不仅仅只是个技术活动,还包含如何设计能够持续协作的混沌实验。它由Neflix首先在实践中发现了混沌工程的商业价值,通过构建更有韧性的系统来抵御海量组件系统的意外失效。本文还会聊聊混沌工程的概念澄清,原则,投资回报和成熟度模型。

本文的内容参考了《混沌工程-复杂系统韧性实现之道》,作者是Casey Rosenthal,Nora Jones。

Neflix的混沌猴

Neflix的高绩效文化体现在管理层和技术人员的有趣协作,管理者不会告诉技术人员要做什么,而是确保他们了解要解决什么问题,并信任技术工程师,让他们决定工作的完成方式。

为了解决大型数据中心的实例无故消失问题,工程师尝试了各种方法,最终只有混沌猴这种方法保留下来。原理非常简单,遍历集群列表,从每个集群中随机选一个实例,在每个工作日的某个时间点将其关闭且不会发出警告。工程师只有解决了问题才能进行其他工作,不管是增加冗余,还是增加自动化容量伸缩,或是架构层面设计优化,都带来了可观的成效。

不幸的是,随机性混沌注入方法,在分布式系统上的效果都不好,故障的组合空间巨大,且并不孤立。随机方法也无法告诉我们实验的覆盖情况,应该进行多长时间才能得出结论。

替代随机搜索的方法,就是利用系统专家的领域知识来推动实验探索,利用之前实验观察形成新的假设并逐步完善。专家对故障注入进行筛选,决定哪些实验不需要进行,避免重复。专家还会决定实验的运行顺序,尽可能提高知识增加的速度。专家也需要可观测的基础设施,越丰富越好。

混沌猴后来升级为混沌金刚,使某个AWS区域关闭,验证AWS区域性故障的解决方案,大幅提升了组织内部对于故障的处理速度。后面即使发生多起停机事故,混沌金刚使用的区域故障转移机制都发挥了作用。

混沌工程由此被定义:它是分布式系统上进行实验的学科,目的是建立该系统能够承受生产环境的动荡条件的信心。不需要建立对系统的信心,就不需要混沌工程。

混沌工程通过提供可能超出“快乐路径”(即系统构建的默认路径,没有异常或错误情况)的各种条件和变化参数,来做到这一点。

如今混沌工程已经形成了强大的专业社区。

复杂系统

混沌工程这门科学要寻找系统存在弱点的证据,它们会隐藏在系统的本质复杂性中。复杂系统因为非线性导致不可预测,必然会导致不良结果。系统内的部件所发生的变化会导致系统输出发生指数级变化。输出难以模拟或建模,导致传统的探索系统安全性的方法不够充分。

复杂系统中,不同服务模块各自都有合理的设计决策和监控处理机制,但仍然会出现难以意料的崩溃。

比如场景一,少量用户的消息异常不断重试,可能导致服务降级,进而触发更大范围的重试风暴,导致服务不可用。

场景二,导入的程序库出现的内存泄漏,可能会随着服务请求数量的增加而缓慢增长,直到影响大量实例的错误率,导致局部停机。

面对复杂性,人月神话(聊聊没有35岁焦虑的《人月神话》)将其分类为偶然复杂性和本质复杂性,前者是在资源有限的项目中编写代码,必然产生各种债务-代码劣化、含糊的契约、废弃的代码路径、不清晰的变量名等。编写软件和理解软件如何失效,完全是两件不同的事情。

没有可持续的方法来解决偶然复杂性,甚至新系统会做得更加复杂。对于本质复杂性,只要添加新功能就会增加。

既然无法避免复杂性,那就接纳它,学会如何应对,而混沌工程就是最有效可行的利器。推荐两个应对复杂系统的模型。

一 动态安全模型

这模型有三个属性:经济性(投入的成本),工作量和安全性。工程师对成本和工作量有边界直觉,但是对安全性缺乏直觉。安全事故通常都是意料之外的,而工程师只会对能看到的地方进行优化。混沌工程就是培养工程师安全性直觉的,进而默默地改进行为,让系统更有韧性。

二 经济支柱模型

复杂性有四个经济支柱:状态,关系,环境,可逆性

一个研发组织控制某个支柱的程度,能反映出组织应对竞争性生产过程的复杂性的成熟度。一个汽车大厂可以控制产品状态(有限的款式),关系(上下游产业链的供货关系),环境(对外部法规的影响),但没法控制可逆性,汽车制造容易回退难。

一个应用程序的功能(状态)大多不断在增加,而无法简化。组件关系和人际关系都在复杂化。大多软件公司都没有影响环境的规模化能力。只有可逆性是软件团队可以大放异彩的支柱(即不断修改完善软件)。

而混沌工程实验能够揭示系统哪些方面违背了“可逆性”。

混沌工程的原则

混沌工程的通用解释,是“促进发现系统弱点的实验”,分为四个步骤

1 先定义“稳态”(steady state),系统行为正常时有哪些可以度量的输出

例如,在XXXX情况下,用户依然拥有良好的体验,表现在XXX数据上。

在XXX事件发生时,技术人员会得到XXX提醒。

2 建立假说,对照组和实验组都会持续这种稳态。

3 引入体现真实事件的变量。选择变量常见的误区是,工程师的选择标准经常是容易执行的,基于自身体验而不是用户体验的。有些“异常事件”在现实世界不太可能发生,这就不是好的引入变量。

4 通过在对照组和实验组之间寻找稳态差异来推翻假说

混沌工程原则提供了五项高级实践及黄金标准:建立稳态行为假说,多样化引入现实世界的事件,在生产环境实践,持续运行自动化实验,最小化爆炸半径

为了给真正关心的生产环境建立信息,高级的混沌工程都在生产环境发生,但是初始阶段先在准生产系统上实验也是有意义的。

自动化提供了规模化搜索的方法,比人手动操作,能覆盖更多的实验集;随着时间的推移能低成本地持续验证经验假设,及时发现系统的变化。

设计更安全的实验方法,将对生产环境中用户流量的负面影响降到最低,还带来加强信号检测效果的好处。

聚焦用户体验是所有高级原则的基础。

对混沌工程的常见误解

一 实验和测试是不同的

实验并不知道如何断言,而是通过假说的验证或推翻来得到新知识。源于应对复杂系统问题,所以混沌工程更多体现“未知的实验性”而非“已知的测试性”,主张验证有效性,而不是检查如何工作。

二 混沌工程并非人们误解的“搞破坏”

单纯搞破坏,很难做到减小爆炸半径,和漏洞的批判性思考。混沌工程最终的价值是修复生产环境的漏洞

三 很多人认为塔勒布的《反脆弱》理论和混沌工程在本质上是一样的。

实际上两个流派分歧很多,反脆弱缺乏软件工程学的同行评审和理论基础,给出的解决手段(如增加冗余)可能会带来更多风险。反脆弱希望给系统引入混沌,而混沌工程希望发现复杂系统的固有混沌。

四 软件接口设计不规范等问题能否通过混沌工程来发现

接口契约不匹配的协商解决,是开发过程的一部分,无需纳入混沌工程来解决,这些已知属性问题最好通过软件测试解决。混沌实验主要为不确定的自动化行为提供信心,它发现的BUG往往是多个细微逻辑错误的组合,以及时间相关性故障。

注意,被选定实验的特定服务及其依赖服务,如果存在已知的关键缺陷,要先修复后再进行实验,否则我们不能从实验中学到确定的新东西。

混沌工程的投资回报

只有事故真的发生了,才能有故事可讲。”-- John Allspaw

混沌工程是一门务实的学科,旨在为企业提供价值。但是如何证明混沌工程的回报是令人困惑的。

系统可用性指标的上升,是否应该归功于混沌工程实践呢?混沌工程触发的改进,倾向于给其他业务增加压力,比如牺牲了发布速度,那如何确定收益率呢?

Kirkpatrick模型提供了一种评估投资回报率的方法,原本用于教学培训领域,它把评估分解为四个递进的级别:反应(混沌工程示范对受训者有帮助,是否支持维持或加大该实验),学习(证明并列举团队学到了什么),转移(把知识转化为实践,发生了行为变化,提高了协作效率,提高了应急成熟度),结果(混沌工程的总成本,与商业结果价值进行比较)。每一级是否评价为积极,就展示了对应的投资回报。

混沌成熟度模型

成熟度模型横轴是采用度,纵轴是复杂性

“采用度”考虑这几个因素:接受者,参与者,采用门槛(是否有观测工具,积极讨论的共识,经得起考验的假说,一致的响应行动),采用障碍(业务的担心,合规性,从未发生过事故,难以衡量回报率)

“复杂性”,会随着实验的发展而提升,如下所示:

  • 1 Game Day,实践试水,复杂性低,但是消耗大量人力,无法在大量服务上规模化执行。

  • 2故障注入框架。工具可以让多个团队进行实验,进行更多跨功能性的学习。

  • 3 实验平台。满足更好实验的需求,在对照组和变量组进行安全对比,控制最小爆炸半径。每个实验都要被平台监控。

  • 4 平台自动化。完全自动化进行的混沌工程,包括实验的创建、优先级排序、执行和推翻/终止。平台能够“自我反省”,只自动运行哪些对实验假说有可量化期望的实验。

平台还可以进一步进行能力升级,如控制“混沌预算”,使用组合实验变量构建实验,自动修复漏洞。

被引入的实验变量也可以不限于基础设施层级,还可以是应用程序逻辑层的变量-比如给服务返回出乎意料的响应。

‍‍‍‍‍‍基于混沌成熟度绘制的表格,就可以看到本组织所处的位置,确定如何技术投资的路径,达到高复杂性与高参与度,让混沌工程创造最大的价值。

下一篇,我们详细介绍各大企业实践混沌工程的优秀流程,经验教训,人和组织的能力提升,从中学习到了哪些洞见。

相关文章:

聊聊混沌工程

这是鼎叔的第五十四篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。欢迎关注本专栏和微信公众号《敏捷测试转型》,大量原创思考文章陆续推出。混沌工程是一门新兴学科,它不仅仅只是个技术活动,还包含如何设计能够持续协作的…...

做为骨干网络的分类模型的预训代码安装配置简单记录

一、安装配置环境 1、准备工作 代码地址 GitHub - bubbliiiing/classification-pytorch: 这是各个主干网络分类模型的源码,可以用于训练自己的分类模型。 # 创建环境 conda create -n ptorch1_2_0 python3.6 # 然后启动 conda install pytorch1.2.0 torchvision…...

网络协议(九):应用层(域名、DNS、DHCP)

网络协议系列文章 网络协议(一):基本概念、计算机之间的连接方式 网络协议(二):MAC地址、IP地址、子网掩码、子网和超网 网络协议(三):路由器原理及数据包传输过程 网络协议(四):网络分类、ISP、上网方式、公网私网、NAT 网络…...

有趣的小知识(三)提升网站速度的秘诀:掌握缓存基础,让你的网站秒开

像MySql等传统的关系型数据库已经不能适用于所有的业务场景,比如电商系统的秒杀场景,APP首页的访问流量高峰场景,很容易造成关系型数据库的瘫痪,随着缓存技术的出现很好的解决了这个问题。 一、缓存的概念(什么是缓存…...

SpringCloud之服务拆分和实现远程调用案例

服务拆分对单体架构项目来说:简单方便,高度耦合,扩展性差,适合小型项目。而对于分布式架构来说:低耦合,扩展性好,但架构复杂,难度大。微服务就是一种良好的分布式架构方案&#xff1…...

mybatis: Invalid bound statement (not found): com.atguigu.dao.UserDao.save

问题描述: 1 问题实质: dao层(又叫mapper接口)跟mapper.xml文件没有映射 2 问题原因: 出现这种映射问题的原因分为低级原因和更低级原因两种 更低级原因: (1)dao层的方法和mapper.xml中的方法不一样; (2)mapper中的namespace 值 和对应的dao层entity层不一致 &…...

JavaScript 代码规范

所有的 JavaScript 项目适用同一种规范。JavaScript 代码规范代码规范通常包括以下几个方面:变量和函数的命名规则空格,缩进,注释的使用规则。其他常用规范……规范的代码可以更易于阅读与维护。代码规范一般在开发前规定,可以跟你的团队成员…...

6综合项目 旅游网 【6.我的收藏和收藏排行榜】

我的收藏分析先登录→拿到当前登录的用户信息,从数据库中获取uid和对应uid的rid集合→将rid集合信息展示到我的收藏前台代码判断用户是否登录,传递uid,通过uid查找其对应的rid集合当查询的属性涉及到多张表,则必须使用多表连接&am…...

openpnp - error - 微调mark点坐标后,更新板子其他原件其他坐标报错的变通方法

文章目录openpnp - error - 微调mark点坐标后,更新板子其他原件其他坐标报错的变通方法概述想出来一个变通的方法ENDopenpnp - error - 微调mark点坐标后,更新板子其他原件其他坐标报错的变通方法 概述 载入坐标文件后, 指定左下角远点坐标, 然后定位板子上的3个Mark点, 因为…...

借助ChatGPT爆火,股价暴涨又暴跌后,C3.ai仍面临巨大风险

来源:猛兽财经 作者:猛兽财经 C3.ai的股价 作为一家人工智能技术提供商,C3.ai(AI)的股价曾在2021年初随着炒作情绪的增加,达到了历史最高点,但自那以后其股价就下跌了90%,而且炒作情…...

蓝桥杯-数位排序

蓝桥杯-数位排序1、问题描述2、解题思路3、代码实现1、问题描述 小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。 例如, 2022 排在 409 前面, 因为 2022 的数位…...

【ES实战】ES 插件包离线安装(本地文件)

ES 插件包离线安装(本地文件) 文章目录ES 插件包离线安装(本地文件)使用安装命令安装直接解压式验证安装情况常用的分词插件analysis-ik analysis-pinyin analysis-dynamic-synonym 在集群的节点上分发插件的ZIP安装包 使用安…...

Spring的核心基础——IOC与DI

文章目录一、Spring简介1 Spring介绍1.1 为什么要学1.2 学什么2 初识Spring2.1 Spring家族2.2 Spring发展史3 Spring体系结构3.1 Spring Framework系统架构图4 Spring核心概念问题导入4.1 核心概念二、IOC和DI入门1 IOC入门问题导入1.1 门案例思路分析1.2 实现步骤1.3 实现代码…...

C++正则表达式基础

文章目录1. 查找第一个匹配的2. 查找所有结果3. 打印匹配结果的上下文4. 使用子表达式5. 查找并替换注意: .&#xff08;点&#xff09;在括号中没有特殊含义&#xff0c;无需转义用\转义。 1. 查找第一个匹配的 #include <iostream> #include <regex>using names…...

如何在网络安全中使用人工智能并避免受困于此

人工智能在网络安全中的应用正在迅速增长&#xff0c;并对威胁检测、事件响应、欺诈检测和漏洞管理产生了重大影响。根据Juniper Research的一份报告&#xff0c;预计到2023年&#xff0c;使用人工智能进行欺诈检测和预防将为企业每年节省110亿美元。但是&#xff0c;如何将人工…...

生态 | 人大金仓与超聚变的多个产品完成兼容认证

近日&#xff0c;人大金仓与超聚变数字技术有限公司&#xff08;简称“超聚变”&#xff09;完成了多款产品的兼容互认测试。测试表明&#xff0c;人大金仓KingbaseES V8数据库与超聚变服务器操作系统FusionOS、超聚变FusionOne基础设施完全兼容&#xff0c;人大金仓异构数据同…...

4自由度串联机械臂按颜色分拣物品功能的实现

1. 功能说明 本实验要实现的功能是&#xff1a;将黑、白两种颜色的工件分别放置在传感器上时&#xff0c;机械臂会根据检测到的颜色&#xff0c;将工件搬运至写有相应颜色字样区域。 2. 使用样机 本实验使用的样机为4自由度串联机械臂。 3. 运动功能实现 3.1 电子硬件 在这个…...

玩转结构体---【C语言】

⛩️博主主页&#xff1a;威化小餅干&#x1f4dd;系列专栏&#xff1a;【C语言】藏宝图&#x1f38f; ✨绳锯⽊断&#xff0c;⽔滴⽯穿&#xff01;一个编程爱好者的学习记录!✨目录结构体类型的声明结构体成员访问结构体传参前言我们是否有想过&#xff0c;为什么会有结构体呢…...

c语言指针怎么理解 第二部分

第四&#xff0c;指针有啥用。 比方说&#xff0c;我们有个函数&#xff0c;如下&#xff1a; int add&#xff08;int x){ return (x1); //把输入的值加1并返回结果。 } 好了&#xff0c;应用的时候是这样的&#xff1a; { int a1; aadd(a); //add函数返回的是a1 //现在 a等于…...

GC简介和监控调优

GC简介&#xff1a; GC(Garbage Collection)是java中的垃圾回收机制&#xff0c;是Java与C/C的主要区别之一&#xff0c;在使用JAVA的时候&#xff0c;一般不需要专门编写内存回收和垃圾清理代 码。这是因为在Java虚拟机中&#xff0c;存在自动内存管理和垃圾清扫机制。 什么…...

Understanding The Linux Kernel --- Part2 Memory Addressing

内存寻址 操作系统自身不必完全了解物理内存&#xff0c;如今的微处理器包含的硬件线路使内存管理既高效又健壮&#xff0c;所以编程错误就不会对该程序之外的内存产生非法访问 x86如何进行芯片级内存寻址Linux如何利用寻址硬件 x86 三种不同的地址术语 逻辑地址 逻辑地址…...

前后端分页查询好大的一个坑(已解决)

前言&#xff1a;如果你在做前后端的分页查询&#xff0c;找不到错误&#xff0c;请你来看看是否是和我一样的情况&#xff1f;情况&#xff1a;做了一个前后盾UI的项目&#xff0c;有一个页面是查询系统日志&#xff0c;要进行分页查询&#xff1b;第一页的&#xff1a;第5页的…...

Python批量执行读取ini文件和写入ini文件时,性能比较低怎么办,给出解决方案和源码

Python批量执行读取ini文件和写入ini文件时&#xff0c;性能比较低怎么办&#xff0c;给出解决方案和源码 解决方案&#xff1a; 使用ConfigParser的缓存机制&#xff0c;可以避免频繁读取ini文件造成的性能问题。 将ini文件转换为json格式&#xff0c;使用json库进行读写操作…...

微机原理与接口技术 汇编语言程序设计DOS常用命令

OS&#xff08;磁盘操作系统&#xff09;命令&#xff0c;是DOS操作系统的命令&#xff0c;是一种面向磁盘的操作命令&#xff0c;主要包括目录操作类命令、磁盘操作类命令、文件操作类命令和其它命令。 使用技巧 DOS命令不区分大小写&#xff0c;比如C盘的Program Files&…...

4.ffmpeg命令转码规则、过滤器介绍、手动流map选项

在上章我们学习了ffmpeg命令行帮助以及选项查找 本章我们来深入学习ffmpeg命令转码规则、过滤器介绍、手动流map选项 参考链接: 1.ffmpeg命令行转码流程 ffmpeg命令行转码流程如下图所示: 对应中文则是: 步骤如下所示: ffmpeg调用libavformat库(包含解复用器)来读取输入文件…...

【python】标准库详解

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录Standard Library简介python内置对象如何安装发布第三方模块10最好用的模块汇总包的本质datetime模块案例Math模块random模块OS模块sys模块time模块总结自定义模块标准库模块用help查看time模块常用第三方库…...

Golang Map原理(底层结构、查找/新增/删除、扩缩容)

参考&#xff1a; 解剖Go语言map底层实现Go语言核心手册-3.字典 一、Go Map底层结构&#xff1a; Go map的底层实现是一个哈希表&#xff08;数组 链表&#xff09;&#xff0c;使用拉链法消除哈希冲突&#xff0c;因此实现map的过程实际上就是实现哈希表的过程。 先来看下…...

Java_数组

数组 1.概念 ​ 需求&#xff1a;现在需要统计软件技术1班47名同学的成绩情况&#xff0c;例如计算平均成绩、最高成绩等。如果只能使用变量的话&#xff0c;那么需要定义100个变量&#xff0c;这样就比较复杂了。这时我们就可以使用数组来记住这47名同学的成绩&#xff0c;然…...

list与vector的区别

相信大家已经学过list与vector&#xff0c;关于它们的不同&#xff0c;我做了一些总结&#xff0c;如下表&#xff1a; vector list底层结构动态顺序表&#xff0c;一段连续的空间带头结点的双向链表随机访问支持随机访问&#xff0c;访问某个元素的效率…...

【C++、数据结构】位图、布隆过滤器、哈希切割(哈希思想的应用)

文章目录&#x1f4d6; 前言1. 位图1.1 海量数据处理思路分析&#xff1a;1.2 位图的具体实现&#xff1a;1.3 用位图解决问题&#xff1a;应用一&#xff1a;应用二&#xff1a;应用三&#xff1a;2. 布隆过滤器2.1 布隆过滤器的概念&#xff1a;2.2 布隆过滤器的测试&#xf…...

wordpress日主题官网/腾讯会议付费

...

资讯类网站建设/百度广告联盟

1 使用&#xff1a; 一直以来习惯了使用printf函数&#xff0c;但是对于可变参数没有深入研究过&#xff0c;觉得可变参数是一个神奇的技术^0^。。。工作闲下来的时候&#xff0c;想研究研究看可变参数的使用和原理。目前C提供的可变参数的申明为void function(const char *for…...

美女教师做爰网站/多地优化完善疫情防控措施

引言 前面Android开发之旅&#xff1a;环境搭建及HelloWorld&#xff0c;我们介绍了如何搭建Android开发环境及简单地建立一个HelloWorld项目&#xff0c;本篇将通过HelloWorld项目来介绍Android项目的目录结构。本文的主要主题如下&#xff1a; 1、HelloWorld项目的目录结构 1…...

网站每月流量/东莞做网站优化

2019独角兽企业重金招聘Python工程师标准>>> class Person_Tbl(models.Model): 定义人物类 name models.CharField(max_length254,default) #姓名 sex models.CharField(max_length125,default) …...

网络营销平台搭建方案网站/网页广告调词平台多少钱

1. 概述 最近开始学习自定义View&#xff0c;看到现在公司项目上的一个动画效果&#xff0c;顿时想到其实可以自己画&#xff0c;于是就开始着手优&#xff08;zhuang&#xff09;化&#xff08;bi&#xff09;这个动画。 动画如下&#xff1a; 其实很简单对不对&#xff0c;但…...

学网站建设能赚钱吗/百度云盘网页版

精品站长网交易系统源码&#xff0c;虚拟交易网站程序源码&#xff0c;虚拟交易平台带店铺处罚商品处罚。带申诉功能&#xff0c; 带提现通知功能&#xff0c; 带熊掌号推送功能&#xff0c; 带站内信息功能。 php5.2mysql5.6 压缩包内有详细的搭建教程 不知道是不是小子电脑…...