假设你是一家生意火爆的餐厅主厨。晚市高峰,前厅坐满客人,后厨火力全开。你深知,这看似红火的场面其实很脆弱——只要海鲜供应商的车坏在半路,或者冷库跳闸,几十道招牌菜瞬间就做不出来。为了不让客人干等,你早就备好了应急方案:冷冻库存先顶上,招牌菜换成备选做法,实在不行就赠一道例汤。这套“缺料应急”的逻辑,和 AI 系统中的特征降级如出一辙。特征平台是模型的“后厨”,实时特征数据是“食材”,当数据库、实时计算链路这些“供应商”出故障时,降级策略保证模型服务不“停业”。本文带你完整理解降级策略的分级设计、缓存与模型侧兜底、容灾架构,以及监控恢复的完整闭环。

岗位关联

特征降级与容灾是实时特征服务的“安全带”——学会它,你就能在数据源故障、流量洪峰时稳住线上模型,成为团队里真正能扛事故的 AI 工程师。

目录
  1. 可视化演示
  2. 降级基本概念
  3. 降级策略分类
  4. 缓存降级机制
  5. 模型侧兜底设计
  6. 容灾架构设计
  7. 监控告警体系
  8. 故障恢复流程
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示特征降级策略与容灾预案的核心机制,通过源头/管道/节点/终端四种模式展示关键概念与交互流程。

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

特征降级策略与容灾预案:特征降级 特征降级的触发条件与失效判据 特征优先级分级与降级层次设计 核心机制可视化 特征降级策略与容灾预案整体架构与关键组件

降级基本概念

晚市高峰的丰收饭店里,后厨的每一道菜都依赖一条环环相扣的供应链:海鲜供应商凌晨送货,冷库负责保鲜,配菜员按单切配。表面看一切都在掌控中,但真正老练的主厨心里都清楚——“正常”其实是无数环节同时不出错的巧合。AI 系统同样如此。一个实时推荐模型要给出结果,需要特征平台在几十毫秒内把用户的年龄、偏好、近 30 天行为等特征送到模型面前。这些特征来自数据库、实时计算链路、第三方服务,任何一个环节抖动,模型就“无米下锅”。

特征降级要解决的,正是这种“无米下锅”的场面。它指特征平台在特征源不可用时,按照预先设计的规则,用缓存快照、近似值或默认值等替代特征继续支撑模型推理,让上层业务不至于整体停摆。注意,降级的目标不是“不出故障”——故障无法避免,而是“故障发生时服务不中断”。

工程上,我们通常从三个角度理解降级:一是特征服务的可靠性,用可用性指标度量系统正常运行的时间占比;二是降级的触发条件,常见有三类——特征存储超时、实时计算返回异常数据、突发流量触发限流熔断;三是降级的三条原则——可用性优先、影响面最小、可快速恢复。这三条原则决定了后续所有策略的设计取舍。

对主厨来说,提高可用性无非两条路:让供应商更靠谱(延长 MTBF),或者让应急流程更熟练(缩短 MTTR)。而降级策略,正是缩短 MTTR 的那套“肌肉记忆”——它让你在食材断供的第一秒就知道该去开哪个冷库、换哪道菜。

A=MTBFMTBF+MTTR\displaystyle A = \frac{MTBF}{MTBF + MTTR}
这个公式说明:系统可用性等于“正常运行时间”占“一个完整故障周期”的比例。想提高可用性,要么减少故障次数,要么加快修复速度。
  1. MTBF(平均无故障时间)两次故障之间系统连续正常工作的平均时长。它反映设备“坏得勤不勤”,供应商越靠谱,这个值越大。
    MTBFMTBF
  2. MTTR(平均修复时间)从故障发生到系统恢复的平均时长。它反映“修得快不快”,预案越熟练,这个值越小。
    MTTRMTTR
  3. 比值即可用性一个完整周期由“正常期 + 故障修复期”组成,可用期占整个周期的比例就是可用性。
    A=MTBFMTBF+MTTRA = \frac{MTBF}{MTBF + MTTR}

