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

Netflix正在搞的混沌工程到底是什么?终于有人讲明白了

导读:与任何新概念一样,混沌工程时常被误解。本文会探讨混沌工程是什么以及不是什么。

作者:Casey Rosenthal, Nora Jones

来源:大数据DT(ID:hzdashuju)

在Netflix的混沌工程实践之初,大家实际上并不明确这门学科究竟是什么。关于如何让服务更可靠存在着许多误解。比如那时经常听到这样一些口号——拔掉电缆、在生产环境搞破坏或在生产环境进行测试。另外,也几乎不存在混沌工程实际工具的例子。

Netflix成立混沌工程团队就是要创建一门有意义的学科。该学科能够借助工具主动提高可靠性。我们花了几个月的时间研究韧性工程和其他学科,并提出混沌工程的定义和蓝图以造福他人。

混沌工程的定义已经以宣言的形式上线,称为“混沌工程原则”。

https://principlesofchaos.org

01 混沌工程是什么

混沌工程原则定义了混沌工程学科,以便大家了解何时该进行、该如何进行以及该如何做好混沌工程。如今,混沌工程的通用定义是“促进发现系统弱点的实验”。混沌工程原则的网站概述了如下实验步骤:

  1. 首先定义“稳态”(steady state,稳定状态),以表示系统正常行为的某些可测量的输出。

  2. 建立如下假说—对照组和实验组都将持续这种稳态。

  3. 引入反映真实事件的变量,例如崩溃的服务器、发生故障的硬盘驱动器、断开的网络连接等。

  4. 试图通过在对照组和实验组之间寻找稳态差异来推翻这一假说。

该实验构成了混沌工程的基本原则,并为实验的实施提供了很大的自由度。

1. 实验与测试

在Netflix,我们发现首先必须要做出的澄清是,混沌工程是一种实验而非测试。可以说,“质量保证”涵盖了两者,但该词在软件行业通常具有负面含义。

最初,Netflix的某些团队会问混沌工程团队:“难道你们就不能编写一堆集成测试来发现同样的问题吗?”从理论上讲,这种观点是务实的。但实际上,不可能从集成测试中获得理想的结果。

严格来说,测试不会创造新知识。测试要求编写测试的工程师知道要验证的系统的特定属性。复杂系统对于这种类型的分析是不透明的。对于复杂系统中各个部件所有的潜在相互作用所带来的所有潜在副作用,人类根本就无法理解。这使我们得出了测试的下述关键特性。

测试会根据现有知识做出一个断言,然后执行测试,并给出该断言的结果(通常为真或假)。测试是关于系统已知属性的声明。

另一方面,实验创造了新知识。实验提出了一个假说,只要假说不被推翻,对该假说的信心就会增强。而如果假说被推翻了,那就会学到一些新东西。这就能启动一个调查,以弄清楚假说为什么是错的。

在复杂系统中所发生的事情的原因通常都不会是显而易见的。实验可以建立信心,也可以让我们学到系统的新属性。这是对未知的探索。

因为测试需要有人提前提出断言,所以仅凭测试是无法取得通过实验而收获的洞察的。实验引入了一种发现新属性的正规方法。而当发现了系统的新属性后,完全可以将其转换为测试。

实验还有助于将有关系统的新设想编码为新的假说,从而创建类似“回归实验”的实践,以便随着时间的推移而对系统做进一步探索。

由于混沌工程诞生于应对复杂系统问题,因此该学科必须体现实验性而非测试性。

2. 验证与清查

在运维管理和物流规划领域,验证(verification)和清查(validation)的定义是不同的。而混沌工程更偏重于验证。

  • 验证

复杂系统的验证是在系统边界分析输出的过程。比如房主可以通过测试水槽(系统边界)中的污染物,来验证水(输出)的质量,而无须了解管道或市政供水系统(系统部件)的功能。

  • 清查

复杂系统的清查是分析系统的各个部件并建立反映部件之间的相互作用的思维模型的过程。房主可以通过检查所有管道和基础设施(系统部件)来清查水质。这些管道和基础设施会采集、清洁和输送水(功能部件的思维模型),并将水输送到居民区中的千家万户。

这两种做法都是有用的,并且都可以建立对系统输出的信心。作为软件工程师,我们经常会偏向于强迫自己去深入研究代码,并验证代码是否反映了我们关于代码应如何工作的思维模型。与这种偏好相反,混沌工程极力主张进行验证而不是清查。混沌工程所关心的是某事是否有效,而不是如何工作。

请注意,在上面有关管道的隐喻中,虽然可以清查用于提供清洁饮用水的所有组件,但由于某些未曾想到的原因,最终水龙头里流出来的仍是被污染的水。在复杂系统中总是存在不可预测的交互。但是,如果验证水龙头流出的水是干净的,那么就不必操心水是如何来的。

在大多数业务案例中,比起考虑系统的实现是否符合我们的思维模型,系统的输出要重要得多。混沌工程更关心业务和输出,而不是正在互动的各个部件的实现或思维模型。

02 混沌工程不是什么

有两个概念经常和混沌工程混淆——在生产环境中搞破坏和反脆弱。

1. 在生产环境中搞破坏

在博客文章或会议演讲中,人们时常会将混沌工程描述为“在生产环境中搞破坏”。对于能从混沌工程中获益良多的大型企业以及其他复杂系统的运营者来说,尽管这句话听起来很酷,但对他们并没有吸引力。

有关混沌工程的一个更好的说法是:修复生产环境中的漏洞。 “搞破坏”很容易,但完成下述事情很难:减小爆炸半径,对安全性进行批判性思考,确定漏洞是否值得修复,决定是否应该进行实验,等等。

