你有没有想过,一支疫苗是怎么从实验室的几只小白鼠,一步步推广到全人类身上的?科学家绝不会直接给十万人扎针,而是先用量杯和记录表锁定小白鼠的“正常体温”,再在几十人身上试,确认安全后扩大到几百人、几千人,每一期都严格评估不良反应,稍有异常就立刻叫停。混沌工程——也就是故意往系统中“扎针”来验证它是否强壮的实践——用的正是同一套逻辑。本文要讲的,就是这套逻辑里两个最核心的旋钮:稳态假设与爆炸半径控制。前者回答“什么是正常”,后者回答“故障最多能波及多大范围”。理解了它们,你就能像疫苗科学家一样,在让系统“感冒”之前,先想清楚如何判定它是否真的健康。

岗位关联

对 AI 从业者的价值:这是混沌工程与 SRE 领域最核心的思维框架,掌握它,你就能安全地验证系统韧性,在故障发生前发现盲点,成为团队中“既敢炸又收得住”的可靠性专家。

目录
  1. 可视化演示
  2. 稳态假设——给系统先做“健康体检”
  3. 指标选取——选对“体温计”
  4. 验证方法——用对照组说话
  5. 爆炸半径——把故障圈在可控范围
  6. 渐进编排——从小白鼠到千万人
  7. 自动化闭环——自动监测与中止
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示稳态假设的观察假设实验分析验证闭环、爆炸半径按环境分级限制影响范围、以及从小范围到全链路的渐进式实验编排。

本节配有交互动效(进入视口后自动加载,约 3KB)。

稳态假设验证闭环 观察正常状态提出韧性假设 设计实验验证假设并分析迭代 Obs→Hyp→Exp→Ana 将混沌注入从随机转为系统验证

稳态假设——给系统先做“健康体检”

在疫苗临床试验中,第一步不是急着给小白鼠扎针,而是先记录每只小白鼠的体温、食欲、活动量。只有知道“正常”长什么样,才能在注射后判断疫苗有没有打破平衡。试想,如果连正常体温区间都不清楚,你怎么能说小白鼠发烧了?这正是混沌工程里“稳态假设”的意义:在注入故障之前,先把系统的健康状态量化成一串可以测量的指标。

混沌工程中的稳态假设,就是实验开始前对系统正常行为的预期。它通常写成一组带阈值的指标,例如“支付接口成功率 ≥ 99.9%”、“下单 P99 延迟 ≤ 800ms”。混沌实验的所有后续工作,都围绕“注入故障后,这些指标是否还在阈值之内”展开。如果还在,说明系统经受住了扰动;如果突破了,说明系统的韧性存在盲区。

稳态假设最常见的量化方式是 SLO(Service Level Objective),即服务应该达到的目标水平。计算方式是把一段时间的成功请求数除以总请求数,再换算成百分比。SLO 不是越高越好,也不是监控告警的一个普通阈值;它是混沌实验的“裁判标准”——提前定好,实验结果才有可比性。

回到疫苗试验的类比:如果小白鼠的体温在注射后始终落在预设的“健康范围”里,我们就认为疫苗没有破坏稳态。同理,一个服务只要在故障注入后仍能满足自己的 SLO,就说明系统的韧性设计是达标的。稳态假设做得好,混沌实验才可信。

SLO=成功请求数总请求数×100%\displaystyle \text{SLO} = \frac{\text{成功请求数}}{\text{总请求数}} \times 100\%
通俗解释:SLO 回答一个简单问题——在 1000 个请求里,至少有多少个应该成功,才算系统“没出毛病”。
  1. 分子成功请求数:统计在观测窗口内返回正常结果的请求数量,它是衡量健康程度的核心数值。
    成功请求数\text{成功请求数}
  2. 分母总请求数:所有发往被测系统的请求总量,无论成功失败都计入,它决定了比例的统计范围。
    总请求数\text{总请求数}
  3. 比例乘以 100%将比值换算成百分比形式,方便与 SLO 预期值(如 99.9%)直接对比。
    ×100%\times 100\%

