
谈混沌工程就一定会提到Netflix的混沌猴(Chaos Monkey)。它是混沌工程领域的第一个工具,主要关注系统的基础设施。Netflix的服务放在亚马逊上。他们就需要考虑一个假设:当Web 服务(AWS)的 EC2 虚拟机停机时,如何用一种有计划而又随机的方式,探寻系统的反应。
为什么我们开始关注并试验混沌工程?有一个非常通用的理由:混沌工程能够帮助你找出一些不确定因素或者叫缺陷,从而确定有关系统弹性的假设在现实世界中成立。这个不确定因素或者缺陷也被称为“暗债(dark debt)”。
暗债很像信息安全里说的“漏洞”。漏洞是客观存在,但没有被利用和触发时都是安全的。平时处在静默状态,很难发现,不会直接妨害开发,但会在频繁的交互过程中不明就里地造成很多异常情况。
“任何足够复杂的系统都不可避免地带有让人意想不到的暗债,它会威胁系统的正常运转。暗债是现代软件系统逐步复杂化进程中的副产品。”
其实不管是否复杂,都会有暗债。暗债产生的原因有很多,而且也不仅局限于基础设施,包括:平台、应用程序、人员、实践和流程。只是复杂环境下,暗债更多,发生的更加意外和不可控。
混沌工程不仅仅适用“未知缺陷”这个暗债的解决,“已知缺陷”同样适用。只是我们对“已知缺陷”的知道程度需要有一个自知之明。如果不那么确定自己知道“已知缺陷”,那么可以借用混沌工程的试验来提供缺陷存在的证据,从“感觉到已知缺陷”转变为“已知缺陷的确存在”。
混沌工程是从问题开始,先设立一个假说作为基础,进而开展混沌工程游戏日或自动化混沌工程实验。最后从游戏日或混沌工程实验得到结论,即关于系统是否存在某些缺陷的一组观察记录,将之放入待改进清单。

那么问题来了:混沌工程是在临时环境里试验,还是在生产环境里试验?
当组织处于早期阶段时,建议是在安全系数更高、隔离性良好的临时环境或者测试环境里执行;当在生产环境中开展实验时,最好尽可能地限制其影响范围,这个范围称为爆炸半径(blastradius),从而避免在真实的生产环境中引发事故。
重点是,无论试验的爆炸半径多大,都不能保证百分百的毫发无损。
这句话是重点。在生产环境里做不到毫发无损,问题就出在这里!
也许在互联网公司不是问题,也许在分布式环境下问题也不大,但对于金融行业来说,这就是一个问题。
你可以说是文化使然,也可以说是系统复杂性使然,更可以说领导观念使然。
混沌工程如何让领导放心让你去做?知乎上提供了混沌工程试验的五个原则:
1.建立稳定状态的假设;
2.多样化现实世界事件;
3.在生产环境运行试验;
4.持续自动化运行试验;
5.最小化“爆炸半径”
扫了一眼,3是让领导最不放心的地方。
临时环境做试验,即使失控不影响安全稳定和用户体验,但难以证明生产环境真实存在这些缺陷;生产环境做试验,其结果的公信力不言自明,并能够促进系统弹性的改进,提高系统的健壮性。缺点就是结果有可能“太吓人了”!
混沌工程在生产环境里的试验就是一个结果和风险的权衡取舍问题。爆炸半径以及爆炸效果将决定领导对混沌工程的支持力度。不论你采用何种混沌工具都必须面对这个约束条件。
因此,混沌工程在某种意义上要解决的不是“对混乱状况下的整个社会技术系统建立信任、树立信心”,而是“让领导对混乱状况下的你建立信任,树立信心”!