你经营着一家叫“麻辣鲜”的连锁火锅店,周五晚是生意最火爆的时候。后厨热火朝天时,主灶台的燃气阀突然坏了——火苗噗地熄灭,锅里还煮着毛肚,门外排着二十桌客人。怎么办?真正的老板会怎么做?他会立刻从储物间搬出备用电磁炉,给隔壁餐厅打电话借灶台,再从冷库调出提前备好的半成品。顾客几乎感觉不到任何异常,最多觉得“今晚上菜稍微慢了一点点”。 这就是容灾的智慧。AI应用里的特征服务,就是模型的“后厨”——推荐系统要在毫秒级拿到用户的“最近点击序列”特征,风控系统要实时查询“设备指纹”特征,广告系统要按需拼出“出价特征”。这个“后厨”一旦熄火,所有依赖它的推理链路都会饿肚子。而现实中的“意外”从不缺席:服务器宕机、机房断电、网络抖动、代码Bug、误操作……特征服务容灾与高可用,做的就是一件事:让意外发生时,顾客依然吃得上饭。
掌握特征服务容灾,你就不再是只会“写功能”的工程师,而是能对系统生死存亡负责的架构师——这是AI基建岗位面试与晋升中含金量极高的加分项。
可视化演示
动态演示特征服务容灾与高可用的核心机制,通过输入/处理/存储/输出四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
特征服务容灾与高可用:特征服务 特征服务容灾目标与故障模式分类 特征降级策略与兜底值设计 核心机制可视化 特征服务容灾与高可用整体架构与关键组件
容灾基本概念
你经营着“麻辣鲜”火锅店,周五晚是生意最火爆的时候。就在后厨热火朝天时,燃气灶突然熄火——阀门坏了。门外还有二十桌客人在等位。成熟的店会备着电磁炉、会提前谈好隔壁餐厅的互助协议、会在冷库囤半成品食材。这就是容灾的雏形:知道“会出意外”,所以提前准备“意外来了怎么办”。容灾不是灾难发生后的亡羊补牢,而是开店第一天就签好的维修加急电话。
AI应用里的特征服务,扮演的正是“后厨”的角色。推荐系统要立刻拿到“最近浏览序列”特征,风控系统要实时查询“设备指纹”特征,广告系统要按毫秒级延迟算出“出价特征”。特征服务一旦停摆,所有依赖它的模型推理都会饿着肚子干等。而现实是:机房会断电、网络会抖动、缓存会雪崩、代码会引入Bug。特征服务的故障类型可分为四类:基础设施故障(机房断电、网络分区)、依赖故障(下游数据库不可用、缓存雪崩)、软件故障(代码Bug、配置错误)、人为故障(误操作、发布事故)。
评估容灾能力最核心的量化指标是可用性。可用性用“正常服务时间占总时间的比例”来定义,常用“几个九”来表示——99.9% 意味着一年最多允许停机 8.76 小时。要提高可用性,无非两条路:让设备更耐用(增大无故障间隔),或者让修复更快(缩短修复耗时)。
容灾的起点不是买设备,而是承认“意外会来”。就像麻辣鲜老板赌的不是灶台永不出错,而是即便出错,顾客也几乎感觉不到——这个“感觉不到”的目标,贯穿了后面所有的架构设计。
- 可用性 A系统的正常服务时间占总时间的百分比,是衡量容灾能力最核心的指标,常写作四个九、五个九。
- 平均无故障时间 MTBF从一次故障恢复后到下一次故障发生前的平均间隔,反映设备的“耐用程度”。
- 平均修复时间 MTTR从故障发生到服务完全恢复的平均耗时,反映团队的应急速度和工具完备度。
- 占比计算用 MTBF 除以 MTBF 与 MTTR 之和,再乘 100%。分子是“不出事的时间”,分母是“总时间”,比值越接近 100%,容灾能力越强。
高可用架构
光有一台备用电磁炉还不够。如果你只开一家店,燃气管道检修、整栋楼停电、水管爆裂,任何一件大事都能让你关门歇业。聪明的老板会开分店:老城区的店被淹了,新区的店照常出餐;一家店客流爆满,另一家店帮忙分担。放在系统架构里,这叫“冗余”和“高可用设计”。分店的意义在于:三间厨房同时出问题的概率,远小于一间厨房出问题的概率。
特征服务的高可用,核心思路同样是“不要把所有鸡蛋放在一个篮子里”:多部署几个节点(多副本),让流量在节点间合理分配(负载均衡),当某个节点故障时自动把请求转到其他健康节点(故障转移)。常见架构模式有两种:主从热备——主节点处理全部读写,备节点实时同步数据但不承接流量,主节点故障时“备胎转正”;多活集群——多个节点同时读写,配合一致性哈希等策略分摊压力,故障时流量整体平移。
故障转移(Failover)依赖健康检查的结果自动完成,整个过程对调用方透明。假设每个单副本的可用性为 p,采用 n 副本冗余后,整体可用性会指数级提升。这就是为什么“多开几家店”在数学上是如此划算:
麻辣鲜的三家分店之间经常互相借调厨师——这就是“多活”的默契。一家店装修停业,另外两家默默多接一点单,客人永远吃得上饭。真正的多活架构,让“某一家店关门”这件事,从顾客感知中的“事故”降级为“背景噪音”。
- 单副本可用性 p一台特征服务器单独运行时的可用性,比如 0.99,即 99%。
- 单副本不可用概率 (1-p)这台机器坏掉导致服务不可用的概率,p=0.99 时就是 0.01。
- n 个副本同时不可用 (1-p)^n在副本相互独立的假设下,所有副本同时挂掉的概率是指数级下降的。两个 0.01 相乘是 0.0001。
- 整体可用性 S用 1 减去“全部不可用”的概率,就是“至少有一个副本能顶上”的概率,也就是冗余后的整体可用性。
健康检查机制
分店开了,怎么知道哪家店还活着、哪家已经悄悄歇业了?麻辣鲜的后厨装了三样东西:灶台上的温度传感器实时监控炉温,烟雾报警器负责异常报警,每天早上 10 点还有例行巡检检查燃气管道。有了这些“探针”,值班经理才能在第一时间发现异常,而不是等顾客投诉了才知道后厨出事。
特征服务的健康检查机制就是这套“传感器+巡检”体系。监控系统以固定周期向特征服务节点发送探活请求(Liveness Probe),或读取服务主动上报的心跳信号(Heartbeat),根据响应判断节点是“健康”还是“亚健康”。只有通过健康检查的节点才有资格接收流量,异常节点会被自动摘除(异常隔离)。探活通常用最轻量的 HTTP/2 或 gRPC 健康检查协议,避免探活本身给服务带来额外压力;心跳则适合长连接场景,服务主动把状态推送给注册中心。
一个常见的工程细节是:连续 N 次探活失败才判定节点故障,防止瞬时网络抖动导致误杀。对判定故障的节点,编排系统会自动重启容器或拉起新实例,实现“自愈”。自愈能力用自愈率衡量——就像火锅店考核“多少故障是系统自己解决的,不用麻烦老师傅”:
就像麻辣鲜的温度传感器一旦检测到炉温异常,会自动切断燃气并启动排风——这种“自动反应”不需要老师傅到场。自愈不是玄学,而是把老师傅的应急经验固化成了系统代码。
- 故障总数 N<sub>故障总数</sub>统计周期内检测到的所有故障次数,包括自动恢复的、人工介入的。
- 自动恢复数 N<sub>自动恢复</sub>其中由系统自动重启、自动切换、自动回滚而恢复的次数,整个过程不需要人点击按钮。
- 自愈率比值自动恢复数除以故障总数,再乘 100%,得到自愈率。它衡量的是“系统自己处理意外”的能力,自愈率越高,团队夜里被电话吵醒的次数越少。
数据一致保障
分店多了,又出现一个新问题:每家店都要准备食材,可总店的库存台账只有一份。傍晚六点,总店把“今天进了 100 斤毛肚”记在账上,分店如果看不到这条记录,就会按旧台账丢单或者超卖。火锅店最怕的,不是食材不够,而是两家店的台账对不上。连锁店最关键的经营动作,是让所有分店在任一时刻拿出的清单都一致。
特征服务的“食材”是特征值——用户画像、点击序列、风控标签。多活架构意味着多个节点同时对外服务,必须保证任意节点读到的特征数据是一致的。否则同一个用户上一秒命中“高价值客户”特征,下一秒换了个节点就变成“普通用户”,模型推理结果就会抖来抖去。这份“台账”通常放在内存缓存(如 Redis)或特征数据库中。数据一致性保障主要通过同步复制实现:主节点写入特征后,必须等待备份节点确认收到才算成功(强一致),或用异步复制换取更低延迟(最终一致)。
除了写入时同步,还要做定期校验对齐,比对主备特征库的哈希、条数、时间戳,发现漂移及时修复。当主数据源不可用时,降级策略允许回退到最近一份缓存快照——虽然不是最新,但服务不中断。降级后的整体可用性可以用一个简单公式估算:
麻辣鲜的解决办法是“双人记账”:总店入库时,分店的系统同步记账,每晚再对一次总账。虽然多花了一点对账时间,但换来的是任何时刻、任何分店拿出的食材清单都一致——这就是数据一致性对特征服务的意义。
- 主源可用性 A<sub>主</sub>主特征数据源单独运行时的可用性,比如 0.99。
- 主源不可用概率 (1-A<sub>主</sub>)需要降级到备源的那部分时间比例,比如 0.01。
- 备份兜底 (1-A<sub>主</sub>)×A<sub>备</sub>在主源不可用的前提下,备源还能正常服务的概率。乘法表示“主挂了且备是好的”同时发生。
- 总可用性 A<sub>总</sub>主源直接可用加备源兜底可用两部分相加,得到降级后的整体可用性,一定大于单独主源的可用性。
容灾演练体系
没有哪家火锅店是装好灭火器就高枕无忧的。真正靠谱的店,每季度都会做一次消防演习:拉响警铃、模拟火点、让服务员真的把客人按逃生路线疏散一遍。第一次演习时大家手忙脚乱、挤在楼梯口,第三次时三分钟就能全员撤到安全区。容灾能力不是靠“纸上预案”堆出来的,是靠一次次演习“练”出来的。没有验证过的架构,再完美也等于零。
特征系统的容灾能力同理。混沌工程(Chaos Engineering)正是通过主动注入故障——杀掉某个节点、引入网络延迟、耗尽内存——来验证系统在“意外”下是否真的能稳定运行。它遵循“假设-实验-验证”循环:先定义系统的稳定状态(如 P99 延迟小于 50ms),再设计故障注入实验(如随机杀死集群中一个节点),观察系统是否仍处于稳定状态。演练要在灰度环境或低峰期循序渐进,控制爆炸半径,演练后必须复盘(Postmortem),把薄弱环节修复后再演一次,形成闭环。
故障恢复的总耗时并不是“切换的那一下”,而是从故障发生到完全恢复的全部时间。可用 MTTR 拆解来审视每一段耗时,找到拖慢恢复的瓶颈:
麻辣鲜老板每年给员工做两次消防演习,不是为了应付检查,而是为了真着火时,服务员能下意识地喊出“这边走”。故障演练也是这样——让“点击切换按钮”变成肌肉记忆,真故障来时才不会手忙脚乱。
- 发现时长 T<sub>发现</sub>从故障发生到监控告警响起的时间,由健康检查频率决定,比如 5 秒。
- 定位时长 T<sub>定位</sub>从收到告警到确定根因的时间,依赖日志、链路追踪等可观测性工具。
- 恢复时长 T<sub>恢复</sub>执行切换、重启、回滚动作的时间,预案越清晰、工具越自动化,这段越短。
- 验证时长 T<sub>验证</sub>确认流量恢复、数据正确的时间。四段相加才是完整的 MTTR,任何一段过长都会拖慢整体恢复。
核心指标度量
外卖平台评价一家火锅店好不好,看的是“出餐速度”和“准时率”。容灾能力也需要一套数字化的“评分体系”,否则“我们容灾做得不错”只是一句自我感觉良好的话。没有数字,就没有管理;没有指标,就没有改进的方向。容灾领域最核心的两个指标是 RTO 和 RPO,此外还有可用性 SLA 和容量冗余设计。
RTO(Recovery Time Objective,恢复时间目标)衡量“要多快恢复服务”;RPO(Recovery Point Objective,恢复点目标)衡量“最多能丢多少数据”。实时风控要求 RPO=0(一笔交易的特征丢了可能导致资损)、RTO 通常小于 30 秒;内容推荐可以接受 RPO=1 分钟、RTO=5 分钟。SLA(服务等级协议)是向业务方的承诺,比如“四个九”99.99% 的可用性。容量冗余则要求备用集群至少要能扛住峰值流量的 120%,否则真正切换时备集群自己就先垮了。
RTO 和 RPO 的定义可以写成两个简洁的时间窗口公式:
麻辣鲜的老板用数据管理分店:若每家店能在 5 分钟内恢复出餐(RTO=5min)、最多允许丢一桌的预定记录(RPO≈10min),那这就是一家让顾客安心的店。数字越清晰,管理越从容。
- RPO 的计算故障发生时刻减去最近一次成功备份的时刻,得到“数据丢失窗口”。这个值越大,丢失的数据越多。
- RTO 的计算服务恢复完成的时刻减去故障发生时刻,得到“服务中断窗口”。这个值越大,业务空转越久。
- 目标设定示例在风控场景通常要求 RPO=0(数据零丢失)、RTO<30 秒,这两个值直接写入 SLA,作为容灾等级的标尺。RPO 和 RTO 共同定义了“容灾等级”。
工程实践落地
最顶级的容灾能力,不是写在 PPT 里的,而是融化在日常操作里的。麻辣鲜有一本厚厚的《后厨标准作业手册SOP》,贴在墙上,新人入职第一周就要跟着老师傅逐条过一遍。容灾的工程实践,就是把这套 SOP 变成系统的自动化能力。从设计到运维,每一个环节都有标准动作。
特征服务容灾的工程落地,核心是四个自动化:监控告警负责“看得见”问题——采集请求量、成功率、P99 延迟、缓存命中率等指标,配合 Prometheus + Grafana 形成告警闭环;自动拉起负责“睡得着”觉——Kubernetes 等编排平台检测到 Pod 异常即刻重建;限流熔断负责“死不了”机——令牌桶限流和熔断器保护服务不被洪峰打垮,快速失败并降级到默认特征;灰度发布负责“不惹祸”上线——新版本只对 5% 流量生效,验证稳定后再全量。
这些机制共同的目标,是维持一个极高的成功率。容灾体系做得再好,最终都要落在“请求成功率”这张成绩单上:
SOP 手册的价值不在于写得多漂亮,而在于危急时刻有人照着做、系统自动做。麻辣鲜的炉火永远旺盛,不是因为运气好,而是因为从灶台到员工、从报警器到备用电源,每一个环节都有预案——这就是工程化容灾的日常。
- 总请求 N<sub>总请求</sub>统计周期内特征服务收到的全部查询请求数,包括成功的、失败的、被限流拒绝的。
- 成功请求 N<sub>成功</sub>其中返回了正确特征值且时延达到要求的请求数。注意:被限流“优雅拒绝”有时也计入成功(降级策略)。
- 成功率 S成功数除以总数再乘 100%,是容灾体系最终效果的“成绩单”。若 SLA 要求四个九,则成功率低于 99.99% 的时长即构成违约。
AI 应用场景
电商大促的流量洪峰
阶段:特征服务运维(容量规划与流量治理)
解决的问题:双11等大促场景特征请求量是平时的 10-20 倍,单一集群会因为容量不足被冲垮。传统做法是临阵盲目扩容备用机器,资源浪费且被动。AI 特征平台通过“限流熔断 + 自动扩容 + 多活调度”,在洪峰前预判容量提前扩容,洪峰中保护性限流,单个节点故障时秒级切换,保证推荐、搜索、广告的推理链路不中断。
具体案例:某电商平台大促期间,特征服务 QPS 从日常 5 万飙升至峰值 80 万。平台启动预案:主集群扩容至 3 倍、备用集群预热,负载均衡按机房距离就近分配流量;某一可用区发生网络抖动,健康检查在 3 秒内检出,流量自动切换到其他可用区,P99 延迟始终控制在 50ms 内。
金融风控的零丢失容灾
阶段:特征数据同步(强一致容灾)
解决的问题:风控模型依赖实时特征(设备指纹、交易序列)做欺诈判断,一旦特征丢失会导致漏判,直接造成资损。传统异步备份在机房故障时可能丢失最近几秒的增量数据。特征服务通过同步双写 + 跨机房强一致复制,确保 RPO=0,任何一次滑动窗口计算都不会丢特征。
具体案例:某支付公司的风控特征服务,主备集群跨两个城市部署。日常写入在 0.3 秒内同步到备机房,每月做一次“断网演练”:人为切断主集群入口流量,观察备用集群 30 秒内接管全部请求,数据零丢失,风控决策链路可用性达到 99.995%。
特征中台的多业务隔离
阶段:特征平台架构(多业务故障隔离)
解决的问题:大公司里推荐、搜索、广告、风控共用一套特征中台,一个业务的流量异常会拖垮其他业务的推理链路。传统单体架构缺乏故障隔离,一次爬虫攻击就能让全公司推荐系统瘫痪。特征平台通过微服务化拆分 + 独立熔断 + 容灾分组,把故障限制在“一个厨房里”,其他厨房照常出餐。
具体案例:某互联网公司推荐业务突发流量尖峰,短时间内打满特征服务连接池。由于平台按业务划分容灾分组并配置独立熔断器,搜索和广告业务的特征请求自动绕开过载分组,成功率保持 99.99%,只有推荐业务自身经历了 2 秒的限流降级。
Python 演示
import time def now(): return time.strftime("%H:%M:%S") class FeatureServer: """模拟一个特征服务节点""" def __init__(self, name): self.name = name self.healthy = True self.request_count = 0 def serve(self, feature_name): if not self.healthy: raise RuntimeError("{} 已宕机".format(self.name)) self.request_count += 1 return "{}:v1.0".format(feature_name) def crash(self): self.healthy = False def recover(self): self.healthy = True class FailoverManager: """容灾管理器:通过心跳探活自动进行故障转移与回迁""" def __init__(self, primary, backup, check_interval=0.2): self.primary = primary self.backup = backup self.check_interval = check_interval self.active = primary self.switch_count = 0 def probe(self, server): """向指定节点发一次心跳探活""" try: server.serve("__health__") return True except RuntimeError: return False def tick(self): """周期性健康检查,必要时执行故障转移""" primary_ok = self.probe(self.primary) backup_ok = self.probe(self.backup) if primary_ok: if self.active is self.backup: print("[{}] 主节点恢复,流量自动回迁".format(now())) self.active = self.primary elif backup_ok: if self.active is not self.backup: print("[{}] 主节点故障!故障转移到备份节点".format(now())) self.active = self.backup self.switch_count += 1 else: print("[{}] 主备均不可用,服务降级".format(now())) def query(self, feature_name): """业务请求统一通过活跃节点处理""" try: value = self.active.serve(feature_name) return "OK", value except RuntimeError: return "FAIL", None def main(): print("=== 特征服务容灾模拟器 ===") primary = FeatureServer("主节点") backup = FeatureServer("备份节点") manager = FailoverManager(primary, backup) for i in range(12): if i == 4: primary.crash() print("[{}] 模拟主节点宕机!".format(now())) if i == 9: primary.recover() print("[{}] 模拟主节点修复".format(now())) manager.tick() status, value = manager.query("user:123:click_num") print("[{}] 第{}次请求: {} {}".format(now(), i + 1, status, value)) time.sleep(0.2) print("故障转移次数: {}".format(manager.switch_count)) if __name__ == "__main__": main()
class FailoverManager:容灾管理器封装了探活、切换、回迁三大核心动作,是容灾的“大脑”。def probe(self, server):向节点发一次心跳探活,用 try/except 把异常转换成布尔值,干净利落。def tick(self):每个周期执行健康检查并做出切换决策,是容灾循环的心脏。if self.active is self.backup:判断当前流量是否已切到备份节点,避免主节点恢复后重复切换。self.active = self.primary主节点恢复后把流量自动回迁,保证主节点的资源被重新利用。manager = FailoverManager(primary, backup)组装主备关系,指定检查周期,一行代码启动容灾能力。primary.crash()模拟故障注入,验证容灾系统是否按预期工作,这就是最小版的“混沌工程”。
常见误区
误区以为容灾就是堆硬件,只要有钱买很多服务器,把集群做大了就高枕无忧。反正机器多,坏一台还有一堆。
正解容灾是完整的系统设计,买服务器只是硬件冗余这一环。真正的容灾包含故障检测、自动切换、数据同步、演练验证等完整闭环。就像火锅店买再多的灶台,不培训员工学会换灶、不装烟雾报警器,火灾来了照样抓瞎。没有健康检查、故障转移和演练的“多台机器”,只是一堆昂贵的摆设。
为何常见:容灾最直观的成果就是“多了一套设备”,而检测、切换、演练这些看不见的功夫容易被忽略。
误区以为做了主备或多活,任何故障时所有请求都能无缝继续,不需要限流、熔断、降级这些“认怂”的机制。
正解多活解决的是“节点挂掉”,但无法解决“集群整体容量不足”或“上游依赖故障”。双11流量翻倍时,即使三活也可能被打垮。就像火锅店有三间厨房,但全城停水停电,三间厨房一起歇业,你得有个用煤气罐+桶装水的终极预案。限流熔断不是认怂,是保护核心链路活下来的最后防线。
为何常见:把容灾等同于“冗余”,忽略了各种极端场景下的容量天花板。
误区把健康检查间隔设成 1 毫秒,以为这样能秒级发现故障、秒级切换,检查得越勤越安全。
正解健康检查本身会消耗资源、增加延迟。过高的检查频率可能在网络抖动时误判,引发频繁切换,甚至导致双主脑裂。一般设置 3-5 秒的检查间隔,配合“连续失败 N 次才判定故障”的机制。就像给灶台测温,每秒钟测一次既浪费电又容易误报,每 30 分钟测一次就足够发现问题。
为何常见:人总是高估“多查几遍”的好处,低估频繁探活对系统的额外压力和误判风险。
误区异步复制延迟低、性能好,偶尔丢几条特征值没关系,反正特征本身就是近实时的,不用太较真。
正解必须区分业务场景。风控、交易等强一致场景 RPO 必须是 0,丢了特征值意味着钱收不回来;实时推荐等弱一致场景可以用异步复制。容灾设计的第一步就是明确“业务能容忍丢多少数据”,再决定同步策略。就像火锅店收银台账,普通等位可以大概记,但外卖订单的金额绝不能记错。
为何常见:把推荐系统的经验套用到风控系统,忽略了业务对数据丢失的敏感度差异。
误区系统刚上线时做过一次故障演练,验证通过后就再也不练了,反正架构没变过。
正解系统在持续变化——新代码、新配置、新数据量,上次验证通过的容灾能力可能因为一次发布就失效。混沌工程讲究常态化故障注入,大促前至少做一次全链路压测和演练。就像消防演习,如果只在开业时演过一次,三年后员工换了一茬,真着火时没人知道灭火器在哪。
为何常见:认为系统结构稳定不变,低估了持续变更对容灾能力的侵蚀。
面试题
Q1. 特征服务健康检查失败后,首选的动作是什么?
- A.直接重启所有服务
- B.将流量切换到备用节点← 正确答案
- C.通知开发排查日志
- D.扩容集群容量规模
答案:B。检测到主节点故障后的第一响应是故障转移,把流量切到健康节点保证业务连续性。重启是恢复手段,通知排查是后置动作,扩容是容量手段,都不是故障转移的首选。
Q2. 特征服务容灾中,RTO 表示什么?
- A.允许丢失的数据时长
- B.服务恢复的最长时限← 正确答案
- C.备份的最近时间点
- D.平均无故障的间隔
答案:B。RTO(恢复时间目标)衡量从故障发生到服务恢复的最大可接受时间,回答“要停多久”。RPO 才是丢数据的容忍度,MTBF 是平均无故障时间,最近备份点是 RPO 计算中的一部分。
Q3. 集群可用性为 99.99%(四个九),一年内允许的停机时间约为多少?
- A.约 52.6 分钟← 正确答案
- B.约 24 小时
- C.约 8.8 小时
- D.约 5 分钟
答案:A。一年约 525600 分钟,99.99% 可用意味着不可用时间 = 525600 × (1-0.9999) ≈ 52.56 分钟。约 8.8 小时对应的是三个九(99.9%),约 24 小时对应约 99.73%,约 5 分钟对应约 99.999%。
Q4. 以下哪些属于特征服务常见的故障类型?
- A.机房断电← 正确答案
- B.特征缓存雪崩← 正确答案
- C.发布时配置错误← 正确答案
- D.模型精度下降
答案:ABC。机房断电是基础设施故障,缓存雪崩是依赖故障,配置错误是软件故障,三者都会直接导致特征服务不可用。模型精度下降是模型质量问题,不直接导致服务的可用性故障,不在容灾范围内。
Q5. 主备架构中,主节点故障切换后恢复,以下哪种处理最合理?
- A.强制立刻回迁流量
- B.数据追平后平滑回迁← 正确答案
- C.备份节点继续充当主节点
- D.直接废弃原主节点
答案:B。主节点恢复后应等待数据同步追平,再通过权重调整平滑回迁,避免强制切换导致数据分叉或短暂不一致。A 会引入一致性问题,C 增加备份节点长期单点风险且浪费主节点资源,D 造成资源浪费。
Q6. 关于混沌工程(故障演练),以下说法正确的是:
- A.可以提前发现系统薄弱环节← 正确答案
- B.演练必须在线下环境进行
- C.需要先定义稳定状态假设← 正确答案
- D.每次演练都应扩大爆炸半径
答案:AC。混沌工程通过受控实验主动注入故障验证系统韧性,核心是“假设-实验-验证”。A 和 C 是基本原则。B 不准确,生产环境可做小范围实验;D 也不对,爆炸半径应循序渐进,而非每次都扩大。
Q7. 特征服务配置限流阈值时,主要参考哪个指标?
- A.当前请求成功率
- B.上游峰值QPS与安全系数← 正确答案
- C.特征平均条数
- D.缓存命中率
答案:B。限流阈值应基于系统能承受的峰值容量除以安全冗余系数设定,保证洪峰时保护自身。成功率是结果指标,特征条数和缓存命中率不直接决定限流阈值。
Q8. 特征数据同步中,RPO=0 意味着什么?
- A.不允许丢失任何已确认的数据← 正确答案
- B.恢复时间必须严格为零
- C.备份节点需瞬间完成切换
- D.数据压缩率必须严格为零
答案:A。RPO=0 指故障发生时已确认的数据完全不能丢,必须用同步复制实时备份。RTO=0 才要求恢复时间为零,切换速度和数据压缩率与 RPO 无关。
Q9. 以下哪些属于特征服务的高可用架构?
- A.主从热备← 正确答案
- B.多活集群← 正确答案
- C.服务限流
- D.自动故障转移← 正确答案
答案:ABD。主从热备提供冗余节点,多活集群提供多地域并发读写,自动故障转移是切换能力,三者都是高可用架构的组成部分。限流属于流量治理手段,不是架构模式。
Q10. 某特征服务 MTBF 为 90 天、MTTR 为 1 小时,其可用性约为多少?
- A.99.95%← 正确答案
- B.99.88%
- C.98.90%
- D.99.99%
答案:A。A = MTBF/(MTBF+MTTR) = 90×24/(90×24+1) = 2160/2161 ≈ 0.999537 ≈ 99.95%。若 MTTR 约 2.6 小时才会是 99.88%;98.90% 意味着 MTBF 约 90 小时量级;99.99% 需要 MTBF 超过 400 天。