指标选取——选对“体温计”

疫苗试验中,研究者测量体温、白细胞和心率,而不是毛色光泽或尾巴长度——因为前几个指标才是“健康”的直接信号。混沌实验也一样,稳态假设的质量取决于指标选取。如果选了一个与用户体验无关的指标,实验结果再漂亮也没有意义。

业界最常用的“体温计”是四大黄金信号:延迟(Latency)、流量(Traffic)、错误(Errors)和饱和度(Saturation)。延迟告诉你请求快不快;流量告诉你系统正在承受多大压力;错误告诉你请求失败比例;饱和度告诉你资源还有多少余量。这四类信号都能从用户体验的角度反映系统是否“活着”。

在黄金信号之外,还必须补充业务指标和用户视角指标。比如电商系统要关注下单成功率、订单金额趋势;内容平台要关注首屏渲染时间。业务指标决定实验的商业意义,黄金信号决定实验的技术可观测性,两者结合才是完整的稳态假设。指标并不是越多越好,选取的原则是可实时获取、可自动计算、与用户价值强相关。

就像疫苗试验中既要看体温也要看免疫应答,混沌实验也不只看一两个指标。选择正确的“体温计”,稳态假设才有判断力;选错了,你可能会像忽略尾巴毛色那样,忽略真正致命的系统问题。

错误率=错误请求数总请求数×100%\displaystyle \text{错误率} = \frac{\text{错误请求数}}{\text{总请求数}} \times 100\%
通俗解释:错误率是四大黄金信号里最直观的一个——100 个请求里有多少个失败,它就是多少。
  1. 分子错误请求数:记录请求处理失败的次数,它和成功请求数互补,共同描述系统质量。
    错误请求数\text{错误请求数}
  2. 分母总请求数:与 SLO 公式相同的统计基础,保证错误率在同一尺度下可比较。
    总请求数\text{总请求数}
  3. 乘以 100% 转为百分比把比率标准化,让团队能直接和“错误率 < 1%”这样的目标对照。
    ×100%\times 100\%

验证方法——用对照组说话

疫苗试验不会只给一只小白鼠打疫苗,然后凭感觉说“它看起来还行”。严谨的做法是把小白鼠随机分成两组:一组注射疫苗,一组注射安慰剂(对照组),然后比较两组的发病率。混沌实验同样需要对照组,否则你无法判断指标变化到底是故障注入引起的,还是正常的业务波动巧合。

验证稳态假设的标准流程是:先做前置测量(记录未注入故障时的基线指标),再注入故障,最后做后置测量(记录注入后的指标)。把两组数据放在一起比较,计算差异。如果差异在允许范围内,我们认为稳态假设成立;如果差异超出预期,则说明系统在故障面前不够稳。

在实际操作中,可以通过时间序列对比和对照组同时进行。时间序列对比观察同一系统在注入前后两个时间窗口的指标变化;对照组则选择一批完全不注入故障的实例或流量,作为天然的参照系。观察窗口不宜太短,否则噪音和毛刺会掩盖真实信号。

正是这种“有对照组、有前后对比”的严谨设计,让混沌实验从一次随机的破坏游戏变成一门可以迭代的科学。就像疫苗试验的结论能拿去向药品监管机构交代,混沌实验的结论也能拿去向团队和领导交代:我们的系统经得起多大风浪,用了什么证据。

偏差率=∣实测值−基准值∣基准值×100%\displaystyle \text{偏差率} = \frac{|\text{实测值} - \text{基准值}|}{\text{基准值}} \times 100\%
通俗解释:偏差率衡量“注入故障之后,指标到底偏离了正常水平百分之多少”。
  1. 分子实测值与基准值之差:把注入故障后的实测值减去实验前的基准值,得到绝对偏离量。
    实测值−基准值\text{实测值} - \text{基准值}
  2. 取绝对值无论指标是变高还是变低,都算偏离,只关心差多少而不关心方向。
    ∣实测值−基准值∣|\text{实测值} - \text{基准值}|
  3. 除以基准值把绝对偏离量归一化,消除量纲,让不同量级的指标也可以横向比较。
    ∣实测值−基准值∣基准值\frac{|\text{实测值} - \text{基准值}|}{\text{基准值}}
  4. 乘以 100%换算成百分比,形成“偏差 5%”这样直白的结论。
    ×100%\times 100\%

