生产踩坑
与工程化门禁同域的事故翻车专篇:十组共 82 卡(K 前缀)。回答「线上真实怎么翻车、如何识别与止血」——门禁在 G,叙事与值班动作在 K。
事故是反器;骨架见 核心方法论。
阅读口径:本篇是事故速查卡,每张按「事故叙事 → 识别要点 → 止血与复盘」给出该事故独有的信号与动作;分区归因、复盘三问、补门禁字段与季度抽检这类共性方法统一在此说明,不逐卡复述。判据是能否凭卡内信号在监控上复现这次事故,而不是卡面是否覆盖了所有检查项;对应的准入门禁见 G 篇。
与方法论、工程化门禁并列,专记事故怎么认、怎么停。门禁在 G,翻车叙事在 K;思维纪律在 M06。
- M06:为什么要有纪律(思维)。
- G:上线前勾什么(门禁)。
- K:线上真实怎么翻车、如何识别与止血(事故模式)。
- K 篇十组与工程化要点 G01~G10 一一对应;G11 为组织治理新增组,暂无 K 对位,便于互链对照「门禁被绕过会怎样」。
- 每卡三层:事故叙事 → 识别要点 → 止血与复盘(对齐 G 的洞察 / 原理 / 表达)。
- 导图:生产踩坑心智地图;细节与值班顺序以本页「止血与复盘」层为准。
- 按事故域选组:发布 K01、可观测 K02、容量 K03、数据 K04、缓存 K05、调用 K06、AI K07、安全 K08。
- 先读同行 G 卡门禁,再用本卡核对若门禁被绕过的信号与回滚窗。
- 值班时优先抄「止血与复盘」层的顺序,事后把缺口写回 G 门禁字段与变更单模板。
阅读建议:先扫十组标题建立索引;出事时按组打开对应 K 卡跟值班顺序走。细节门禁与变更单字段以工程化 G 页为准,本页只补事故模式与止血路径。
K01 发布变更事故
发布变更事故组:覆盖灰度未卡点直推全量、回滚演练造假(只演镜像未演配置)、金丝雀阈值该回没回/乱回、比例表被绕过、观察指标选错误判健康、回滚镜像与配置版本不一致、窗口外强发、回滚后未做数据补偿。识别信号看卡点指标与回滚窗;止血先缩流量再对齐版本与补偿。
变更在观察窗口未结束时被人工扩到全量,错误率在扩量后 3 分钟才被业务投诉发现;回滚镜像可用但配置中心仍是有毒开关。
门禁缺一:没有卡点指标就没有否决权;回滚只退镜像不退配置等于假回滚。爆炸半径 = 批大小 × 暴露时长;观察窗口要覆盖依赖传播与缓存刷新。
值班顺序:①冻结扩量 ②看卡点看板(成功率/P99/依赖饱和)③三维回滚(镜像+配置+流量)④保留现场 Trace/变更单号 ⑤复盘写清「谁拥有否决权」。互链 G01.01 / M11.01。
预发只演了 kubectl undo,生产事故时配置中心仍是有毒版本,回滚「成功」但故障仍在。
回滚三维:镜像 + 配置 + 流量。演练缺任一维 = 假合格。
止血:三维回滚;复盘:演练清单强制三联勾选。互链 G01.01 / K01.01。
自动回滚阈值阈值写错或信号选错,导致故障继续全量或正常流量被误杀回滚。
看:金丝雀错误率与业务成功数是否同向;回滚是否绑定变更单;人工覆盖是否留痕。
止血:立刻人工接管比例/回滚;复盘改信号与阈值演练。互链 G01.05。
把回滚阈值与业务成功数放在同一张时间序列上验:若错误率越阈而回滚未触发,先查阈值写成绝对值还是相对基线;若成功数正常却被回滚,则是信号选成了易受流量波动影响的比率。两类误判不能靠同一套调参修复。
有人用紧急通道绕过灰度比例直接全量,故障面瞬间扩大。
看变更单是否走加急、有无比例与观察窗。
止血:立刻切回旧版;复盘封堵绕过路径。互链 G01。
发布流水里若同一变更单带「加急」且比例表记录缺失,即可坐实绕过;修复不是补审批,而是让紧急通道复用同一比例表并强制留下观察窗,否则下次仍无证据判断当时放量到哪一步。
金丝雀只看 CPU 健康,业务错误率已炸仍放量。
看业务成功数/资金类指标是否同向。
止血:按业务指标回滚;复盘改信号。互链 G01.05。
卡点指标必须业务可感:把 CPU 曲线与业务成功数叠看,两者背离时以业务成功数为准。若灰度通过而资金或成功率同期下滑,说明指标与用户可感结果脱钩,扩容或重试都救不回这类误判。
回滚了应用镜像却留下新配置,二次故障。
看配置中心版本与镜像 digest 是否配对。
止血:配对回滚;复盘变更原子性。
回滚后要同时核对镜像 digest 与配置中心生效版本:两者任一未退回即属假回滚。更隐蔽的是配置带灰度开关,镜像退回后旧开关仍对新代码生效,故回滚演练必须覆盖「配置+镜像+流量」三维。
大促/错误预算红线仍强推功能,放大事故。
看预算板与窗口表。
止血:冻结变更;复盘问责加急滥用。
冻结窗口与错误预算耗尽应由发布平台自动阻断,而非靠值班口头拦;判据是查变更单时间戳与预算板余额,若预算已红仍放行,说明冻结逻辑没接到流水线上,只写在制度里。
代码回了,脏数据/半成功单仍在。
看对账与状态机残留。
止血:冻结写入并跑补偿;复盘强制修复门禁。
代码回滚后扫状态机残留:已扣款未终态、半成功订单、已发未对账的消息。若有任一残留且无补偿脚本,则服务虽恢复但资金面仍有缺口;这类损失不体现在错误率上,只能靠对账发现。
K02 可观测失灵
可观测失灵组:有监控找不到人(告警不可行动)、采样过低关键故障无跨度、TraceId 跨 MQ/线程池断裂、告警风暴淹没关键告警、仪表盘无可下钻、错误日志无变更单号、临时 Debug 忘关、Runbook 链接 404。先恢复可行动告警与证据链,再谈根因。
凌晨告警风暴:CPU/存活探针全绿,但下单成功率已掉到 80%;值班不知先看哪块板、Runbook 链失效、Oncall 路由到已离职账号。
指标发现异常、追踪定位路径、日志给上下文;告警必须绑定责任人与 Runbook。业务成功率优先于资源指标放行。
值班顺序:①先确认用户可感指标(成功率/关键路径)②用 TraceId 抽一条失败请求 ③对照 Runbook 止血动作 ④告警降噪(合并/静默非行动项)。互链 G02 / M14.02。
事故时段采样率过低,只有日志碎片,无法拼出跨服务路径,排障靠猜。
错误与慢请求应必采;成本优化不能牺牲事故可复盘性。
止血:临时提高采样/全量错误;复盘:改采样 ADR。互链 G02 / G02.04。
入口有 Trace,过了 MQ 或线程池后全断,排障只能猜下游。
看:生产者/消费者、线程池包装、定时任务是否传递上下文;采样是否只采入口。
止血:临时提高采样+按业务键搜日志;复盘修上下文传递。互链 G02.01/G02.05。
抽一条跨异步边界的请求,逐跳比对 traceId 是否连续;断点固定在生产者序列化、线程池包装与定时任务三处。若消费者侧 traceId 重新生成,则链路在异步处被截断,采样率再高也拼不回全链路。
低价值告警刷屏,真正致命信号无人看。
看告警量、抑制与路由。
止血:临时抑制噪声;复盘可行动化。互链 G02.03。
用抑制后的「有效告警数/原始告警数」与值班首次确认时延两个量判断:若原始量暴涨而有效量不变、确认时延变长,说明缺分级与抑制,而非监控不够。继续加告警只会稀释关键信号。
有图不能点到 Trace/日志,排障空转。
抽一条请求验证钻取。
止血:按业务键搜日志;复盘修联动。
随机抽一条异常指标点,验证能否一步跳到对应 Trace 与原始日志;若需人工复制业务键另开查询,则看板只是展示层。可行动告警必须自带下钻链接,且链接可达性要进季度巡检。
故障期无法关联最近发布。
看 baggage/字段字典。
止血:人工对照发布时间线;复盘 G02.05。
故障窗口内抽任意错误日志,检查是否含 change_id 并能反查发布单;缺失时只能靠时间线人工对齐,排障耗时随变更密度线性增长。字段注入应在脚手架层默认完成,不靠各业务自行埋点。
磁盘与成本打满,或泄敏感字段。
看采样与级别配置。
止血:立刻降级日志;复盘门禁。
日志级别与采样率应带自动失效时间:查当前生效的 Debug 配置有无到期字段,无到期即视为遗留。风险不只在磁盘,更在脱敏规则常只对常规级别生效,全量输出会把敏感字段带进日志。
告警可行动字段指向失效文档。
点开告警附属链接。
止血:口述止血并修链接;复盘链接巡检。
告警模板里的可行动字段必须做可达性巡检;链接失效的特点是平时零告警、故障时才发现,故应定期自动抓取所有 Runbook 地址校验状态码,而不是等值班点开才暴露。
K03 容量假可用
容量假可用组:池子与 K8s limit 不一致、HPA 抖动无冷却、单副本假高可用、只扩副本不扩连接池、虚拟线程打穿 DB、依赖单点未标故障域、限流预发/生产不一致、弹性扩容启动风暴。假可用的共性是「副本绿了、池子/依赖已红」。
HPA 加副本后吞吐不升:应用线程池/连接池仍按旧配额,Pod limit 已到顶;探针 Ready 但业务线程全堵在池等待。
应用池化与编排配额必须同一容量模型;拒绝路径要可观测(队列长度、拒绝计数、等待时间)。假可用 = Ready 真但工作队列已死。
值班顺序:①看池拒绝/等待指标 ②对照 Limit/Request 与池 max ③临时扩池或降流量 ④修齐容量模型再扩副本。互链 G03 / M12.04。
指标毛刺触发频繁扩缩,连接重建风暴,比不扩更糟。
弹性需要冷却与稳定窗口;扩缩本身也有成本。
止血:冻结 HPA / 固定副本;复盘:冷却参数与稳定窗口。互链 G03。
服务声明高可用但关键依赖单副本(DB/Redis/队列),峰值一抖全站不可用。
看:依赖拓扑是否单点;HPA 扩的是无状态副本还是带状态单点。
止血:降流量/切备;复盘补副本与配额。互链 G03。
把依赖拓扑逐节点标注副本数与故障域:只要 DB、Redis 或队列任一为单实例,服务层扩再多副本也不改变全站可用性。弹性伸缩扩的是无状态层,带状态单点必须单独做主备与故障域隔离。
Pod 多了,DB 连接打满集体超时。
看连接使用与拒绝。
止血:降副本或扩连接并限流;复盘联合预算。
扩容前算联合预算:实例数乘以每实例连接上限不得超过 DB 最大连接数。若只调副本数不调连接池,先出现的是获取连接超时而非 CPU 打满,误判为慢查询会走错止血方向。
VT 海量并发把连接池打空。
看活跃连接与 VT 数。
止血:信号量限流;复盘 G03.07。
虚拟线程移除了线程数约束,却没有移除连接池约束;需在入口加信号量把并发压到连接池水位以下。判据是活跃连接数长期贴顶而 CPU 不高,说明瓶颈在连接而非算力,扩线程只会加剧排队。
服务多副本,依赖 Redis 单机。
看拓扑。
止血:切备/降级;复盘标故障域。
服务多副本不等于高可用:逐个依赖标注所在机架与可用区,若两个「独立」副本共用同一缓存或同一交换机,故障域实为一个。演练应按故障域注入,而不是按实例关机。
预发宽松生产收紧或相反,误判容量。
比对配置。
止血:统一阈值;复盘配置同源。
压测结论迁移的前提是配置同源:比对预发与生产的限流配置哈希,不一致则容量结论不可复用。阈值应随制品一起下发并做漂移校验,禁止各环境手工维护一份「差不多的」配置。
冷启动慢+扩容风暴导致更不可用。
看启动 SLO 与扩容事件。
止血:限扩容速率;复盘启动与冷却。
冷却窗口必须大于实例冷启动耗时,否则新实例未就绪就触发下一轮扩容,形成正反馈。判据是扩缩事件间隔短于就绪时间且就绪率下降;此时先限扩容速率,再谈优化启动。
K04 数据变更翻车
数据变更翻车组:在线 DDL/修复不可回滚、回滚脚本未测二次损坏、大表未分批锁表、控制台手改无工单、回滚 SQL 未在类生产验证、主从延迟下切读错账、批量更新无限速、备份成功但恢复演练跳过。数据面事故优先停写与评估回滚窗口,禁止继续「再修一把」。
高峰锁表改列导致写入堆积;数据修复 SQL 无备份窗口,误删后只能从昨日冷备恢复,RPO 不可接受。
DDL/数据修复默认按发布:可回滚或可补偿;在线 DDL 工具与锁等待监控是门禁。不可逆变更必须写补偿方案而非口头「再改回来」。
值班顺序:①停变更/杀长事务 ②看锁等待与复制延迟 ③回滚或切只读止血 ④用备份/补偿恢复 ⑤补门禁字段。互链 G04 / M08.05。
前向 DDL 失败后执行未演练的回滚 SQL,造成二次数据损坏。
回滚脚本与前向脚本同等门禁;不可逆则走补偿而非回滚。
止血:停变更、切只读、从备份恢复;复盘:回滚演练证据。互链 G04。
在线大表 DDL/数据修复不分批,锁表或长事务拖垮业务。
看:变更窗口、锁等待、复制延迟、是否可回滚脚本。
止血:杀会话/回滚变更;复盘强制分批与影子表。互链 G04。
在线 DDL 与批量修复的分批粒度要能被中断:脚本按主键区间切片、每批提交并留批次号,任一时刻可停在批次边界。若执行计划显示全表扫描或无回滚脚本,应在预发拦截而非现场杀会话。
紧急手改留下不可追溯状态。
看审计。
止血:对账修复;复盘禁手改。
数据变更的可追溯性判据是能否回放「谁在何时把哪几行从什么值改成什么值」;控制台直连通常只有 binlog 而无业务语义,故修复必须走工单加可回放脚本,且双人审批覆盖执行窗口。
回滚脚本加错条件二次损坏。
看演练。
止血:停脚本并恢复备份;复盘强制演练。
回滚脚本必须在与生产同构的数据分布上演练,重点验 WHERE 条件的影响行数是否与预期一致;类生产数据稀疏会让条件漏匹配或超范围匹配,脚本在空库「跑通」不代表安全。
延迟很大仍读从库做资金判断。
看延迟指标。
止血:切主读/冻结;复盘延迟门禁。
资金类读必须走主库或等位点:把复制延迟与业务契约写清,超阈即切主读或降级。判据是「写后立即读」用例返回旧值,此时错误不会报错,只表现为余额或状态对不上,属静默错账。
一条 UPDATE 扫全表。
看锁等待。
止血:杀会话;复盘分批。
批量 UPDATE 应有 LIMIT 与批次间隔,并用锁等待与长事务指标设中止线;单条扫全表时即使最终成功,也会在持锁期间阻塞同表所有写入,故障表现为无关接口集体变慢。
真要恢复时发现权限/空间不够。
看最近恢复记录。
止血:开紧急备份通道;复盘演练门禁。
备份成功日志不是可恢复性证据:只有定期做一次真实恢复到指定时间点、并校验行数与关键业务单据,才能确认权限、空间与介质都可用。未经演练的恢复路径在事故当天几乎必然卡在非技术环节。
K05 缓存误判
缓存误判组:穿透击穿雪崩值班误判、逻辑过期长期脏读、缓存与 DB 双写顺序反了、空值未缓存穿透、热点 key 未拆分、对账缺失、本地缓存 TTL 过长、大 key 阻塞。先区分穿透/击穿/雪崩再动手;一致窗口与回源配额必须同时看。
把击穿当穿透:热点 key 过期瞬间打爆 DB;或雪崩时关掉缓存「直打 DB」二次放大;大 key 驱逐引发局部抖动被当成全网故障。
穿透=无数据乱查;击穿=热点过期;雪崩=大批同时失效。处置不同:空值/布隆、互斥重建/逻辑过期、随机 TTL/预热;失败可降级写进契约。
值班顺序:①分型(穿透/击穿/雪崩/大key)②看 DB QPS 与缓存命中 ③开互斥/降级开关 ④禁「关缓存直打」除非配额确认。互链 G05 / M07.02。
逻辑过期开关打开后异步刷新失败,用户长期读到脏数据却无告警。
逻辑过期必须有刷新失败告警与降级路径。
止血:关闭逻辑过期或强制重建;复盘:刷新失败告警。互链 G05。
先删缓存再写库或相反顺序不统一,并发下长期脏读或击穿。
看:写路径顺序是否契约化;逻辑过期是否在刷。
止血:缩短 TTL/旁路读库;复盘统一顺序与对账。互链 G05。
写路径顺序要契约化并压测并发:删缓存与写库的先后一旦在两条链路上不一致,就会出现长期脏读。判据是同一 key 在并发写后缓存值与库值持续不一致,而单条链路自测都通过。
恶意/不存在 key 打爆 DB。
看回源 QPS。
止血:空值短 TTL/布隆;复盘护栏。
对不存在的 key 观察回源 QPS 与慢查询是否同步抬升:若缓存命中率不变而库压力陡增,多半是空值未占位或布隆误判放行。短 TTL 空值缓存与参数校验要同时上,单靠一个挡不住恶意构造。
单 key 打满分片。
看热点榜。
止血:本地缓存/拆 key;复盘预热。
单分片 QPS 显著高于其他分片、而集群总容量仍有余量,即可判定热点倾斜;此时加机器无效,需本地缓存或拆 key 打散。大促前应以热点榜驱动预热,而不是等过期后自然重建。
长期脏数据无人知。
看对账任务。
止血:抽检修复;复盘对账 SLA。
脏数据若无人主动比对就不会暴露:设定期抽样任务按业务键比对缓存与库值并统计差异率,差异率非零且长期不收敛即为对账缺位。对账任务本身要有成功率告警,否则挂了也无人知。
发布后节点间看到旧配置/旧价。
看版本。
止血:广播失效/重启滚动;复盘广播。
发布后随机抽多个节点读同一配置,若返回值不一致,说明本地缓存缺失效广播或版本字段。滚动重启能掩盖问题但会在下次发布重现,正确判据是失效广播到达率与版本收敛时延。
大 value 阻塞 Redis。
看 bigkey / 延迟。
止血:拆分/异步删;复盘容量评审。
bigkey 扫描结果要与缓存延迟毛刺按时间对齐,才能确认阻塞来自单 key 操作而非网络抖动;删除大 value 须走异步分批,同步删除会在删除瞬间制造一次同样量级的阻塞。
K06 调用放大
调用放大组:超时×重试放大与双写无对账、幂等缺失重复扣款、熔断误开全站降级过久、超时倒挂、幂等键只用内存、半开探测流量过大、双写无顺序、对账任务失败无人值守。止血先砍重试/收超时/收半开,再补幂等与对账。
下游慢导致超时,客户端重试 3 次 × 扇出 5 = 流量 15 倍;双写库存与消息无对账,出现「库有单、消息无」长时间无人知。
同步链路预算入契约;超时与重试必须乘积可算。双写用 Outbox/CDC + 对账任务;无对账的双写是定时炸弹。
值班顺序:①算放大倍数并降重试/熔断 ②对齐超时预算 ③双写差异走对账补齐 ④改参数可回滚。互链 G06 / M11.02/04。
超时重试成功但业务无幂等,出现重复扣款/重复下单。
重试前提是幂等;否则重试是事故放大器。
止血:停重试、对账补偿;复盘:幂等键门禁。互链 G06。
熔断阈值过敏或半开缺失,长时间全站降级,业务静默受损。
看:熔断打开时长、半开成功率、降级是否用户可感。
止血:调阈值/强制半开观察;复盘 G06.05 观察窗。互链 G06。
熔断打开时长与半开成功率要一起看:若打开后长期不尝试恢复,降级本身就成了新的可用性损失。判据是下游已恢复但熔断仍处于打开态,且降级是否用户可感缺乏埋点,业务静默受损难以及时发现。
上游超时短于下游,重试风暴。
看预算表。
止血:降重试/对齐超时;复盘预算门禁。
把链路上各段超时按调用顺序列成预算表,下游总时限必须小于上游剩余时限;一旦上游超时短于下游并各自带重试,调用量按乘积放大。修法是统一预算表并在入口下发,而不是逐层各自调大。
重启后重复扣款。
看存储。
止血:冻结并人工对账;复盘落库幂等。
重启后重放同一业务键,若产生第二条流水即证明幂等状态未持久化;内存表只能挡单进程内的并发,跨实例与跨重启都失效。幂等键须由业务自然键生成并落唯一索引,不能依赖框架内存去重。
刚恢复又被打穿。
看半开比例。
止血:缩半开;复盘观察窗。
半开是受控实验:探测流量占比、成功阈值与失败再开条件要显式配置。若半开即放回全量流量,刚恢复的下游会被二次打穿;判据是半开期间错误率再次抬升且熔断重新打开,形成反复震荡。
缓存/搜索/DB 顺序各写各的。
看契约。
止血:停双写切单路径;复盘 Outbox。
缓存、搜索与库多写方若无统一顺序契约,终态取决于到达时序,表现为同一实体在不同存储里版本不一致。判据是并发写后各存储最终值不同且无版本号可判新旧;解法是收敛为单一写入源。
任务挂了差异累积。
看任务成功率。
止血:补跑并对账;复盘告警。
对账任务自身需要存活告警:若任务失败但无人察觉,差异会静默累积到资金核账时才暴露。判据是对账成功率与最近成功时间两个指标缺失,或差异表只增不减;这类失效不抛异常,只能靠任务可观测性发现。
K07 AI 静默塌方
AI 静默塌方组:无黄金集上线质量静默跌、索引切换未双跑召回塌、评测集过拟合、Prompt 热改无版本、工具副作用未分级、成本突增无熔断、影子流量对比缺失、评测集被业务刷题、模型别名未固定致静默漂移。AI 事故常「功能看似正常」——用黄金集/影子对比/成本熔断发现。
Prompt/工具/模型小改后线上无报错,但客服工单里「答非所问」翻倍;无黄金集回归,质量塌方靠人工偶然发现。
AI 变更与发版同级:制品版本化、黄金集卡点、工具副作用分级。静默失败比抛异常更危险。
值班顺序:①冻结扩量/回滚制品版本 ②跑黄金集 diff ③看工具调用副作用审计 ④补评测门禁再放量。互链 G07 / L03.01。
索引全量切换后召回率骤降,无双跑对比,客服工单滞后发现。
索引变更要双跑/影子对比与黄金集卡点。
止血:切回旧索引;复盘:双跑门禁。互链 G07 / K07.01。
黄金集分数很高,真实流量质量塌方——集与分布脱节或被「刷分」。
看:集外抽样、影子流量、线上反馈是否同向。
止血:回滚 Prompt/索引;复盘扩集与防刷分。互链 G07.05。
黄金集高分而线上质量塌方,先查集与真实分布是否脱节、以及近期是否有人为过门禁改了评测样本。判据是集内分数与集外抽样、线上反馈不同向;此时加训练数据无效,须扩集并冻结评测集变更权限。
无法回滚到已知好版本。
看制品库。
止血:切回上一版本;复盘版本化。
Prompt 必须与模型别名、索引版本一起进制品库并绑定发布单;判据是线上生效内容无法由任一版本制品复现。热改若无版本,回滚只能靠人工回忆,且无法回答「上一版到底改了什么」。
只读工具与下单工具同权。
看分级表。
止血:关高危工具;复盘分级。
只读与写类工具须在注册表声明副作用等级并被权限拦截:判据是下单、转账工具与检索工具共用同一授权。缺分级时模型一次误调用即产生真实副作用,事后无法靠输出过滤补救。
账单异常后才发现。
看配额。
止血:降级/限流;复盘配额门禁。
把单位任务 token 成本做成实时指标并绑配额:账单异常才发现的共同点是成本只进财务系统、不进告警链路。判据是成本环比抬升但无降级动作触发;配额耗尽应切小模型或限流,而非事后申请预算。
灰度无对照,质量问题后知后觉。
看影子任务。
止血:扩对照;复盘门禁。
灰度若无对照组,质量变化无法归因于版本:应对同一批请求并行跑新旧链路并比对要点覆盖与拒答率。判据是灰度期间只有新版本指标、无基线对照,此时「没投诉」不等于「没退化」。
为过门禁改评测而非改模型。
看变更。
止血:冻结发布;复盘防刷分。
为过门禁改评测而非改模型,表现为评测集变更记录与通过率跃升时间高度重合、而集外指标不动。判据是评测集写权限与模型发布权未分离;防刷分须把评测集纳入独立审计并做集外抽样。
调用侧写的是供应商的模型别名(浮动名)而非 pin 到具体版本快照;供应商侧静默换版后,输出风格、指令遵循度、结构化字段成功率与单位 token 成本同时漂移。本地没有变更单、没有制品版本、也没有可回滚目标——发布记录全绿,质量塌方只能从工单与成本曲线倒推。
典型后果:静默质量劣化被当成「模型正常波动」,缺陷累积数周才暴露,且无法用回滚收敛。
四个同向信号:① 同一 Prompt、同一入参的输出指纹(首 token 分布、结构化字段漂移率、拒答率)偏离上周基线,而代码零变更;② 单位成本变化而非总量变化(换版常伴随计费口径或推理长度改变);③ 供应商 changelog / 状态页出现未订阅的版本更新;④ 评估回归分数在无发布日下降。
先分区归因(变更/依赖/容量/数据/配置);其中「依赖」侧漂移最易被误判为「模型正常波动」,须先用输入指纹证明输入未变,再怀疑模型侧。
止血顺序:① 切回上一已知 snapshot(若从未 pin 则临时指定一个固定版本)② 打开输出指纹与结构化字段兜底校验告警 ③ 对高价值链路加规则兜底,避免静默劣化继续放大。互链 G07 / K07.04 / K07.01 / L03.01。
复盘产出:模型版本纳入制品管理(生产 pin 具体 snapshot,别名只用于预发探路);输出指纹、拒答率、单位成本纳入与发版同级卡点;订阅供应商变更通告并进变更日历;同链路换版走影子双跑 + 黄金集卡点。
K08 安全应急踩坑
安全应急踩坑组:密钥/依赖漏洞应急与轮换踩坑、证书到期告警无 Runbook、临时豁免过期未收回、共享超级账号、临时防火墙忘收、密钥进仓库历史、CVE 豁免无到期阻断、证书监控只告警不跑通轮换。应急先缩权限与轮换密钥,再补审计与自动阻断。
CVE 紧急升级跳过最小回归导致启动失败;密钥轮换无双密钥窗口,全球鉴权失败;依赖漏洞修复后 SBOM 未更新,二次排查找不到版本。
密钥必须可轮换(双密钥窗口);供应链可追溯(SBOM/签名);CVE 快车道仍要最小回归与可回滚镜像。
值班顺序:①定级(泄漏/CVE/证书到期)②双密钥或回滚镜像止血 ③补最小回归再抬升 ④更新 SBOM 与吊销演练记录。互链 G08 / M10。
证书到期告警响了但无人知如何轮换,临期才发现双密钥窗口未准备。
告警不可行动等于没有告警;证书轮换要有双密钥窗口。
止血:紧急双证书/回滚;复盘:告警绑 Runbook。互链 G08.02。
CVE/权限临时豁免到期未自动阻断,长期带病运行。
看:豁免单截止日、自动阻断是否生效、责任人是否在岗。
止血:立刻收回豁免或补丁;复盘到期自动阻断。互链 G08.04。
豁免单必须带截止日与自动阻断,且到期动作不依赖责任人记得;判据是到期后依赖版本未升级或权限未回收,而系统未产生任何阻断事件。人工台账的到期必然被遗漏,唯有自动失效才可靠。
事故无法追责到人。
看审计。
止血:吊销共享号;复盘个人账号。
生产访问审计须能定位到自然人:判据是会话日志里出现共享账号且无法关联到个人工单。此时事故复盘写不出责任人,更无法做最小权限回收;共享号常以「应急方便」被引入,实际把追责能力整体让渡。
攻击面长期扩大。
看规则到期。
止血:收回;复盘到期自动删。
临时网络规则要带创建人、用途与到期时间,并由平台到期自动删除;判据是规则表里存在无到期字段或已过期仍生效的条目。攻击面扩大是静默的,不会触发任何告警,只能靠规则清单定期比对发现。
即便轮换,历史提交仍泄露。
扫仓库。
止血:轮换+清理历史策略;复盘扫描门禁。
轮换当前密钥不足以消除历史泄露:必须对仓库全历史(含已删除分支与标签)做密钥模式扫描。判据是新密钥启用后旧密钥仍可在历史提交中被检出;正确顺序是先清理历史与吊销,再轮换并加提交前扫描门禁。
带病运行数月。
看豁免单。
止血:补丁或收回;复盘 G08.04。
CVE 修复时限要与严重级别绑定并自动催办,豁免到期即阻断发布;判据是漏洞单长期处于「已接受风险」且豁免日期已过,却没有任何升级或重新审批记录。无时限的豁免等于永久带病。
临期才会发现流程不通。
看演练。
止血:紧急双证;复盘演练。
证书与轮换类流程要提前演练到「申请—签发—下发—生效」全链路,而不是到期当天验证;判据是最近一次端到端演练记录缺失。流程断点通常不在技术,而在权限审批与跨团队交接,只有临期才会暴露。
K09 数据生命周期/边缘/多模态 生产事故
覆盖数据漂移无人值守、端侧模型版本错配、多模态对齐失效三类事故;对应 L02.13/S14/S13 与 C12.44/45、A32。识别信号看分布监控与端云一致性;止血先隔离再回放根因。
评测集指标连续数周缓降,无人告警;复盘发现训练数据分布已偏移,旧向量语义漂移,模型在静默中劣化。
漂移是静默失效:training-serving skew 与概念漂移不抛异常只缓降;缺 PSI/KL 监控即失明。
值班顺序:①隔离受影响流量 ②拉血缘定位漂移数据集版本 ③回滚到上一稳定模型+数据快照 ④补漂移监控门禁。互链 G09.01 / A29.01。
事故信号:总量与耗时都正常,但核心意图通过率连续 3 天下滑、意图分布 PSI >0.2、检索片段来源占比突变;值班若只看「有没有报错」会完全漏掉这类静默退化。
回放与责任:按 dataset_ver / index_ver 回放重建当时的检索输入,定位到新渠道数据稀释了核心意图;责任人 = 数据 owner(非模型 owner)。预防机制:按意图分桶监测 + 漂移超阈自动冻结下游评测与训练,回写一条常驻对抗用例(C12.41)。
验收口径:回放能在十分钟内重建当时的检索输入与意图分桶结果;冻结动作必须在变更单里有对应记录;对抗用例下一次同类变更应被卡门拦住,否则视为预防机制未生效。
端侧灰度新模型后线上指标阴跌,云端复现不出;发现端云 Embedding/模型版本不一致,端侧用旧向量检索、云端用新模型,预测系统性偏倚。
端云版本一致是正确性前提;下发无签名与灰度则脏模型铺满设备难回收。
值班:①端侧切回上一稳定版本 ②校验端云版本清单一致性 ③签名校验阻断脏模型 ④真机回放对齐。互链 G10.01 / A30.01。
事故信号:同版本号下不同设备组的输出分布分裂、加载失败后静默回落旧权重、离线队列集中回传造成采集积压;最容易被误判为「偶发模型抖动」。
回放与责任:按下发批次与设备分组回放,发现低端机未过设备兼容校验却拿了新权重;责任人 = 端侧发布 owner。预防机制:下发前设备能力校验、加载成功回执强制核对、分组灰度与一键回滚(C12.45)。
验收口径:任一设备分组都能按下发批次查到加载回执与量化方案版本;模拟低端机加载失败时不得静默回落,必须产生告警并停止该批次放量。
图文问答偶发"图上没有却言之凿凿";纯文本指标全绿,用户投诉物体计数/空间关系错误;对齐只在训练校验、服务未校验。
多模态失效常是模态间不一致;文本指标掩盖视觉幻觉,引用不可追溯放大误导。
值班:①降级到纯文本兜底 ②开启跨模态一致性校验与引用溯源 ③补多模态专项评测。互链 G10.02 / A32.01。
事故信号:回答流畅但引用的图中并不存在该物体、OCR 误识别改变了用户意图、引用片段无法点开;结果级指标与错误率均显示正常。
回放与责任:回放发现 ASR/OCR 输出被当事实直传且 confidence 未入日志;责任人 = 链路 owner。预防机制:转换层输出置信度与时间戳、低置信度强制澄清、跨模态一致性断言进 CI(A33.05)。
验收口径:随机抽取回答均能点开原始片段并看到时间戳或帧号;低置信度样本必须走澄清分支;跨模态一致性断言失败时输出被阻断而非降级继续生成。
K10 合规/退役/人在环 生产事故
覆盖合规留痕缺失、模型未退役幽灵服务、人在环缺失自动驾驶翻车三类事故;对应 L02.14/S19/S20 与 C12.46。识别信号看审计完整性与调用入口;止血先补闸门再复盘。
监管检查要求提供某时段全部决策依据,系统只能导出成功路径日志,拒绝与依据全缺;PII 脱敏展示层做、库内仍裸,被认定违规。
合规可验证:留痕须 append-only 覆盖全路径,PII 在存储边界脱敏,决策须可回放。
止血:①补 append-only 审计(含拒绝路径)②存储边界补脱敏 ③consent 闸门上线 ④决策依据回填。互链 G09.03 / C12.46。
事故信号:监管询问「为什么这笔被拒绝」时无法提供留痕;或审计表只有成功路径、哈希链出现断号、降级与人工放行无记录。
回放与责任:按 run_id 回放发现拒绝路径由前置规则直接短路,未走审计 Advisor;责任人 = 合规 owner。预防机制:把审计做成网关层统一切面而非各业务自行埋点,四条路径全覆盖并做「有响应无审计」的对账告警(C12.46)。
验收口径:构造一次「有响应无审计」的注入用例,对账告警应在分钟内触发;监管抽查任一笔拒绝都能在十分钟内拿到完整留痕链,含降级与人工放行记录。
旧模型已"下线"但仍有隐藏入口在调用,新模型上线后行为不一致;退役只删了文档没关入口,回滚点已丢。
退役是关闭入口+保留回滚,不是删模型;幽灵调用污染线上与评测。
止血:①关闭全部隐藏入口 ②清点调用方 ③归档权重保留回滚 ④退役标准作业固化。互链 G10.03 / L03.19。
事故信号:账单仍在产生调用、别名仍可解析、旧的定时任务继续拉起已下线模型,但没人记得该服务还活着;通常伴随「无 owner」的孤儿配置项。
回放与责任:回放别名映射变更记录,发现退役只关了入口没解绑别名与定时任务;责任人 = 平台 owner。预防机制:退役五项清单逐项打勾 + 别名 TTL 到期复核 + 定时任务绑定 owner 与有效期(C10.34)。
验收口径:别名解析、定时任务、账单调用三项在退役清单完成后均不可再产生新记录;到期复核未通过时别名自动失效,孤儿配置项能被平台扫描列出。
高风险动作(大额/外部写)被全自动执行,一次错误批量外发;系统无人工确认节点,出事后无法追责与拦截。
human-in-the-loop 是高风险决策的最后否决权与兜底,不可为"效率"省略。
止血:①冻结自动执行 ②高风险动作强制人工确认 ③人在环审计留痕 ④降级触发人工。互链 G10.03 / L03.20。
事故信号:高风险动作(写库/外发/费用产生)在无人确认下自动执行,或审批超时被默认放行;审批等待时长突然下降而违规率上升,是典型的「一键通过」信号。
回放与责任:回放审批事件缺失,发现超时策略配置为默认放行且审批记录未进轨迹;责任人 = 平台策略 owner。预防机制:按可逆性/影响面做 R0~R3 分级、超时默认拒绝 + 自动升级、审批决策进轨迹与审计(A33.09)。
验收口径:审批超时注入必须落到拒绝并升级到备份审批人;审批记录可按人与动作反查;抽样复审违规率应随分级调整下降,而不是靠增加审批数量掩盖。
K11 Java×Python 边界生产事故
覆盖双栈边界上六类静默事故:序列化语义、编码换行、时区日切、超时重试叠加、连接池与进程模型、异常与错误码。识别信号看「两端都成功但结果不一致」;止血先补显式契约与拒绝路径,再回放差异。
Java 侧把金额用长整型分单位传递,Python 侧按浮点元解析并做了四舍五入,对账时差额散在大量小额订单里;日志里两边都显示成功,直到清算才发现累计偏差。
跨语言边界必须有一份中立的契约定义,且每端各自做契约校验。同名不等于同义:整数与浮点、时间戳与字符串、可选与缺失,在不同运行时里的默认值都不一样。
止血:先在边界加显式校验与拒绝路径,禁止静默转换;对已产生的数据按契约重算并留痕。
把字段类型、单位、精度、可空性写进 IDL,生成各端代码,禁止手写结构体各自解释。
回放:按同一批样本在两端做往返序列化比对,把差异作为常态门禁。
Python 侧按系统默认编码读取上游文件,换到另一批容器后默认编码变化,含中文的字段变成乱码;Java 侧按固定编码解析,两边对同一主键生成了不同的哈希,缓存与库里出现两套记录。
编码是契约的一部分,不能依赖运行时默认值。换行、BOM、Unicode 归一化同样会改变字节序列,凡参与哈希、签名、去重的字段都要显式约定。
止血:统一显式编码并固定规范化形式,对已分裂的主键做映射合并,禁止直接覆盖。
所有读写显式指定编码,参与签名或哈希前先做规范化,并在契约里写清。
回放:用含多语言字符与特殊换行的样本做双端一致性测试,纳入发布门禁。
Java 服务按带偏移的时间戳上报,Python 批处理按本地时区解析并做日切聚合,跨时区节点的订单被算进相邻日期;日报与流水对不上,且只在特定时段出现。
时间戳必须区分「时刻」与「本地日期」,二者不可互推。存储用带时区的时刻,聚合维度用明确的业务时区与日切规则,跨语言传递时禁止丢偏移。
止血:冻结受影响报表,按统一业务时区重算并标注重算版本。
接口只传带偏移的 ISO 时刻或明确的 UTC 毫秒值,日切规则写进契约并单测覆盖边界。
回放:构造跨日切、跨夏令时样本做双端比对,验证聚合口径一致。
Java 侧网关设了超时与重试,Python 侧内部调用也设了一层,下游抖动时实际请求量被乘开;线程池被等待占满,健康检查也开始超时,实例被反复摘挂。
重试预算属于整条链路,不属于单个客户端。每层各自设重试,会把局部抖动放大成全局拥塞;超时必须沿调用链递减,并保留预算供最外层决策。
止血:先关掉内层重试、保留熔断与降级,让下游有恢复窗口,再逐步放量。
统一超时预算,下游超时应小于上游剩余预算;重试只在最外层按预算执行并带抖动退避。
回放:在演练中注入下游延迟,实测总请求倍数与线程池占用,验证不会自激。
Python 服务用多进程加每进程连接池,Java 侧按线程数估算并发并扩容;实际连接数是进程数乘池大小,数据库连接被打满,报错却表现为零星超时而非明确拒绝。
并发模型不可跨运行时互推:线程、协程、进程各自的池语义不同,容量口径必须换算到共享资源(连接数、文件描述符、内存)上统一核算。
止血:限制总连接数并启用排队与快速失败,先恢复数据库,再重算各实例配额。
按共享资源总量反推每实例池上限,并把连接数作为一等监控指标与扩容约束。
回放:在预发用同等进程数与实例数做峰值验证,观察连接数而非只看吞吐。
Java 侧把某类业务拒绝映射为异常,Python 侧捕获后统一记为失败并丢弃消息;实际上其中一部分是明确可重试的限流,流量恢复后本应补投,最终造成静默数据缺失。
错误码要区分「业务拒绝 / 可重试 / 不可恢复」,并跨语言映射到同一枚举。用异常类型承载语义,在不同运行时里必然失真。
止血:暂停丢弃路径,把可疑消息转入待重投队列,按幂等键去重后补放。
契约里定义统一错误码与可重试标记,各端按表映射,禁止靠异常类名判断。
回放:构造三类错误样本做双端联调,验证重试、落库与告警路径各自正确。
K12 AI / 模型服务生产事故
覆盖冷启动、版本漂移、计费失控、上下文溢出、降级失效五类模型服务特有事故;共同点是技术监控全绿而业务结果已经受损。止血先恢复有界返回与可回放版本,再把护栏写进就绪探针与请求级门禁。
流量突增触发扩容,新实例进程已就绪但权重与词表仍在加载,就绪探针只看端口存活就放行;请求打进来后迟迟不返回,上游超时重试又把负载推高。
「进程活着」不等于「可服务」。模型类服务的就绪条件必须包含依赖加载完成与一次轻量推理通过,扩容策略也要给预热留出窗口。
止血:把新实例从负载中摘出,保留最小常驻副本,待预热完成后再渐进放量。
就绪探针区分存活与可服务,预热完成前返回未就绪;扩容预留缓冲副本。
回放:在演练中同时触发扩容与流量突增,验证就绪门槛与放量曲线。
模型服务灰度切到新版权重,接口与字段完全未变,但分类阈值附近的样本大量改判;下游规则引擎按旧分布设的阈值失效,误拒率上升却没有任何发布变更记录可查。
模型是行为变更,不是配置变更。任何权重、提示模板、后处理阈值的调整都要有版本、灰度与业务指标回归,不能因为「接口没变」就跳过发布门禁。
止血:按版本维度快速回切上一版权重,同时冻结依赖该输出的下游规则。
把权重、模板、阈值打进同一版本标识,灰度按业务指标判定放量而非只看技术健康度。
回放:保留一批固定评测集,每次版本变更输出分布对比,超阈值即阻断。
某个上游超时触发自动重试,每次重试又携带完整历史上下文,单次会话的消耗被放大数倍;账单异常在月末才被发现,期间没有单请求维度的成本告警。
成本是运行时指标,不能只靠事后账单。上下文长度、重试次数、并发量三者相乘,任一失控都会把预算迅速打穿,需要在请求维度设上限与告警。
止血:对单请求设置上下文与调用次数上限,暂停异常来源并回滚重试策略。
按请求记录输入长度、输出长度、重试次数与估算成本,超阈值实时告警并熔断。
回放:用最长上下文加压测重试,验证成本护栏在极端组合下仍然生效。
长会话超过窗口后,框架按默认策略静默截掉了中间一段,关键约束被丢弃,模型给出与前文矛盾的答案;服务端日志只有正常返回,没有任何溢出痕迹。
截断是一种数据丢失,必须显式、可观测、可决策。把溢出当普通限流处理,会让错误以「回答看起来合理」的形式出现,最难在事后定位。
止血:关闭静默截断,超限即返回明确错误并要求上层做摘要或分段。
记录上下文长度、保留策略与被丢弃片段标识,把溢出率纳入监控。
回放:构造超长会话样本,验证关键约束在摘要后仍被保留且可被检索。
主模型超时后切到备用规则,但该规则依赖的下游缓存早已下线,降级请求同样卡住;两级都失败时没有默认响应,用户侧表现为长时间无返回。
降级路径是生产链路的一部分,却通常不在常规压测覆盖内。备用链路需要有独立健康检查、独立的超时预算,以及最终可返回的确定结果。
止血:直接启用静态兜底结果,绕开失效的备用依赖,先恢复可返回性。
给每层降级配独立健康探测与超时,并定义最终默认响应,保证一定有界返回。
回放:定期注入主链路故障,实际走一遍降级链,验证兜底在演练中可用。