专业书籍精读 · Chaos Engineering · 第 8 章
Chaos Engineering: System Resiliency in Practice · Ch 8 · Capital One · 2020
你刷卡买咖啡,一两秒后收银机「嘀」一声——背后是银行一整套系统。这一章讲的是:一家银行,怎么敢故意弄坏自己的系统来做练习?
银行和视频网站不一样。视频卡一下大家抱怨两句;银行出一次故障,有人付不了账,监管机构会来问话。所以「在生产环境里随便关机器」这句话,在银行听起来就像「故意制造事故」。Capital One 的答案不是「那就不做」,而是换一条慢一点、但每一步都留下证据的路。
没人第一天就把新手放上高速。先在驾校场地练,再去人少的路,最后才上高速;每一阶段都有教练签字,证明你练过、练得怎样。
银行做「故意弄坏系统」的练习也是这个顺序:先在测试环境练熟,把每次练习的结果都记下来,再拿着这些记录一步步申请靠近真实环境。签字本,就是监管和审计要看的东西。
银行原来的做法是「突击检查」:另一个团队不打招呼,悄悄弄坏点什么,看值班的人能不能发现、能不能修好。这能测出真本事,但有两个毛病:被测的人像在考试,挂了就挨批,没人愿意主动暴露问题;而且一年就搞那么几次,系统每天都在变,上次的结论很快就过期了。
好处是练习从「一年一次的大考」变成「每次发布都做的体检」,问题在上线前就被拦下;攒够了记录,才有底气去申请在真实环境里小范围地练。
一句诚实的代价:测试环境再像也不是真的——没有真实的人流和真实的高峰,有些毛病只有到了真实环境才会冒出来,所以「先在测试环境练」只是起点,不是终点。
在强监管行业做混沌,靠的不是胆子,是账本:先在测试环境把练习做成每次发布的例行检查,让每次练习自动留下记录,再拿记录一步步换取靠近真实环境的许可。
想进到具体机制、量级和示意图? → 切到精读版
你以为强监管意味着「不能做混沌工程」,其实监管要的东西——能扛住故障的证据——恰恰是混沌实验最擅长产出的。Capital One 的路线是三步:从外部团队突袭的盲测(blind resiliency testing),转向由应用团队自己写假设的混沌实验,再把实验嵌进 CI/CD 流水线,让每次发布都自动跑一遍、自动留痕。在这条路上,「先在非生产环境做」不是妥协,而是在攒取进生产的许可。
全书第 8 章,Part II「原则落地」的最后一篇。前面四家各自弯折了 Ch3 的五条原则:Slack 让位于人在回路、Google 放大到公司规模、微软解决排序、LinkedIn 把爆炸半径落到人。这一章是最受外部约束的那一种:原则三「在生产跑」被监管推到了最后一步。往后 Part III 转向人的因素,Ch16「持续验证」是本章「把混沌放进流水线」的终点形态。现实里它对着银行、支付、保险、医疗这类「出一次事要向外部交代」的团队。
先摆约束。银行系统的故障不只是体验问题:刷卡授权要在一两秒内给出结果,失败了就是有人在收银台前付不了钱;重大中断要向监管机构报告,每一次生产变更都要走变更管理、留审批记录。本书写作时 Capital One 正在把业务整体迁上公有云——依赖关系一下子变多、变新,团队凭经验已经说不清「哪个组件坏了会怎样」。
这时 Ch3 的原则三「在生产跑实验」会直接撞上制度:在一个每次变更都要审批的环境里,主动注入故障看上去就是故意制造事故。
不解决会怎样?两种退化。一是只做纸面演练:一年一两次灾备切换,按清单打勾,证明「我们有预案」,却证明不了「预案管用」——而系统每周都在变,上次的结论很快过期。二是没有授权就硬上:摇出一次事故,从此混沌工程在这家公司成了禁语。
所以这章的问题是:在「每一步都要能向外部交代」的约束下,怎么把混沌工程做起来、并一步步走向生产?
Capital One 的起点不是混沌工程,而是盲测:由另一个团队对某个应用注入故障,被测团队事先不知道时间和形式。它测的是三件事——告警会不会响、值班会不会接、预案(runbook)能不能用。
它有真价值:事先打招呼的演练,人人都提前坐在屏幕前,测不出真实的发现时延;盲测测得出。但它的结构性毛病也很清楚:
转折在于谁来提出假设。混沌实验由应用团队自己写:「当缓存层不可用时,交易查询的成功率仍保持在稳态范围内,只是变慢。」然后在受控环境里验证;假设被推翻,就是一个在上线前找到的缺陷。
这一步改变了三件事:所有权回到最懂系统的人手里;实验是可复跑的,而不是一次性的突袭;每次实验天然带着「假设—注入—观测—结论」四段式记录。最后这一点,正是监管行业最需要的东西——它是结构化的证据,而不是一份事后补写的报告。
本章最可操作的一步:把混沌实验做成流水线里的一个阶段。新版本部署到非生产环境之后,流水线按随代码入库的混沌配置(在哪个环境、注入什么、跑多久、什么算通过)自动注入故障,检查稳态假设;成立就放行,不成立就拦下、退回开发。
它解决的是盲测的两个毛病。频率:从一年几次变成每次发布都跑——系统在变,验证跟着变。证据:流水线本来就记录每一步的执行人、时间、版本与结果,实验结果写进同一条记录,审计员要的东西就不需要另写报告。
隐含的代价也要说:门禁上的实验必须稳定、可重复。一个时好时坏的实验挂在门禁上,几周之内团队就会学会绕过它——那比没有更糟,因为记录里写着「已验证」。
本章专门列了一组在受监管环境里设计实验的注意点,揉成四条判据:
工具。自建还是采购,本章给的是判据而不是答案:能不能覆盖你的平台与多层故障(基础设施、网络、应用)、能不能让团队自助、有没有护栏与一键中止、能不能接入流水线、能不能产出审计可用的记录。最后一条在监管行业是硬门槛。
团队。起步时由一个中心团队搭平台、定规范、陪跑前几次实验;规模化之后,实验的所有权必须回到应用团队——中心团队做不完、也不如他们懂系统。中心团队的终态是平台与教练,不是执行者。
布道。技术决定能不能做,文化决定有没有人做:把实验找到的缺陷讲成「上线前拦下的事故」,用演练日让人亲手试,把成功案例在公司内反复分享。混沌工程在银行最大的阻力不是工具,是「故意弄坏东西」这几个字带来的本能恐惧。
第一张表:受监管团队的几种起步方式,各测到什么、留下什么证据、付什么代价。
| 方式 | 测到什么 | 证据形态 | 风险 | 代价 / 局限 |
|---|---|---|---|---|
| 年度灾备演练 | 大切换能不能做通 | 演练报告、签字 | 低(有窗口、有预案) | 频率太低,结论随系统变化过期 |
| 盲测 | 真实的发现与响应时延 | 一次性成绩单 | 中 | 像考试,团队抵触;靠中心团队手工组织 |
| 非生产 · 假设驱动实验 | 降级、超时、自愈逻辑 | 结构化实验记录 | 零客户影响 | 负载与数据不真,规模类故障看不见 |
| 流水线内自动混沌 | 韧性是否随版本退化 | 每个版本一条 | 零客户影响 | 实验必须稳定,否则门禁被绕过 |
| 受控生产实验 | 真实负载下的行为 | 生产证据 | 有,需爆炸半径与自动中止 | 需要前几级的记录作担保才谈得上 |
非生产的两级不是「不敢进生产」,而是零客户风险地攒证据——这是在监管行业里换取第五行许可的唯一货币。
第二张表:团队结构怎么选。
| 结构 | 好处 | 代价 | 适用阶段 |
|---|---|---|---|
| 中心团队包办 | 规范统一,起步快 | 成为瓶颈;应用团队不长本事 | 前几次实验 |
| 各应用团队自理 | 最懂系统,可规模化 | 标准不一,证据格式乱 | 平台成熟后 |
| 中心平台 + 团队自有实验 | 平台、护栏、留痕统一;实验归最懂的人 | 需要持续布道与培训 | 多数受监管组织的终态 |
落到具体选择:
三句能直接改掉评审结论的话。一:监管不是混沌工程的反对者,而是证据的买家。二:非生产起步的价值不在安全,而在攒许可。三:把实验放进流水线,证据就不用另写。
面试被问「受监管行业怎么做混沌工程」:答「不能在生产做,所以只做灾备演练」是一个层级;答「从非生产的假设驱动实验起步,把稳定的实验挂上 CI/CD 门禁、结果自动进审计记录,再拿记录换取小爆炸半径的生产实验」是另一个层级——后者说明你知道这里的难点是许可,不是技术。
大厂实证
① 核心命题:监管要的是「能扛住故障」的证据,而混沌实验天然产出证据——强监管不是不做混沌的理由,而是要换一条路做。
② 约束:银行故障要上报、变更要审批,「在生产跑实验」看起来像故意制造事故,所以原则三被推到最后一步。
③ 起点盲测:外部团队突袭,测出真实的发现与响应;但它是考试、一次性、知识留不住。
④ 转折:由应用团队自己写假设,实验可复跑,并天然带着「假设—注入—观测—结论」的结构化记录。
⑤ 关键一步:把实验做成 CI/CD 的门禁,配置随代码入库;频率从一年几次变成每次发布,证据成了流水线的副产品。
⑥ 注意点:观测先于注入、事先通知运维与安全、先写中止与回滚、爆炸半径从小到大并绕开资金与客户数据。
⑦ 组织:中心团队搭平台、陪跑,终态是平台 + 教练,实验归应用团队;布道要把缺陷讲成「拦下的事故」。
⑧ 诚实的上限:非生产看不见规模类故障,不能当终点;门禁实验必须稳定,否则「已验证」的记录比没有更危险。