爆炸半径——把故障圈在可控范围

疫苗在推广到十万人之前,一定要先从几十只小白鼠开始。不是因为胆小,而是因为每一次实验都有风险和代价。混沌工程把“一次实验最多影响多大范围”定义为爆炸半径。它是故障注入的安全边界,决定了实验出问题时的最大受害者数量。

爆炸半径的度量单位通常是比例或范围,比如 5% 的生产流量、1 个可用区、10 个 Pod、单个用户分组。它不等于实验的“影响力大小”,而是“影响面的边界”。边界以内,故障可以发生;边界以外,一切必须照常。用公式表达,爆炸半径就是受影响节点数占节点总数的比例。

界定爆炸半径不是拍脑袋,要综合考虑系统的冗余度、业务容忍度、恢复速度和团队熟悉度。一个通用建议是从最小单元开始:先单机、再单集群、再单区域,逐步放宽。同时要设定失控保护——一旦当前实验破坏了稳态假设,立刻停止并回滚。这个保护机制是爆炸半径的“安全带”。

在疫苗试验中,小白鼠的数量就是爆炸半径;在微服务系统里,被注入故障的节点数量就是爆炸半径。把半径控制住,你才能放心地去实验——即便实验失败,损失也只是一小撮“小白鼠”,而不是整个业务。

爆炸半径=受影响节点数总节点数×100%\displaystyle \text{爆炸半径} = \frac{\text{受影响节点数}}{\text{总节点数}} \times 100\%
通俗解释:爆炸半径的本质是一个百分比:每 100 个服务实例里,允许有多少个被卷入故障实验。
  1. 分子受影响节点数:被注入故障的实例或服务数量,它定义了实验中真正的“受害者”名单。
    受影响节点数\text{受影响节点数}
  2. 分母总节点数:系统全部实例总数,作为分母可以让比例在不同规模的系统间保持可比。
    总节点数\text{总节点数}
  3. 乘以 100% 转为百分比换算成百分比后,团队可以用一个统一标准“爆炸半径不超过 10%”来沟通。
    ×100%\times 100\%

渐进编排——从小白鼠到千万人

疫苗试验分为 I 期、II 期、III 期:I 期只有几十人,重点是安全性;II 期扩展到几百人,评估剂量和免疫反应;III 期再到几千人,确认有效性和统计显著性。混沌实验的编排思路一模一样:不是一步到位把所有故障注入全链路,而是从最小半径开始,通过一道道门槛逐步扩大。

每一步的“门槛”通常由上一阶段的结果决定:当前阶段的稳态假设没有被破坏、观测指标正常、团队完成复盘并签字确认,才允许进入下一个半径更大的阶段。这种门槛机制能把风险拆解成离散的、可决策的小步。如果某一阶段已经破坏了 SLO,就不该继续扩大,而应先回到修复环节。

实践中,阶段划分可以参考“单实例 → 单集群 → 单可用区 → 全链路”的路径,也可以按流量比例 1% → 5% → 10% → 50% 递增。关键在于每阶段必须有明确的进入条件和退出条件。进入条件决定“能不能开始”,退出条件决定“是否继续”。这两个条件都应该写成可被程序判断的规则,而不是依赖人工经验。

渐进编排不是保守,而是科学。疫苗试验的安全性数据正是靠一期期积累起来的;混沌实验对生产环境韧性的信心,也要靠小半径到大半径一步步建立。每一期实验都在为下一期提供证据,当走到全链路时,你的系统已经不是第一次面对故障了。