降级策略分类

接到供应商缺货通知后,主厨手里其实有四张牌可以打:第一张,用冷库里的冷冻食材顶上——这是缓存快照;第二张,用口感相近的食材替换,比如用巴沙鱼代替鳕鱼——这是近似替代;第三张,菜里只放基础调料,味道普通但能上桌——这是静态默认值;第四张,直接换一套不依赖这种食材的简化菜谱——这是模型侧兜底。四张牌从“质损小”到“质损大”,形成一个降级阶梯。

在特征平台上,这四张牌对应四类降级策略。静态默认值:特征缺失时直接填充预先定义的常数,如年龄填 30、行为分填 0;缓存快照:返回最近一次成功获取的特征副本;近似特征替代:用强相关特征推算缺失特征,或用昨日同时段数据代替今日;模型侧兜底:把降级交给模型处理——喂入填充值,或切换到不需要该特征的备用模型。

选择哪张牌,核心依据是“质量损失最小”。我们定义降级损失为完整特征与降级特征各自预测结果的绝对偏差,偏差越小说明该策略越优。通常缓存快照偏差最小,静态默认值偏差最大。工程上会为每个特征标注重要度和可用降级策略,在故障发生时按优先级自动选择。

聪明的主厨心里有本账:冷冻鳕鱼和鲜鳕鱼做出来味道最接近,巴沙鱼就差一截,只放基础调料则完全没了招牌味。所以缺货时先开冷库,冷库也空了再想替代,实在没招才上基础版。降级策略的选择,就是这本“味道偏差账”的技术化。

Ldeg=∣y^full−y^deg∣\displaystyle L_{deg} = \left| \hat{y}_{full} - \hat{y}_{deg} \right|
降级损失衡量的是“模型输出被影响的程度”。选择策略时,哪个方案让预测结果偏离最小,哪个就优先上。
  1. 全量特征预测所有特征完整时,模型产出的预测值,作为衡量损失的基准。
    y^full\hat{y}_{full}
  2. 降级特征预测采用某种降级策略后,模型基于替代特征产出的预测值。
    y^deg\hat{y}_{deg}
  3. 绝对偏差取绝对值度量两者差距,越大说明降级对预测的扰动越大。
    ∣y^full−y^deg∣\left| \hat{y}_{full} - \hat{y}_{deg} \right|
  4. 最小化目标实际落地时,优先选择使该损失最小的策略。
    Ldeg→min⁡L_{deg} \to \min

缓存降级机制

丰收饭店后厨最值钱的资产,不是当天的鲜货,而是那台大冷库。聪明的采购会每天预留一部分食材速冻,一旦供应商断货,冷冻食材就是最先顶上来的救兵。特征缓存就是这个“冷库”,它的使命是在特征源断供时,用最近一次的可靠快照续命。

特征缓存通常分两级。本地缓存放在特征服务进程内,像厨师案台边的小冰箱——取用最快,但容量小,服务重启即失;分布式缓存(如 Redis)独立部署,像中央冷库——容量大,可跨服务共享,但多一次网络访问。降级时,团队一般先查本地,再查分布式缓存,最后才允许回源。

缓存设计有三个关键点。一是过期时间(TTL):特征是有时效的,用户的实时行为 5 分钟前的快照还能用,昨天的就意义不大,需要按特征维度和业务容忍度设置 TTL;二是一致性:特征源更新后,缓存不能长期滞留旧值,常用主动失效与异步刷新结合;三是容错:缓存本身也会被击穿、雪崩,所以要有缓存预热(高峰期前提前填充)和空值保护(缓存空结果也要短暂保留,防止请求穿透到源)。

主厨每天晚市前都会清点冷库,把招牌菜原料的冷冻量补足——这就是缓存预热;也会在冻品包装上贴保鲜日期——这就是 TTL。冷库管理得越好,断货时越从容;缓存管理得越好,降级时越平滑。

