聊聊混沌工程

news2024/9/17 7:39:09

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

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

混沌工程是一门新兴学科,它不仅仅只是个技术活动,还包含如何设计能够持续协作的混沌实验。它由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 平台自动化。完全自动化进行的混沌工程,包括实验的创建、优先级排序、执行和推翻/终止。平台能够“自我反省”,只自动运行哪些对实验假说有可量化期望的实验。

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

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

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

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

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

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

相关文章

xgboost:算法数学原理

xgboost算法数学原理 1、求预测值 y^iϕ(xi)∑k1Kfk(xi),fk∈F,(1)\hat{y}_i\phi\left(\mathbf{x}_i\right)\sum_{k1}^K f_k\left(\mathbf{x}_i\right), \quad f_k \in \mathcal{F},\tag{1} y^​i​ϕ(xi​)k1∑K​fk​(xi​),fk​∈F,(1) F{f(x)wq(x)}(q:Rm→T,w∈RT)\mathca…

即时通讯开发常用加解密算法与通讯安全

平时开发工作中,我们会经常接触加密、解密的技术。尤其在今天移动互联网时代,越来越多的用户会将数据存储在云端,或使用在线的服务处理信息。这些数据有些涉及用户的隐私,有些涉及用户的财产,要是没有一套的方案来解决…

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

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

stylelint执行插件的全过程

stylelint可以用来扩展插件去实现各种规则,接下来带大家看看stylelint是如何执行插件的 首先遍历absoluteFilePaths路径(该路径是我们执行lint命令配置的文件类型eslint --cache --max-warnings 0 \"{src,mock}/**/*.{vue,ts,tsx}\" --fix&…

Spark RDD

RDD RDD 是构建 Spark 分布式内存计算引擎的基石,如 :DAG/调度系统都衍生自 RDD RDD 是对分布式数据集的抽象,囊括所有内存/磁盘的分布式数据实体 RDD/数组差异 对比项数组RDD概念数据结构实体数据模型抽象数据跨度单机进程内跨进程&…

GC简介和监控调优

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

ThreadLoca基本使用以及与synchronized的区别

文章目录1. ThreadLocal介绍1.1 官方介绍1.2 基本使用1.2.1 常用方法1.2.2 使用案例1.3 ThreadLocal类与synchronized关键字1.3.1 synchronized同步方式1.3.2 ThreadLocal与synchronized的区别2. 运用场景_事务案例2.1 转账案例2.1.1 场景构建2.1.2 引入事务2.2 常规解决方案2.…

k8s servelList(服务列表) 卡死不同步问题分析

提要容器集群版本情况:k8s 1.20客户端k8s client版本: 0.21事情是这样的,运行了一年的服务,突然有一天业务反馈服务使用异常,然后初步调查结果如下以下截图是网关异常以下截图是客户端zull(feign&#xff0…

依赖倒置DIP在系统架构中的应用

最近在对项目中的某一模块进行重构和功能的拓展。一直没想到好方法。 简单理解为: R项目 调用了 E项目的打印接口,但是E项目需要对R传来对数据传输对象DTO进行二次处理,甚至夹杂很多R项目的业务逻辑(去调用R项目的接口&#xff0…

代码规范书写说明

目录 一,命名风格 二、常量定义 三、代码格式 一,命名风格 (1)、不能够以下划线或者美元符号开始,也不能以下划线或者美元符号结束 反例:_name / __name / $name / name_ (2)、所…

春招进行时:“211文科硕士吐槽工资5500” HR:行情和能力决定价值

学历重要,还是能力重要? 春招进行时,不少学生求职遇冷,会把原因归结为学历水平不够高、毕业院校不够档次、专业不够热门、非一线城市就业机会少等等。 直到上海一位211大学的文科男硕士,吐槽招聘会提供的岗位薪资待遇…

10个实用技巧:如何让你的外贸独立站排名直线上升

在当今竞争激烈的互联网市场中,谷歌SEO已经成为了外贸独立站排名提升的必修课程。为了使得自己的网站能够在谷歌上排名更高,网站优化的工作显得尤为重要。 在这篇文章中,我们将分享10个实用技巧,帮助你的外贸独立站排名直线上升。…

【软件测试】接口测试总结

本文主要分为两个部分: 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与联系。但该部分只交代了怎么做和如何做?并没有解释为什么要做? 第二部分&#xff1…

java虚拟机栈解读

虚拟机栈出现的背景 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更…

【微信小程序-原生开发】实用教程11 - 用户登录鉴权(含云函数的创建、删除、使用,通过云函数获取用户的openid)

此篇可在实用教程10(见下方链接)的基础上继续开发,也可以在任何微信小程序中直接使用。 https://blog.csdn.net/weixin_41192489/article/details/128835069 用户登录鉴权逻辑 核心技术:通过云函数获取用户的openid 要想使用云函数…

网络层IP协议与数据链路层以太网协议

文章目录一、IP协议IP地址地址管理路由选择DNS二、以太网协议以太网帧MTU一、IP协议 IP协议是我们网络层的代表协议,今天我们就来一起学习一下吧,我们这里介绍的主要是IPv4协议。 版本:指定IP协议的版本,版本的取值只有4&#x…

如何使用ExchangeFinder在给定域中寻找Microsoft Exchange实例

关于ExchangeFinder ExchangeFinder是一款功能强大且使用简单的开源工具,该工具能够在给定域中尝试搜索指定的Microsoft Exchange实例,该工具的搜索机制基于Microsoft Exchange的常见DNS名称实现,并且能够识别指定的Microsoft Exchange版本&…

java基础之异常总结(自问自答版本)

1.errors和exception的区别是什么? 二者都是JAVA异常处理的重要子类,各自都包含大量子类 区别: exception:程序本身可以处理的异常,可以通过catch来进行捕获,遇到这种错误,应对其进行处理,使应用程序可以继…

大数据技术之Canal入门篇

大数据技术之Canal入门篇 文章目录大数据技术之Canal入门篇写在前面第 1 章 Canal 入门1.1 什么是 Canal1.2 MySQL 的Binlog1.2.1 什么是 Binlog1.2.2 Binlog 的分类1.3 Canal 的工作原理1.3.1 MySQL 主从复制过程1.3.2 Canal 的工作原理1.4 使用场景第 2 章 MySQL 的准备2.1 创…

作为产品经理,你都是怎样思考问题的?

作为产品经理,我们既不是产品的业务员更不是原型画师,而是伟大的创造者。用户对一个产品的评价可能只有好与坏,而作为产品工作者的我们必须有自己思考产品的视角,透过表现洞察本质。笔者根据自己有限的用户研究与产品设计的工作经…