准入=(上一阶段未违反 SLO)∧(指标已观测)∧(复盘已归档)\displaystyle \text{准入} = (\text{上一阶段未违反 SLO}) \land (\text{指标已观测}) \land (\text{复盘已归档})
通俗解释:只有前面几个关卡全部通过,才能解锁下一阶段的更大爆炸半径——就像临床试验必须通过安全审查才能进入下一期。
  1. 上一阶段未违反 SLO这是最硬性的安全门槛,只要实验组指标突破了 SLO,立即停止并回滚。
    上一阶段未违反 SLO\text{上一阶段未违反 SLO}
  2. 指标已观测本阶段的所有黄金信号和业务指标都完成实时采集,有数据可回溯,不做“盲猜式”放行。
    指标已观测\text{指标已观测}
  3. 复盘已归档团队已完成阶段复盘,改进项被记录进文档或知识库,确保经验不会丢失。
    复盘已归档\text{复盘已归档}
  4. 三者逻辑与关系三个条件同时满足才允许进入下一阶段,任何一个不满足都不放行。
    ∧\land

自动化闭环——自动监测与中止

疫苗试验全程有数据监控系统在记录受试者的副作用——一旦出现严重不良反应,试验会被马上暂停,而不是等人类实验员翻完 Excel 再拍板。混沌工程也必须有同样的自动机制:自动注入故障、自动观测指标、自动判断是否超过 SLO、自动回滚。整个环节构成一个闭环。

自动化闭环的第一步是“自动注入”——通过混沌平台或流水线在指定爆炸半径内释放故障;第二步是“实时观测”——连续采集黄金信号和业务指标;第三步是“智能决策”——当指标触碰 SLO 红线时,不等待人工介入,自动执行回滚或熔断。第四步是“结果沉淀”——把实验数据、结论、改进项写回知识库,供下一次实验参考。

这个闭环的价值在于缩短从“故障发生”到“影响消除”的恢复时间。一次手动的混沌实验可能要几十分钟才能完成注入、观察、回滚,而自动化的闭环可以把恢复时间压缩到分钟甚至秒级。闭环还能产生可复用的实验基线和历史数据,让团队逐步建立系统的“韧性档案”。

如果说爆炸半径决定了实验的“空间边界”,那么自动化闭环就决定了实验的“时间边界”——故障影响多久能结束。疫苗试验里,自动暂停机制保护的是受试者的生命;混沌工程里,自动回滚机制保护的是用户的体验和公司的业务。一个闭环成熟的混沌实验体系,才能真正做到持续、安全地演练。

恢复改进=MTTR前−MTTR后\displaystyle \text{恢复改进} = \text{MTTR}_{前} - \text{MTTR}_{后}
通俗解释:一次好的混沌实验应该让系统的平均恢复时间变短——因为你提前发现了弱点,并把它修好了。
  1. MTTR 前进行混沌实验和韧性改造之前,系统从故障发生到恢复所需的平均时间。
    MTTR前\text{MTTR}_{前}
  2. MTTR 后经过多轮混沌实验、发现并修复缺陷之后,系统在同样故障场景下的平均恢复时间。
    MTTR后\text{MTTR}_{后}
  3. 两者相减得到的改进量正值表示恢复能力提升,这正是自动化闭环产生的业务价值。
    MTTR前−MTTR后\text{MTTR}_{前} - \text{MTTR}_{后}

AI 应用场景

电商大促前的全链路韧性演练

阶段:可观测性与 SRE 演练

解决的问题:大促流量峰值为平日十倍,传统压测只模拟正常流量,无法暴露依赖服务抖动时的真实行为。人工判断故障影响耗时且容易误判,需要通过稳态假设和爆炸半径控制,在可控范围内主动注入故障,验证系统在压力下的韧性。

具体案例:某电商平台在双 11 前,先对 1% 的推荐服务注入延迟,确认稳态 SLO 成立后逐步扩展到 10%、50%。最终发现缓存命中率下降 30% 导致错误率飙升,提前完成扩容和限流,大促期间支付成功率保持在 99.99%。