“搞破坏”可以用无数的方式来完成,且花费的时间也很少。但更大的问题是,在不知道系统部件已被破坏的情况下,该如何推测出哪些部件已经被破坏?

“修复生产环境中的漏洞”能更好地体现混沌工程的价值,因为整个混沌工程实践的重点是主动提高复杂系统的可用性和安全性。现在已经有很多对事故做出应急反应的学科和工具,比如告警工具、事故响应管理、可观测性工具、灾难恢复计划等。其目的是当事故发生后能缩短检测时间和修复时间。

有人可能会说,SRE(Site Reliability Engineering,网站可靠性工程)是一门兼具被动性和主动性的学科,可以通过从过去的事故中获得知识,并将知识进行社交化来防止将来发生类似的事故。而混沌工程是软件行业中唯一专注于主动提高复杂系统安全性的学科。

2. 反脆弱

熟悉纳西姆·塔勒布(Nassim Taleb)所提出的反脆弱性概念的人,经常会认为混沌工程本质上是反脆弱的软件版。塔勒布认为,诸如“低剂量毒物兴奋效应”之类的词,已不足以表达复杂系统的适应能力。因此他发明了“反脆弱”一词,指系统当受到随机压力时能变得更强的特性。

混沌工程和反脆弱之间一个重要的关键区别是混沌工程能教育系统维护人员,让他们认识到混沌为系统所固有,从而使他们成为一支更具韧性的团队。而相比之下,反脆弱却给系统加入混沌,并希望系统在响应混沌时能变得更强大,而不是屈服于混沌。

作为框架,反脆弱的观点与学术界所研究的韧性工程、人因学和安全系统都不一致。例如对于提高系统健壮性而言,反脆弱建议的第一步是寻找并消除弱点。这项建议看似直观,但韧性工程告诉我们,对于安全性而言,寻找做对的地方要比寻找做错的地方提供的信息要多得多。

反脆弱的下一步是添加冗余。这似乎也很直观,但是添加冗余既可以缓解故障,也可以导致故障。在有关韧性工程的文献中有众多冗余所导致的安全性故障案例。

这两种思想流派之间还存在许多其他分歧。韧性工程是一个有着数十年历史,并正不断发展的研究领域。而反脆弱则游离于学术界之外,且缺乏同行评审。因为两者都是要应对混沌和复杂系统,所以很容易就产生两者可以融合在一起的感觉。

但反脆弱实际上并不具备混沌工程所拥有的经验主义和理论基础。由此,两者在根本追求上就已分道扬镳。

关于作者:Casey Rosenthal,Verica公司的首席执行官兼联合创始人。他曾是Netflix公司混沌工程团队的工程经理,在使用分布式系统、人工智能以及将新颖的算法和学术界知识转化为能落地的模型方面拥有丰富的经验。

Nora Jones,Jeli公司的首席执行官兼联合创始人。她是一位敬业且充满自驱力的技术领导者和软件工程师,对分布式系统中人与软件的协同工作充满热情。她在2017年AWS re:Invent大会的主题演讲中为混沌工程运动的发起做出了贡献。

本文摘编自《混沌工程:复杂系统韧性实现之道》。

点击链接了解详情并购买


扫码关注【华章计算机】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 7月书讯(下)| 读书开启下半年

书讯 | 7月书讯(上)| 读书开启下半年

资讯 | 《数据安全法》表决通过!最新解读来了

书单 | 8本书助你零基础转行数据分析岗

干货 | 当机器学习遇上隐私保护,聊聊联邦学习和分布式机器学习

收藏 | 终于有人把卷积神经网络(CNN)讲明白了

上新 | 【新书速递】打通数据科学三要素——数据科学实战性手册

赠书 | 【第63期】机器人时代已来!推荐几本机器人学硬核好书

点击阅读全文购买

相关文章:

  • 一文了解滴滴与蚂蚁金服开源共建的SQLFlow
  • 详解数据资产的8大重要特征
  • 火到不行的零代码都在哪些行业应用?
  • 终于有人把生成对抗网络(GAN)讲明白了
  • 如何从数据分析这个卷王行当转型数据科学
  • 终于有人把p值讲明白了
  • 【新书速递】深入理解边缘计算
  • 【第64期】豆瓣9.8分,周志明的《凤凰架构》
  • 云原生架构应该怎么设计?
  • 【新书速递】实用安全多方计算导论
  • 架构师的角色期望
  • JavaScript 异步编程指南——你不知道的Promise前世Deferred
  • 《企业破局的34个锦囊》之领导者必备的技术思维
  • Kubernetes诞生日!为什么开发人员应该学习 Kubernetes?
  • SIGIR 2021大奖出炉!Salton奖授予UIUC翟成祥教授
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【个人向】《HTTP图解》阅后小结
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CODING 缺陷管理功能正式开始公测
  • ES6之路之模块详解
  • idea + plantuml 画流程图
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript的使用你知道几种?(上)
  • JWT究竟是什么呢?
  • oldjun 检测网站的经验
  • Python连接Oracle
  • 简析gRPC client 连接管理
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 怎么把视频里的音乐提取出来
  • 正则与JS中的正则
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 关于Android全面屏虚拟导航栏的适配总结
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #pragma预处理命令
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)JPA - JQPL 实现增删改查
  • (一)WLAN定义和基本架构转
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转) Android中ViewStub组件使用
  • (转)jQuery 基础
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 回调、接口回调、 委托
  • .net 使用ajax控件后如何调用前端脚本
  • .NET 药厂业务系统 CPU爆高分析
  • .NET连接数据库方式
  • .net网站发布-允许更新此预编译站点
  • /3GB和/USERVA开关
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)