H=NhitNhit+Nmiss\displaystyle H = \frac{N_{hit}}{N_{hit} + N_{miss}}
命中率越高,说明缓存越有效地承接了请求,降级时“冷库”里可用的“存货”就越足。
  1. 命中次数请求的特征在缓存中直接取到的次数,代表“冷库直接出货”。
    NhitN_{hit}
  2. 未命中次数缓存里没有,必须回源特征库的次数,代表“需要临时进货”。
    NmissN_{miss}
  3. 缓存命中率命中数占全部请求的比例,反映缓存的替代能力,也是降级底气的度量。
    H=NhitNhit+NmissH = \frac{N_{hit}}{N_{hit} + N_{miss}}

模型侧兜底设计

丰收饭店有一本“万能简化菜谱”:不依赖任何高端食材,用最普通的土豆胡萝卜也能在 10 分钟内出一桌像样的菜。平时它不常被翻开,但一旦冷库也空了、替代食材也用完了,这本菜谱就是最后一道防线。模型侧兜底,就是 AI 系统的“万能简化菜谱”。

模型侧兜底的第一招是缺失特征填充:在喂入模型前,用均值、众数或业务默认值把缺失特征补上,让模型主干结构无需改动。第二招是备用模型切换:为关键业务准备一个不依赖高成本特征的精简模型,当特征完整度低于阈值时整体切换。第三招是输出置信度调节:降级时模型对结果的把握下降,下游业务应降低置信度阈值或返回“不确定”标识,避免拿低质量结果硬撑。

填充看似简单,实则要小心:均值填充会让特征失去个体差异,若缺失率很高,预测分布会整体偏移。因此工程上会为每个模型设定特征完整度阈值,完整度足够时走全量模型,不足时切换轻量模型,并用置信度判断结果是否可对外输出。

万能菜谱虽然做不出米其林级别,但至少保证客人不用饿肚子。模型侧兜底的价值也在于此:它放弃了一点精度,换来了服务的连续性——对大多数线上业务来说,一个略粗糙但稳定的结果,远比一个“正在加载”的转圈图标要好。