微服务故障注入与自动回滚

阶段:自动化运维与容器编排

解决的问题:人工判断故障影响范围需要数十分钟,且难以做到秒级恢复。通过自动化闭环,把注入、观测、决策、回滚四个环节串联起来,让系统在 SLO 被突破时自动熔断。

具体案例:某支付系统在 CI 流水线中集成混沌工具,每次发布后自动对 5% 的支付请求注入超时,若错误率超过阈值则自动回滚到上一版本。上线半年内,将发布故障的平均恢复时间从 40 分钟缩短到 3 分钟。

混沌实验平台的“韧性评分”体系

阶段:机器学习辅助的可靠性分析

解决的问题:生产变更风险评估缺少历史实证,每次发布前都要靠专家拍板。需要把多轮混沌实验的结果沉淀为可量化的韧性档案。

具体案例:某在线教育平台用混沌实验数据累积每套系统的“韧性评分”,发布前自动对比历史爆炸半径数据——若新版本在 10% 半径下就破坏稳态,则阻断发布并要求回滚。三个月后,生产变更引起的重大事故率下降了 60%。

Python 演示

python65 行
import random  class Service:    """A single target service that can handle requests and inject failures."""     def __init__(self, name, base_err_rate=0.01):        # 服务名与基础错误率, 模拟正常运行时也会有小概率失败        self.name = name        self.base_err_rate = base_err_rate        self.failure_rate = 0.0     def inject_failure(self, rate):        # 注入额外故障比例, 模拟混沌故障对服务的影响        self.failure_rate = rate     def call(self):        # 模拟一次请求, 成功返回 True, 失败返回 False        if random.random() < self.base_err_rate + self.failure_rate:            return False        return True  class ChaosExperiment:    """A minimal chaos experiment scaffold with blast radius control."""     def __init__(self, services, slo=0.95):        # 稳态假设: 整体成功率应不低于 slo        self.services = services        self.slo = slo        self.results = []     def run_trial(self, blast_radius, request_count=2000):        # 在指定爆炸半径内注入故障并统计成功率        affected = random.sample(            self.services, max(1, int(len(self.services) * blast_radius))        )        for svc in affected:            svc.inject_failure(0.05)  # 注入 5% 额外故障        ok = 0        total = 0        for _ in range(request_count):            for svc in affected:                total += 1                if svc.call():                    ok += 1        for svc in affected:            svc.inject_failure(0.0)  # 实验结束立刻还原        return ok / total >= self.slo     def run_progressive(self, radii=(0.02, 0.05, 0.1, 0.2)):        # 从最小半径开始逐步扩大爆炸半径, 任一阶段失败即熔断        for r in radii:            ok = self.run_trial(r)            self.results.append((r, ok))            if not ok:                break        return self.results  if __name__ == "__main__":    services = [Service("svc-%d" % i) for i in range(20)]    exp = ChaosExperiment(services, slo=0.95)    for radius, ok in exp.run_progressive():        print("[radius={:.0f}%] steady-state: {}".format(radius * 100, "PASS" if ok else "FAIL"))
目的:模拟一个包含 20 个服务的系统,通过逐步扩大爆炸半径来验证“稳态假设”是否始终成立,演示渐进式混沌实验的编排逻辑。
  1. affected = random.sample(self.services, max(1, int(len(self.services) * blast_radius)))随机圈定受影响服务集合,把“爆炸半径”从百分比换算成具体的受害实例列表。
  2. svc.inject_failure(0.05)对圈内的每个服务注入额外 5% 的故障率,模拟真实世界中的服务抖动。
  3. ok / total >= self.slo将整体成功率和预设的稳态阈值比较,这是验证稳态假设是否被破坏的核心判据。
  4. for svc in affected: svc.inject_failure(0.0)无论实验成败都立即把故障率归零,这正是“爆炸半径可控”的落地实现。
  5. for r in radii: ... if not ok: break按从 2% 到 20% 的半径逐级推进,某个阶段一旦破坏 SLO,就立刻熔断不再扩大。
  6. print("[radius={:.0f}%] steady-state: {}".format(...))把每个半径的实验结论输出到终端,供团队复盘和改进下一轮实验。

