软件服务于人类的历史,历经了从单机软件在本地运行,到复杂系统通过网络提供服务的发展历程。软件的功能和质量每向前发展一步,都伴随着更多新的组成部分的加入。为了更好地服务于更多用户,进行规模更大、更复杂的运算,软件系统的能力需要不断进化升级,小型软件开始一步一步演化发展为大型分布式复杂系统。在软件系统变强的同时,越来越多的组成部分被加入系统,复杂性也在随之逐步增加。
每个软件从业者从写下第一行代码开始,就一刻不停地在和软件中的错误做斗争。开发和维护(修复缺陷、确保资源充足等保障软件运行的活动)是一对伴随软件运行而产生的双生子。热爱从零到一开发软件是开发者的天性,看着自己编写的软件完美运行,为其他人提供服务,一直是驱动开发者前进的动力。为了更快更好地开发软件,我们不断改进开发方法和软件架构,但是开发者在使用新的方法和更复杂的架构时,往往会低估潜在的风险。
近年来,随着系统架构逐渐向微服务架构演化,开发效率以及系统扩展性大幅提高。但同时,系统的复杂性也随之逐渐增长到了一个拐点,传统的测试方法已经不能全面理解和覆盖系统所有可能的行为,测试的有效性被大打折扣。我们通过各种测试、SRE、DevOps、金丝雀发布、蓝绿部署、预案、故障演练等方法,希望能够防患于未然。但服务规模不断增长,服务之间的依赖性所带来的不确定性也呈指数级增长。在这样的服务调用网中,任何一环出现的正常或异常的变化,都有可能对其他服务造成类似蝴蝶效应一般的影响。
软件系统自身复杂度的激增、开发者在引入复杂性的同时对风险的低估和忽视,是系统可用性面临的两大挑战。
为了应对这两大挑战,Netflix 选择了一条不同寻常的路。从混乱猴子开始,Netflix 为应对不确定性的领域带来了一种全新的思维方式——主动出击。这种主动出击的思维方式衍生出的一套实践方法,被称为混沌工程(Chaos Engineering),它旨在从根本上改变开发者应对软件缺陷和故障的思维方式。在此之前,我们期望通过一系列的测试验证手段,尽最大的可能确保在线上运行的系统没有缺陷和故障。而混沌工程的理念认为这既不现实,也不符合系统自然发展的规律。混沌工程提倡我们首先要正面接受系统一定会存在缺陷,并且一定会时不时地发生故障的事实;然后,要求我们通过一系列实验找出可能发生问题的风险点,进而在不断加固系统的同时,促使开发者在开发软件时必须选择将防御性内建在系统中。
混沌工程的理论,建构于塔勒布在《反脆弱》一书中所阐述的思想之上,即系统如何在不确定性中获益。在接受“系统越复杂,越脆弱”的事实之后,让系统在每一次失败中获益,然后不断进化,这是混沌工程的核心思想。在实践中,混沌工程提倡用一系列实验来真实地验证系统在各类故障场景下的表现,通过频繁地进行大量实验,既使得系统本身的反脆弱性持续增强,也让开发者对系统越来越有信心。这个信心同时也是系统高速迭代,占尽市场先机的一个前提因素。
各个行业都涌现出了很多基于混沌工程应对上述两大挑战的实践案例。译者所从事的汽车金融行业是一个长链条,重流程,涉及获客、风控、审批、资金流转、贷后管理等多个环节的复杂业务体系。任何差错都有可能造成故障及问题数据的蔓延,轻则导致各种程度的业务不可用,重则可能会造成重大资损(资产损失)。传统的各类方法已经无法保障这样一个大规模系统的可用性和正确性,因此我们在2018 年下半年开始采用混沌工程的思想,实践了若干方法,目前看来已经初见一些成效。在混沌工程原则的指导下,我们为实施线上实验开发了实验组的控制功能,从而可以将线上实验的影响控制在最小的范围,即最小化爆炸半径。这为我们在线上放心进行实验提供了基础保障。举一个线上实验的例子:我们通过切断对第三方存储服务的依赖,验证了备用存储服务是否能够无缝接管。第一次执行实验的时候,我们发现虽然在移动端上传的图片可以成功存储在备用存储空间里,但是在业务链条的末端有个别读取服务却没有能够正确地从备用存储空间中获取到该图片。实验只影响了一小部分流量,快速修复后,实验可以进一步在满流量的情况下运行。接下来,通过每天自动运行这样的实验,我们可以确保任何后续对系统的变更都不会引入新的系统行为盲点。因为我们会每天自动运行大量实验,开发者不得不在编码时思考“我的代码如何在这些混沌实验场景下存活下来”,并逐步提高质量,形成正向循环。
混沌工程目前还是一个新兴的学科,它为软件工程行业带来了全新的思维方式。相信越来越多的实践和工具,会一步步释放这个学科的能量,吸引更多的实践者。团队或组织可以在任何时间点引入混沌工程的理念,这是一门实践性的学科,所以现在就和我们一起,开启你的混沌之旅吧!
本文选自全球唯一一部Chaos Engineering著作《混沌工程:Netflix系统稳定性之道》,出自运维界第一标杆Netflix公司混沌工程团队创始人之手。Netflix致力于通过混沌自动化平台(ChAP)、混沌猴子和FIT等一系列弹性计划确保高可用性。混沌大潮同样在国内席卷而来,在下行左转驶入阅读原文前,让我们再细细品味一下阿里巴巴高可用架构团队高级技术专家、开源项目ChaosBlade 发起人周洋(花名中亭)在为本书所作序文中的精彩论述吧——
减少问题的最好方法就是让问题经常性地发生,通过不断重复失败过程并找出解决方案,来持续提升系统的容错能力和弹性。混沌工程作为一门新兴学科,还处于一个定义和被定义的过程。如果你对混沌工程感兴趣,愿意去了解和实践混沌工程,非常推荐你从阅读本书开始行动。