y^={y^full,ρ≥τy^lite,ρ<τ\displaystyle \hat{y} =\begin{cases}\hat{y}_{full}, & \rho \ge \tau \\\hat{y}_{lite}, & \rho < \tau\end{cases}
这是一段“分流闸门”:特征完整度达到阈值就走正常路径,否则走备用模型路径。
  1. 完整度阈值判断特征完整度 ρ 不低于阈值 τ 时,说明“配菜基本齐了”。
    ρ≥τ\rho \ge \tau
  2. 全量模型路径特征基本完整,输出主打模型的预测结果。
    y^full\hat{y}_{full}
  3. 轻量模型路径特征缺失较多,切换到不依赖缺失特征的备用模型。
    y^lite\hat{y}_{lite}

容灾架构设计

仅靠应急菜单还不够——如果整座后厨烧了呢?真正成熟的餐厅会做两手准备:在主厨房之外,和另一家分店共享一套备用灶台,平时闲置,关键时刻直接启用。容灾架构,就是为特征平台准备的“备用厨房”。

容灾设计的第一层是多副本冗余:特征数据和服务实例部署多份,单点故障时由副本接管。第二层是故障转移(failover):通过健康检查发现主服务异常后,自动把流量切到备用实例。第三层是跨机房容灾:把整个服务复制到不同城市或可用区,抵御机房级灾害。第四层是熔断与限流:当下游特征源过载时,主动拒绝一部分非核心请求,避免故障像多米诺骨牌一样蔓延。

冗余不是简单地“多买一份菜”,它要解决副本间数据同步、切换时的流量一致性、以及脑裂(两个副本同时认为自己是主)等问题。熔断器则用三态守护链路:关闭态正常放行;失败率超标进入打开态直接拒流;经过冷却窗口进入半开态,放少量探测流量验证下游是否恢复。

和主厨的备用灶台一样,容灾架构平时看起来“浪费”,但真正发生大火、停电时,它是餐厅能继续翻台的唯一底气。冗余、熔断、限流,都是把“意外”变成“预案里的一行流程”。

Asys=1−(1−A)n\displaystyle A_{sys} = 1 - (1 - A)^n
这是冗余的核心收益公式:单一组件可用性为 A,n 个副本中只要有一个活着,系统就能继续服务。
  1. 单副本故障概率单个组件不可用的概率,是冗余要对抗的“坏运气”。
    1−A1 - A
  2. 全部副本同时故障n 个独立副本同时不可用的概率,随 n 增大指数级减小。
    (1−A)n(1 - A)^n
  3. 系统可用性至少一个副本正常工作的概率,就是冗余后的整体可用性。
    Asys=1−(1−A)nA_{sys} = 1 - (1 - A)^n

监控告警体系

丰收饭店的后厨高处装着一排传感器:火焰探测器、燃气报警器、温控探头,还有每天盯着退菜率的品控主管。主厨可以容忍偶尔的失误,但不能容忍“出了问题没人知道”——等到客人掀桌才反应过来,已经晚了。监控告警体系,就是特征平台的“火警与品控”。

监控的第一层是核心指标大盘:请求量、错误率、P99 延迟、缓存命中率、降级触发率,这些指标回答“服务健不健康”。第二层是异常检测告警:指标超过阈值时自动通知值班人,为了避免偶发抖动造成误报,常用滑动窗口加指数平滑(EMA)过滤毛刺。第三层是 SLO 分级响应:按影响面把告警分为 P0/P1/P2,P0 立即拉群响应,P1 在 30 分钟内处理,P2 记录观察。

降级率是一个容易被忽略却至关重要的指标:它告诉你系统当前有多少比例的特征来自替代方案。如果降级率长期偏高,哪怕错误率正常,也说明上游已经病了很久。告警质量比数量重要——告警疲劳会让值班人麻木,所以每个告警都要带上影响评估和处置建议。

火警器的灵敏度需要调校:太灵敏,炒个菜冒点烟就全楼疏散;太迟钝,火苗蹿起来才发现。EMA 平滑就是这套灵敏度的旋钮,让告警系统守住那个微妙的平衡点。

St=α⋅Et+(1−α)⋅St−1\displaystyle S_t = \alpha \cdot E_t + (1 - \alpha) \cdot S_{t-1}
这是一台“情绪稳定器”:把瞬时指标和历史趋势加权平均,让告警既不迟钝也不神经质。
  1. 当前观测值本窗口内的原始指标值,比如这一分钟的错误率。
    EtE_t
  2. 历史平滑值上一时刻的平滑结果,承载了过去的趋势信息。
    St−1S_{t-1}
  3. 平滑系数取值 0~1,越大越紧跟最新数据,越小越平滑抗噪。
    α\alpha
  4. 递推平滑新旧信息的加权和,构成指数移动平均。
    St=α⋅Et+(1−α)⋅St−1S_t = \alpha \cdot E_t + (1 - \alpha) \cdot S_{t-1}

故障恢复流程

再好的预案,最终都要落在“人怎么动”上。丰收饭店的应急预案手册里写着:火警响起后,谁负责关燃气,谁负责疏散客人,谁负责抢救食材——分工到人,精确到秒。故障恢复流程,就是特征平台的那本“手册”。

恢复流程分三步。第一步是预案启动:当告警确认且影响达到预定级别,值班负责人宣布进入降级状态,这需要明确的“谁说了算”,避免多人决策互相等待。第二步是降级与恢复切换:先恢复只读链路和缓存,确认特征源稳定后,按 1%、10%、50%、100% 的灰度比例逐步切回,每步都观察错误率与预测质量。第三步是故障复盘:拉出完整时间线,定位根因,列出改进项并跟进。

灰度切回是为了防止“好了伤疤忘了疼”——特征源刚恢复时可能还有残余抖动,全量切换一旦再次失败,代价远高于慢慢放量。复盘的产出不是追责报告,而是新的检查项和演练脚本。成熟的团队每季度会主动做混沌演练:故意断掉特征源、拔掉机房电源,检验预案是否真的跑得通。

餐厅每个月都会做一次消防演练,不是为了应付检查,而是让每个服务员在浓烟里也能凭肌肉记忆找到灭火器。特征平台的容灾演练同理——平时的“排练”,决定了真正出事时团队是井然有序还是一团乱麻。

MTTR=TdowntimeNincidents\displaystyle MTTR = \frac{T_{downtime}}{N_{incidents}}
平均恢复时长是衡量整条恢复链路效率的标尺,演练的价值就是不断降低它。
  1. 总停机时长统计周期内所有故障导致的停机时间总和。
    TdowntimeT_{downtime}
  2. 故障次数统计周期内发生的故障数量。
    NincidentsN_{incidents}
  3. 平均恢复时长每次故障平均需要多长时间恢复,越低说明预案执行越熟练。
    MTTR=TdowntimeNincidentsMTTR = \frac{T_{downtime}}{N_{incidents}}

AI 应用场景

电商大促实时推荐系统的降级

阶段:模型服务 / 在线推理

解决的问题:双 11 高峰时,用户行为特征存储集群主库宕机。传统做法直接报错,导致推荐接口全挂、页面大面积空白;AI 降级方案让缓存率先兜底,峰值期间自动切换到小时级行为快照,保住推荐流不断供。

具体案例:某电商平台大促期间特征库读写放大,存储超时率飙升。特征平台检测到错误率超阈值后自动触发缓存降级,推荐服务用 30 分钟前的特征快照继续出结果,峰值转化率仅下降 3%,避免了全面熔断。

金融实时风控的特征兜底

阶段:特征处理 / 实时决策

解决的问题:风控模型实时依赖支付流水、设备指纹等特征。上游渠道不稳定时,风控服务不能简单拒绝所有交易——误杀率太高会伤及正常用户,需要用降级特征做“保守放行”。

具体案例:某支付公司风控链路中,设备指纹服务由第三方供应商提供,偶发超时。降级策略对高风险陌生交易返回“人工审核”,对中低风险交易使用历史设备画像兜底,在保安全与保可用之间取得平衡。

短视频信息流的实时兴趣特征降级

阶段:实时特征服务 / 推荐召回

解决的问题:推荐系统依赖秒级实时兴趣特征(刚点赞、刚观看),实时计算链路一旦延迟,兴趣特征就会缺失,导致推荐内容“慢半拍”。

具体案例:某视频 App 实时计算集群扩容故障,特征产出延迟 5 分钟。平台自动降级到近 30 分钟的兴趣聚合特征并下调实时权重,靠缓存和近似替代维持了推荐流的连贯性,用户感知几乎无变化。

Python 演示

python62 行
import random  class FeatureSource:    """模拟外部特征源, fail_rate 控制故障概率"""     def __init__(self, fail_rate=0.0):        self.fail_rate = fail_rate     def fetch(self, user_id, feature_name):        if random.random() < self.fail_rate:            raise RuntimeError("feature source is down")        return (user_id * 0.3 + len(feature_name)) * 2.0  class FeatureService:    """实时特征服务, 实现缓存 + 默认值两级降级"""     def __init__(self, source, cache_size=50):        self.source = source        self.cache = {}        self.cache_size = cache_size        self.defaults = {"age": 30, "score": 0.0}        self.hit_count = 0        self.degrade_count = 0        self.total_count = 0     def get_feature(self, user_id, feature_name):        key = (user_id, feature_name)        self.total_count += 1        if key in self.cache:            self.hit_count += 1            return self.cache[key]        try:            value = self.source.fetch(user_id, feature_name)        except RuntimeError:            # 降级策略: 先用缓存快照, 没有再回退到静态默认值            self.degrade_count += 1            value = self.cache.get(key, self.defaults.get(feature_name, 0.0))        else:            if len(self.cache) >= self.cache_size:                self.cache.popitem()            self.cache[key] = value        return value  def main():    random.seed(42)    source = FeatureSource(fail_rate=0.25)    service = FeatureService(source)    for i in range(1000):        user_id = i % 50        fname = "score" if i % 2 == 0 else "age"        service.get_feature(user_id, fname)    total = service.total_count    print("总请求数:", total)    print("缓存命中率: %.1f%%" % (service.hit_count * 100.0 / total))    print("降级回退比例: %.1f%%" % (service.degrade_count * 100.0 / total))  if __name__ == "__main__":    main()
目的:用一个小型特征服务模拟实时特征获取,在特征源 25% 概率故障的情况下,演示“缓存快照 → 静态默认值”两级降级策略如何保住服务,并统计命中率与降级比例。
  1. if key in self.cache:先查缓存,命中就直接返回,这是“开冷库找存货”。
  2. value = self.source.fetch(user_id, feature_name)缓存未命中才回源,相当于“给供应商打电话要货”。
  3. except RuntimeError:捕获特征源故障,这是降级发生的“触发器”。
  4. value = self.cache.get(key, self.defaults.get(feature_name, 0.0))两级降级:先用缓存快照,没有再落到静态默认值。
  5. self.cache[key] = value成功取到的特征回填缓存,为下次请求备货。
  6. random.seed(42)固定随机种子,让实验结果可复现。
  7. FeatureSource(fail_rate=0.25)模拟四分之一的概率故障,观察降级链路是否如预期工作。

常见误区

误区降级不就是给特征填个默认值吗?比如年龄填 30、分数填 0,很简单的一件事。

正解默认值只是最粗糙的一档。成熟的降级阶梯会先尝试缓存快照,再尝试近似特征替代,最后才落到静态默认值;模型侧还有备用模型兜底。一味用默认值会让预测质量大幅下跌,相当于客人点的招牌菜被换成白米饭。

为何常见:因为“默认值”概念最简单直观,教程示例常拿它举例,初学者容易以偏概全。

误区都做了双机房多副本,单点故障不可能发生,降级策略可以做也可以不做。

正解冗余降低的是“基础设施层”故障概率,但数据源语义错误、上游数据延迟、流量洪峰导致的级联故障,仍然可能让所有副本一起失效。降级是最后一道刹车,永远要留着。

为何常见:只看到物理故障,忽略了逻辑故障与容量风险。

误区降级用的也是缓存里的真实特征,效果应该和平时完全一样吧?

正解缓存快照有时间差(比如昨晚的数据),近似特征有推算误差,而且降级让特征分布偏移,模型输出分布也会漂移。需要监控降级期间的效果指标,必要时在下游加补偿逻辑。

为何常见:直觉上“同一份数据”等于“同一效果”,忽略了特征的时效性价值。

误区预案文档写好了,放在 wiki 里,等出事照着做就行。

正解没演练过的预案等于没有预案。真实故障里人会紧张、会忘步骤、工具可能不可用。定期混沌演练(拔机房电源、断数据源)才能让团队形成肌肉记忆,并暴露预案漏洞。

为何常见:演练要花时间成本且短期内看不到收益,容易被优先级排后。

面试题

Q1. 特征降级策略的核心目的是什么?

单选题 · easy

  • A.把特征数据备份到多个机房
  • B.在特征源故障时保住推理服务← 正确答案
  • C.减少模型的训练样本数量
  • D.提升特征加工的计算速度

答案:B。降级的本质是“故障时服务不中断”。备份机房属于容灾手段而非降级本身,减少样本和提升计算速度都不是降级的目标。就像主厨缺料时想的是如何继续上菜,而不是重新买菜谱。

Q2. 特征降级阶梯中,通常优先选用哪一档?

单选题 · mid

  • A.返回静态默认特征值
  • B.使用同源缓存快照← 正确答案
  • C.直接报错并熔断请求
  • D.切换成离线批量特征

答案:B。缓存快照是最近一次成功获取的真实特征,与完整特征的偏差最小,所以优先使用。静态默认值质损最大,通常最后才用。直接报错违背降级目标,离线批量特征时效性差,都不是首选。

Q3. 哪些情况会触发实时特征降级?

多选题 · mid

  • A.特征存储集群访问超时← 正确答案
  • B.实时计算链路数据异常← 正确答案
  • C.流量激增触发限流熔断← 正确答案
  • D.离线训练任务运行失败

答案:ABC。存储超时、计算链路异常、限流熔断都会让特征“上不了桌”,因此触发降级。离线训练任务失败只影响模型迭代,不直接影响在线特征服务,不需要触发实时降级。

Q4. 缓存降级机制中,TTL 过期主要解决什么问题?

单选题 · mid

  • A.缓存容量不足导致存不下
  • B.特征更新后旧值仍然生效← 正确答案
  • C.模型推理速度变得缓慢
  • D.特征平台无法水平扩容

答案:B。TTL(过期时间)保证缓存中的特征不会无限期滞留旧值,避免“冻品过期还端上桌”。容量问题靠淘汰策略,推理速度和扩容与 TTL 无关。

Q5. 模型侧兜底设计的常见手段包括哪些?

多选题 · hard

  • A.用特征均值填充缺失值← 正确答案
  • B.切换到轻量级备用模型← 正确答案
  • C.降低输出的预测置信度← 正确答案
  • D.增加模型的层数和参数

答案:ABC。均值填充、备用模型切换、置信度调节都是模型侧应对特征缺失的招数。增加层数和参数只会让模型更依赖特征,在缺料时反而更难做菜。

Q6. 关于熔断器的“半开”状态,下列说法正确的是?

单选题 · hard

  • A.停止一切入站流量请求
  • B.放少量探测流量验证恢复← 正确答案
  • C.将请求全部转发到备用机房
  • D.永久拒绝下游所有调用方

答案:B。半开状态只放少量探测流量,像火灾后先让一个人进厨房看看燃气是否安全。停止一切流量是“打开”态,转发备用机房是故障转移,永久拒绝不是熔断器的设计。

Q7. 监控系统中使用 EMA 平滑异常指标,主要目的是什么?

单选题 · easy

  • A.过滤毛刺避免频繁误报← 正确答案
  • B.提高指标的数据精度
  • C.减少监控节点的数量
  • D.加快告警消息的发送

答案:A。EMA 是“情绪稳定器”,把瞬时抖动和历史趋势加权平均,过滤毛刺。它不改变数据精度、不减少节点,也不影响发送速度,只影响告警的灵敏与稳定。

Q8. 降级与容灾预案的正确理解有哪些?

多选题 · hard

  • A.降级是预案中的具体动作← 正确答案
  • B.容灾包含冗余熔断恢复← 正确答案
  • C.二者互相替代即可
  • D.演练可以验证预案有效← 正确答案

答案:ABD。降级是故障发生后预案执行的具体动作之一;容灾是更完整的体系,包含冗余、熔断、故障转移、恢复;演练能检验预案是否跑得通。二者不是替代关系,而是“动作”与“体系”的关系。

Q9. 故障恢复时,为什么提倡“灰度切回”而不是全量切换?

单选题 · mid

  • A.便于保留历史故障日志
  • B.降低恢复后再次故障风险← 正确答案
  • C.减少运维人员的操作次数
  • D.加快数据同步的整体速度

答案:B。特征源刚恢复时可能有残余抖动,灰度切回能在小流量下验证服务稳定,避免再次全量故障。保留日志、减少操作、加速同步都不是灰度的核心目的。

Q10. 跨机房容灾部署后,单副本可用性 A=0.9,副本数 n=2,系统可用性是多少?

单选题 · extreme

  • A.0.90
  • B.0.99← 正确答案
  • C.0.81
  • D.0.95

答案:B。根据冗余公式 A_sys = 1 - (1-A)^n,代入得 1 - (0.1)^2 = 0.99。两个副本同时故障的概率是 1%,所以系统可用性从 90% 提升到 99%。这就是“备用厨房”的价值。