常见误区

误区很多初学者认为,稳态假设就是把已有的监控告警阈值抄一遍,CPU 不超、内存不爆就算稳态成立。既然监控都在跑了,为什么还要单独定义稳态?

正解监控告警是“实时发现正在发生的问题”,而稳态假设是“实验开始前对正常状态的可量化预期”,它的核心是可对比性——必须有前后两个时刻的数值。监控回答了“现在好不好”,稳态假设回答的是“故障注入后,系统有没有偏离基线”。

为何常见:监控告警和稳态假设都涉及指标和阈值,视觉上高度相似,容易混淆。但缺少实验设计视角,只把稳态当作告警,混沌实验就失去了解释力。

误区有人看到教程里写“建议爆炸半径不超过总流量的 10%”,就把它当作铁律,所有实验都一律切 10%。

正解10% 只是一个经验参考值,爆炸半径必须根据系统的冗余度、业务容忍度、恢复速度、团队经验动态设定。一个只有 3 个节点的关键服务,10% 可能意味着 0 个节点可用;一个有 100 个副本的高冗余服务,30% 也可能依然安全。正确做法永远是从最小值开始,逐步试探。

为何常见:教学资料为了降低理解成本,常常给出像"10%"这样具体的数字,学习者容易把示例当成标准答案。

误区不少人第一次听混沌工程,以为目标就是把系统搞崩,看它炸得够不够热闹,故障越大实验越成功。

正解制造故障只是手段,目的是验证稳态假设在真实故障下是否成立,并找出系统脆弱的盲点。一次成功实验的产出不是“系统挂了 5 分钟”,而是“我们发现缓存命中率骤降时,熔断策略可以按预期兜底”。它更像是疫苗试验里记录的不良反应,而不是单纯地追求副作用。

为何常见:“混沌”这个词自带破坏性想象,加上一些演示视频喜欢展示炸裂现场,容易让人误解工程的本质是检验与学习,而非破坏。

面试题

Q1. 稳态假设在混沌工程中的最佳定义是什么?

单选题 · easy

  • A.保证系统硬件永不故障的承诺
  • B.预先定义系统稳定运行时的指标范围← 正确答案
  • C.验证故障后系统自动恢复的必然结论
  • D.监控系统最低告警阈值的配置方案

答案:B。稳态假设的关键在于“预先定义”和“指标范围”,它是一组可量化的期望值,用来和注入故障后的实测值对比。A 是荒唐承诺,C 是实验结论而不是前提,D 把稳态等同于告警配置,忽略了对比和基线的意义。

Q2. 以下哪个指标属于黄金信号?

单选题 · easy

  • A.磁盘剩余容量
  • B.请求错误率← 正确答案
  • C.数据库连接数
  • D.内存占用率

答案:B。四大黄金信号是延迟、流量、错误和饱和度。请求错误率直接反映错误信号。磁盘容量、数据库连接数和内存占用率虽也有用,但它们更偏向资源监控,不属于黄金信号的核心分类。

Q3. 爆炸半径的正确含义是什么?

单选题 · mid

  • A.故障注入影响的服务范围← 正确答案
  • B.系统能够承受的最大故障时间
  • C.混沌实验持续的时间长度
  • D.监控系统覆盖节点的百分比

答案:A。爆炸半径量化的是“一次实验最多影响多少节点、流量或用户”,它是空间范围而非时间长度。B 描述的是故障承受时间,C 是实验时长,D 是监控覆盖率,都与爆炸半径无关。

Q4. 渐进式实验的阶段门槛是指什么?

