专业书籍精读 · Chaos Engineering · 第 14 章
Chaos Engineering: System Resiliency in Practice · Ch 14 · Open Minds, Open Science, and Open Chaos · 2020
你每天刷的购物、视频、打车软件,背后都有一群工程师在「故意把系统弄坏一点」,好提前找到隐患。这一章问的是:他们找到的那些坑,该不该告诉别人?作者的答案很干脆:该,而且要像科学家发表实验那样讲清楚。
同一家公司里,三个团队可能在三个月里踩进同一个坑:都忘了给某个慢服务设「等多久就放弃」。每个团队都很努力,各自修好,各自写了份没人看的总结。坑本身不难,难的是消息没流动。
作者借了科学界的老规矩:一篇好论文要写清你猜会发生什么、你做了什么、实际发生了什么,让别人能照着重做一遍、挑你的错。搬到故障演练上就是三件事:
一个团队花一周踩出来的坑,别的团队读五分钟就能绕开;被很多人重做过的结论,也比一家之言可信得多。起步不用一步到位:先在公司内部把卡片共享起来,再考虑对外讲。
一句诚实的代价:公开要花写作的功夫,有些细节(比如安全漏洞)也确实不能马上说。
坑踩一次就够了:把故障演练写成别人能照着重做的实验卡片,把结果像科学发现一样分享出去。
想看一张「可复现」的实验卡片该写哪些字段、开放到哪一层合适、开源工具生态怎么来的? → 切到精读版
你以为混沌工程的产出是「修好了几个漏洞」,其实最值钱的产出是知识——而知识只有在流动、能被别人复现和挑错时才会增值。本章主张把科学界的开放规范搬进混沌工程:协作的心态、开源的工具、可复现的实验设计、可分享的结果。
全书第 14 章,属于 Part IV「商业因素」,由当时在 Gremlin 任首席 SRE 的 Tammy Bütow 执笔。上一章 Ch13 讲怎么证明混沌工程值钱,这章讲怎么让这份价值溢出单个团队;下接 Ch15 成熟度模型,其中「采用度」那一维正是这里讲的扩散。
前面十几章讲的都是「怎么做好一次实验」。可一个中等规模的公司,可能有几十个团队、上百个服务,各自做实验。如果每个团队的发现只留在自己的周报里,会出现三种浪费:
不解决的后果是:混沌工程停留在「少数英雄团队的手艺」,组织层面的韧性并没有随实验次数线性增长。
本章起手是心态问题。一个团队发现「我们的服务扛不住依赖超时」,第一反应常是藏——怕被看成工作没做好,或者觉得是内部家务事。作者把这种封闭心态和协作心态对比:后者把每个被推翻的假设当作组织的共同资产,主动邀请其他团队来看、来问、来挑错。
这和全书反复强调的「不追责(blameless)」一脉相承:如果暴露弱点会被惩罚,人们就会停止暴露弱点,混沌实验就只剩下表演。开放的前提是安全——先保证说出「我们错了」不会受罚,分享才会发生。
混沌工程从一开始就自称「实验的学科」:定义稳态、提出假设、注入真实世界的事件、尝试推翻假设。作者顺着这个自我定位往前推一步——既然是科学方法,就该接受科学的开放规范:方法要公开、条件要写清、结果要能被别人复现和评议。
科学界的开放科学运动主张公开方法、数据和结果,理由很朴素:一个结论被独立重做过,才算真正立住;封闭的结论,错了也没人能发现。混沌实验面临一模一样的问题——一次实验只是一个样本,换个时间、换个流量形态、换个依赖版本,结论可能就变了。
第二层开放是工具。混沌工程的工具本身就有一个特殊的信任难题:你要允许它在生产环境里搞破坏。闭源的注入工具,你不知道它到底改了什么网络规则、杀了哪些进程、失败时会不会残留;开源让这些行为可审查。再加上社区贡献,各种注入方式(实例、网络、容器、云服务 API)不必每家重写一遍。
这条路的起点很具体:Netflix 在 2012 年把 Chaos Monkey 开源,之后注入工具陆续以开源形式出现。开源也把「实验格式」标准化的可能性带了进来——当实验能写成声明式文件,它就成了可以分享、版本管理、代码评审的东西。
第三层,也是本章最可操作的一层:实验本身要写成可分享的形态。一句「我们测了断网」没有信息量;能被复现的实验描述,至少要回答下面这些问题:
这张卡片的上半部分是设计:别人拿去就能在自己的系统上重做。最常被漏掉的是环境与版本——同样的注入,换一个依赖版本或一个流量高峰时段,结论可能相反。没有这一行,「复现失败」时你分不清是系统变了还是实验变了。
卡片的下半部分是结果。作者强调结果要写成别人读得懂、用得上的形态:原本的假设是什么、是否被推翻、看到的现象、推断的原因、做了什么改进、改进后有没有复验。尤其要分享失败的实验——「假设成立、一切正常」的结果同样有价值,它告诉别人这条路径已经验证过。
分享的受众可以分层:先是团队内,再是全公司(例如一个可搜索的实验库、定期的分享会),最后是对外(技术博客、会议演讲、开源的实验模板)。每往外一层,被挑错的机会就多一层,结论也就更硬一分。
开放不是越多越好,权衡在于复用和评议的收益对比写作成本和暴露风险。
开放到哪一层:收益与代价
| 开放层级 | 收益 | 代价 / 风险 | 适用 |
|---|---|---|---|
| 仅团队内 | 零额外成本,可以畅所欲言 | 知识困在边界内,别的团队重复踩坑 | 刚起步、实验还不稳定时 |
| 公司内共享库 | 跨团队复用,同类问题一次修全 | 要统一卡片格式、要有人维护索引;依赖不追责文化 | 多数组织的主战场 |
| 开源工具与实验模板 | 行为可审查,社区贡献注入能力 | 维护负担;项目会老化甚至停更 | 工具成熟、有通用性时 |
| 对外公开结果 | 行业级同行评议,招聘与声誉 | 可能暴露架构与安全细节,需审核与脱敏 | 结论已复验、细节可脱敏时 |
工具怎么选:开源、商业还是自研
| 路线 | 优势 | 代价 |
|---|---|---|
| 开源工具 | 代码可审查,实验格式可分享,免授权费 | 运维与安全护栏要自己补;社区活跃度不稳定 |
| 商业平台 | 开箱即用,中止、权限与审计通常现成 | 费用;实验格式可能绑定厂商,难以与外部分享 |
| 自研 | 贴合内部架构,可做到请求级注入 | 成本最高;没有外部评议,最容易变成封闭孤岛 |
判据:先把公司内的卡片格式和共享库做起来,这一层投入小、复用收益最大;工具尽量选格式开放的,以后才能和外部交换实验;对外公开留给已复验、可脱敏的结论。
这章看似是「文化篇」,落到工程上却很具体:实验即代码。当实验写成声明式文件,它就能进版本库、走代码评审、在流水线里重放——这正是 Ch16「持续验证」的前提。面试被问「怎么在组织里推广混沌工程」,好的回答不是「多做实验」,而是「统一实验格式、建共享库、复盘不追责、结论可复现」。
数据库领域有一个开放科学的标杆:Jepsen 项目(开源仓库自述「Breaking distributed systems so you don't have to」)对分布式数据库做故障注入测试,并公开发布测试代码与分析报告,不少厂商据此修复缺陷、改写文档里的一致性承诺——这正是「可复现 + 公开评议」能产生的外部压力。(Ch19 讲数据库混沌时会再遇到这类方法。)
大厂实证
① 混沌实验最值钱的产出是知识,知识只有流动起来才增值。
② 封闭的代价:重复踩坑、结论不可复现、工具重复造。
③ 开放的前提是不追责:说「我们错了」不受罚,分享才会发生。
④ 混沌工程自称科学方法,就该接受科学的开放规范:方法公开、可复现、可评议。
⑤ 工具开源让「在生产里搞破坏」的行为可审查,并让实验格式有机会标准化。
⑥ 一张可复现的实验卡片:稳态、假设、注入强度、爆炸半径、中止条件、环境版本、结果、改进。
⑦ 「环境与版本」最常漏写,却决定复现失败能否被解读。
⑧ 开放分层推进:团队内 → 公司共享库 → 开源 → 对外公开,主战场在公司内。
⑨ 实验即代码,是走向持续验证(Ch16)的前提。