跳到主要内容

事故复盘、失败方案与组织学习

事故复盘用事实还原影响、时间线和促成条件,再把结论转化为有负责人、优先级和验证方式的改进行动。

1. 先定义需要复盘的事件

团队应在事故前确定触发条件,例如:

  • 用户可见中断或性能退化超过阈值;
  • 数据丢失、错误写入或安全事件;
  • 需要人工回滚、切流或紧急修复;
  • 恢复时间超过目标;
  • 监控未发现、但用户已经报告的问题;
  • 险些造成严重影响的 near miss。

统一标准避免复盘取决于负责人意愿。任何相关方仍可以为异常复杂或有普遍学习价值的事件提出复盘。

事故指挥与复盘写作是两个阶段。恢复期间优先控制影响并保存证据,不在高压现场寻找责任人或完整根因。

2. 用时间线建立共同事实

时间线记录事件发生、检测、判断、操作、状态变化和恢复,来源包括监控、日志、变更记录、聊天和工单。

每个时间点写清:

  • 当时观察到了什么;
  • 操作者掌握哪些信息;
  • 做了什么决定;
  • 系统产生什么结果。

区分事件时间和发现时间。数据库在 10:00 开始丢数据、团队在 10:20 才发现,这二十分钟本身就是检测缺口。

无法确认的内容标为未知,不为填满时间线而猜测。后续证据可以更新事实,但要保留来源。

3. 影响使用用户和业务口径

“服务异常 30 分钟”缺少影响范围。复盘应量化:

  • 受影响用户、请求或租户数量;
  • 错误、延迟和不可用持续时间;
  • 数据丢失、重复或陈旧范围;
  • 收入、履约、合规和客服影响;
  • 是否触发 SLA 或消耗错误预算。

技术指标与业务结果要互相校验。整体错误率只有 1%,可能意味着一个地区或一个大客户完全不可用。

4. 分析促成条件

复杂事故通常由多个条件共同形成:设计假设、代码缺陷、容量、配置、发布、监控、文档、权限和组织交接都可能参与。

“某人执行了错误命令”只描述触发动作。还需要继续问:

  • 为什么命令允许作用于全部目标;
  • 为什么没有 dry-run、审批或范围限制;
  • 为什么监控无法提前发现;
  • 为什么恢复步骤依赖个人记忆;
  • 当时的时间压力和信息怎样影响判断。

复盘采用无责语言,假设参与者基于当时信息做了合理判断。无责不取消责任:系统 owner 仍要负责改进,故意违规和人事问题由独立流程处理。

5. 同时记录有效与失效的防线

一场事故会经过预防、检测、缓解和恢复多层防线。复盘分别说明:

  • 哪些防线按设计工作;
  • 哪些防线存在但没有触发;
  • 哪些环节完全缺少保护;
  • 哪些偶然条件减小了影响。

“运气好”也要记录。例如故障发生在低峰期,说明高峰期影响可能更大,容量和响应计划需要按更坏场景验证。

同时保留有效行动,避免修复一项问题时移除原本有价值的保护。

6. 行动项覆盖不同阶段

行动项可以分为:

  • 预防:消除触发条件或缩小可操作范围;
  • 检测:增加用户 SLI、数据差异和变更告警;
  • 缓解:限流、隔舱、降级和自动回滚;
  • 恢复:改进备份、runbook、权限和工具;
  • 学习:更新设计规范、培训和演练场景。

每项都需要明确动作、负责人、优先级、截止时间、追踪项和可验证结束状态。“加强监控”“提高意识”无法验收。

高优先级行动进入正式产品或工程计划,不能只留在复盘文档。复测或演练确认措施有效后再关闭。

7. 失败方案也值得复盘

没有造成生产事故的技术方案,也可能消耗大量时间并暴露决策问题。失败方案复盘关注:

  • 原始目标和约束;
  • 当时有哪些假设和证据;
  • 哪个信号证明方向不再成立;
  • 为什么没有更早停止;
  • 哪些资产、工具或结论可以复用;
  • 下次决策需要增加什么验证或退出条件。

不要用结果倒推当时的人必然判断错误。关键是检查信息收集、实验设计、阶段目标和停止机制。

及时停止一项低价值方案是一项正确决策。将失败隐藏到“需求变化”中,会让其他团队重复相同成本。

8. 从单次事故发现系统问题

统一模板和标签可以聚合多次复盘,识别重复主题,例如变更造成的故障、权限缺口、同一依赖频繁超时或行动项长期未完成。

跨团队分享时保护用户隐私和敏感安全信息,同时保留足够的技术细节。相似服务可以把事故场景加入故障演练、架构检查和上线清单。

如果同类事故重复出现,先检查旧行动项是否完成和有效,再决定更大范围重构。继续新增告警,却不关闭已知根因,只会增加值班负担。

9. 复盘完成需要闭环

复盘至少经过作者、事件参与者和相关系统负责人评审。完成标准包括:

  • 影响和时间线有证据;
  • 促成条件足够深入;
  • 行动项有所有者与验收;
  • 重要结论已向受影响团队分享;
  • 高风险措施已进入排期;
  • 后续复测或演练已经安排。

文档发布只是中间步骤。行动项关闭率、重复事故和错误预算改善,才反映复盘是否产生了组织学习。

10. 面试题

10.1 怎样复盘一次由发布引起的线上事故

出现公司:字节跳动

考察重点

  • 用户影响、证据时间线和促成条件。
  • 无责分析与明确责任的关系。
  • 可执行行动项、复测和跨团队学习。

相关内容:第 1 节“先定义需要复盘的事件”至第 9 节“复盘完成需要闭环”。

参考回答

恢复服务后,我会先保存监控、日志、变更和沟通证据,按事件时间与发现时间建立时间线,并用受影响用户、业务结果、数据和错误预算量化影响。分析时从触发动作继续追到设计、发布、权限、监控、文档和组织交接等促成条件,采用无责语言,同时让系统 owner 对改进行动负责。

行动项覆盖预防、检测、缓解和恢复,每项都有负责人、优先级、期限和可验证结果;高风险项进入正式排期,并通过测试或演练复核。复盘经参与者和相关团队评审后广泛分享,再聚合历史事故查找重复模式。文档发布不算完成,行动项关闭和同类事故减少才算形成闭环。