事故的价值在复盘:掉线 20 分钟的故障查明根因、修好只是及格,改进项执行、同类问题不再犯才是满分。复盘的模板化让每次事故的学费真正变成团队的资产。
---事故报告的模板结构
local REPORT_TMPL = {
title = "", -- 一句话事故名
level = "", -- P0/P1/P2
timeline = {}, -- 时间轴:发生/发现/响应/恢复
impact = {}, -- 影响:范围/时长/损失
rootCause = "", -- 根因:技术链路的分析
why = {}, -- 五问:逐层追问
actions = {}, -- 改进项:措施/负责人/期限
}
function Postmortem.create(incidentId)
local rpt = {}
for k, v in pairs(REPORT_TMPL) do
rpt[k] = type(v) == "table" and {} or v
end
rpt.incidentId = incidentId
Postmortem.store[incidentId] = rpt
return rpt
end
复盘的模板七段:一句话的事故名、级别、时间轴(发生到恢复的四个节点)、影响面、根因分析、五问追问、改进项。五问的追问法把根因从表层挖到制度层:为什么掉线(内存耗尽)、为什么内存耗尽(清扫任务没跑)、为什么没跑(定时器被误关)、为什么能被误关(开关没有权限控制)、为什么没有权限控制(流程的缺失)——根因挖到流程层,改进项才不是补丁。时间轴的节点用数据说话:监控的告警时刻、值班的响应时刻、恢复的验证时刻,响应的慢在时间轴上无处藏身。
---改进项的跟踪:到期未完成的升级
setontimerex(98, 3600)
function Postmortem.track()
local now = os.time()
for _, rpt in pairs(Postmortem.store) do
for _, act in ipairs(rpt.actions or {}) do
if not act.done and now > act.deadline then
Ops.alert("改进项逾期", rpt.title,
act.task, act.owner)
act.escalated = true
end
end
end
end
改进项的跟踪带期限与负责人:每条措施有 deadline 与 owner,逾期未完成的自动升级到管理层的群里——复盘的结论躺在文档里是第二次事故的预告。改进的验证:措施完成后用故障的复现场景回验,改了没用等于没改。复盘的文化设计:追责的复盘让人隐瞒,改进的复盘让人坦白——报告的免责声明与根因的深挖并行,坦白从宽的制度写在复盘的开场。同类事故的关联:新事故的根因与历史库匹配,重复的根因说明上次的改进没执行。
复盘的完成率与及时率:事故后 48 小时内出报告的比率;改进项的完成率,完成的措施与总措施的比值是复盘质量的硬指标。
根因的分析曾经停在表层,「代码有 Bug」式的结论让改进无处使力,五问的追问法强制到流程层。改进项的负责人曾经写团队不写个人,逾期的追责无人认领,个人的署名让跟踪有主。时间轴的节点曾经靠回忆,监控的告警时间与工单的时间戳的对齐让时间轴可重构。
复盘的会议 48 小时内召开,记忆的衰减不等人。报告的库全团队可查,事故的学费共享。每季度的复盘复盘:改进项的完成率与同类事故的复发率,制度本身的成效也要被复盘。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 明拍容易被大号威慑,普通玩家不敢出手。秘宝暗拍改为全服暗标:每周一件秘宝,玩家密价投标一次,截标前互相看…
实战应用:用在哪里 充值返利活动被风控规则误判成套利,480 个大额充值账号被批量封禁 24 小时,申诉两小时破千条。误封风…
实战应用:用在哪里 五人小队打沃玛教主,队友的血量状态只能靠点头像逐个看,集火转火慢半拍。小队血条在屏幕侧边紧凑排布四条队友…
实战应用:用在哪里 好友申请藏在好友面板的角标里,玩家半天不看一眼,申请积压让社交转化掉了一半。好友申请浮窗把新申请推到屏幕…
实战应用:用在哪里 矿洞产出人人有份等于人人不重视,矿位租赁把矿洞变成可经营资产:矿位按 24 小时租给个人或行会,产出归租…
实战应用:用在哪里 击杀 BOSS 后要同时做三件事:发奖励、记流水、刷新排行榜,全都写在 killmon 触发里互相拖累,…