单选题 · mid

  • A.每个阶段必须等待固定的时间
  • B.上一阶段未违反 SLO 且完成复盘← 正确答案
  • C.需要用户批准才能进入下一阶段
  • D.系统重启后才能继续新阶段

答案:B。阶段门槛是程序化、可判断的准入条件,核心是上一阶段未破坏稳态假设、观测数据完整、复盘已归档。单纯等时间是机械执行,人工批准不是必要条件,系统重启也不是进入下一阶段的依据。

Q5. 混沌实验前,选取稳态指标时应考虑哪些方面?

多选题 · mid

  • A.反映用户体验的核心业务指标← 正确答案
  • B.可以实时观测并自动计算← 正确答案
  • C.同时覆盖系统和业务两个视角← 正确答案
  • D.指标越隐蔽越利于实验保密

答案:ABC。稳态指标必须与用户体验强相关(A)、能被实时观测和自动计算(B)、同时覆盖系统与业务视角(C)。D 是错误选项——指标需要被团队清晰看到并共同评审,隐蔽只会让实验失去监督和说服力。

Q6. 当混沌实验过程中错误率超过 SLO,正确的做法是?

单选题 · mid

  • A.立即中止实验并进行回滚← 正确答案
  • B.继续扩大故障注入范围
  • C.关闭监控避免告警干扰
  • D.忽略错误率继续完成实验

答案:A。SLO 是稳态假设的裁判标准,一旦被突破,说明系统在当前爆炸半径下已经不稳定,正确的反应是中止实验、回滚故障注入,保护生产环境。继续扩大、关监控或忽略错误率都违背了混沌实验的安全宗旨。

Q7. 实验发现错误率上升但用户无感知,下一步应该?

单选题 · hard

  • A.终止实验并判定系统脆弱
  • B.继续增大半径直到用户感知
  • C.下调报警阈值再重新实验
  • D.检查稳态指标是否选得合理← 正确答案

答案:D。错误率上升而用户无感知,很可能是因为选定的稳态指标过于敏感、与用户体验脱节,或测试流量不经过真实用户链路。此时最合理的操作是复盘指标选取是否合理,而不是直接判定脆弱、盲目扩大半径或调整阈值来掩盖问题。

Q8. 自动化混沌实验闭环通常包含哪些环节?

多选题 · hard

  • A.在 CI/CD 中自动触发实验← 正确答案
  • B.实时采集指标判断 SLO← 正确答案
  • C.超阈值自动回滚恢复← 正确答案
  • D.所有环节完全不需要人工

答案:ABC。自动化闭环的核心是触发、观测、决策、回滚四个环节全部程序化。A、B、C 分别对应自动触发、观测判断、自动恢复。D 是绝对化表述——即使自动化程度再高,也需要人工审批、复盘和设计实验,完全去人工在现实生产中既不安全也不现实。

Q9. 控制爆炸半径时,优先选择哪一层?

单选题 · easy

  • A.影响用户数最多的服务
  • B.影响范围最小的服务集群← 正确答案
  • C.所有生产环境同时注入
  • D.每个服务的所有实例

答案:B。爆炸半径的原则是“从最小影响面开始试探”。B 明确选择了影响范围最小的集群,符合渐进式安全策略。A 影响最大,C 和 D 都违背了逐级放大的原则,风险不可控。

Q10. 在一次渐进式混沌实验中,以下哪些情形应当停止扩大爆炸半径?

多选题 · extreme

  • A.当前阶段成功率已低于 SLO← 正确答案
  • B.观测到 P99 延迟出现明显恶化← 正确答案
  • C.依赖服务超时但核心链路正常
  • D.实验团队仍未完成故障复盘← 正确答案

答案:ABD。成功率低于 SLO(A)是硬性熔断条件;P99 延迟明显恶化(B)说明用户体验已经受损,也应停止;未完成复盘(D)意味着上一阶段的经验还没有沉淀,不具备进入下一期的资格。C 恰好是系统韧性正常的体现——依赖超时但核心链路不受影响,说明隔离设计有效,恰恰是继续实验的理由。