这份清单怎么用
卷二每一章都给了单个系统的失败模式。真正出事时,问题很少只停在一个系统里:登录超时会触发重试,重试会放大网关压力,网关摘除节点又会让房间分配失败,最后表现为“玩家进不去游戏”。
这份附录做三件事:
- 统一失败模式的描述格式,避免“偶发”“不稳定”这类无法行动的措辞;
- 按系统列出高频失败模式,给出可探测信号与兜底动作;
- 给出跨系统故障链和最小可观测集,供评审与演练直接使用。
清单不是事故预案的全部。预案还需要联系人、升级路径和对外话术,那些属于运维与组织流程,不在本书范围内。
一、统一的描述格式
每个失败模式至少写清六件事:
| 字段 | 要回答的问题 |
|---|---|
| 症状 | 玩家或监控看到什么,不要写内部实现 |
| 触发 | 什么条件下出现,是流量、数据还是依赖故障 |
| 影响面 | 单玩家、单房间、单分片、单游戏还是全平台 |
| 可探测性 | 多快能发现,靠指标、日志还是客诉 |
| 兜底 | 自动恢复、降级、人工介入分别做什么 |
| 责任方 | 哪个系统拥有处置权,谁负责复盘 |
不合格写法:“偶发登录失败,重试即可。”它没有说明触发条件、影响面和责任方,也无法判断重试会不会放大故障。
二、按系统的失败模式
2.1 账号与身份
| 失败模式 | 触发 | 影响面 | 可探测信号 | 兜底 |
|---|---|---|---|---|
| 重复建号 | 渠道回调重复、并发绑定 | 单玩家出现两个角色 | 同设备短时间多个账号 | 绑定幂等键、合并流程 |
| 绑定冲突 | 同一外部身份绑到两个内部账号 | 单玩家无法登录 | 绑定失败率上升 | 拒绝并进入人工复核 |
| 注销不彻底 | 删除请求只删了主表 | 合规风险、残留数据 | 定期数据审计 | 删除任务编排 + 对账 |
| 风控误伤 | 阈值过严、设备指纹漂移 | 一批正常玩家被挑战 | 挑战率、失败率突增 | 灰度阈值、白名单、申诉 |
2.2 登录与网关
| 失败模式 | 触发 | 影响面 | 可探测信号 | 兜底 |
|---|---|---|---|---|
| 票据雪崩 | 票据服务不可用,客户端集中重试 | 全游戏登录失败 | 登录成功率、重试 QPS | 本地验签、限流、排队 |
| 续期风暴 | 大量会话同时到期 | 网关与账号服务过载 | 续期 QPS 尖峰 | 过期时间打散、退避 |
| 连接归属漂移 | 网关崩溃、归属表未及时清理 | 部分玩家反复掉线 | 重连率、归属不一致数 | 租约 + 定期对账 |
| 排队正反馈 | 超时太短,客户端立即重试 | 队列越排越长 | 放弃率、重试率同升 | 退避、排队票据、拒绝语义 |
2.3 匹配与房间
| 失败模式 | 触发 | 影响面 | 可探测信号 | 兜底 |
|---|---|---|---|---|
| 匹配饥饿 | 分段过严、冷门模式人少 | 少数玩家长期匹配不到 | 等待时长 P99 | 窗口逐步放宽、机器人兜底 |
| 幽灵房间 | 进程崩溃、租约未续 | 资源泄漏、匹配到空房 | 活跃房间数与心跳不一致 | 租约过期回收、对账扫描 |
| 重复创建 | 客户端重试、调度器超时 | 同一局多个房间 | 同局 ID 多实例 | 创建幂等键、唯一约束 |
| 实例碎片 | 规格不一、回收不及时 | 有空闲资源却开不了房 | 可分配率下降 | 装箱策略、定期整理 |
2.4 场景与世界
| 失败模式 | 触发 | 影响面 | 可探测信号 | 兜底 |
|---|---|---|---|---|
| AOI 消息放大 | 玩家聚集、视野半径过大 | 单场景带宽打满 | 出站字节、单格人数 | 降频、聚合、分线 |
| 分线抖动 | 阈值贴着实测容量 | 玩家频繁切换分线 | 分线切换次数 | 滞回区间、手动锁定 |
| 广播风暴 | 全服事件同时下发 | 所有网关出口拥塞 | 广播队列积压 | 分级广播、分区订阅 |
| 跨线写入 | 迁移时旧实例仍可写 | 状态错乱、回档 | 双写检测、版本冲突 | epoch/fencing、拒绝旧写入 |
2.5 战斗与结算
| 失败模式 | 触发 | 影响面 | 可探测信号 | 兜底 |
|---|---|---|---|---|
| 重复发奖 | 回调重试、结算任务重跑 | 经济通胀、玩家不公平 | 同 battle_id 多条结算 | 幂等键 + 唯一约束 |
| 结算丢失 | 房间崩溃、消息丢失 | 玩家未收到奖励 | 结算单与对局数不一致 | 对账补算、客服补偿 |
| 战斗服过载 | 开房突增、单房 tick 超时 | 单局卡顿或判负 | tick P99、房间排队 | 暖池、限流、降级 tick |
| 回放不可信 | 日志缺字段、版本不一致 | 申诉无法裁定 | 回放校验失败率 | 记录裁决事件、版本化 |
2.6 经济与交易
| 失败模式 | 触发 | 影响面 | 可探测信号 | 兜底 |
|---|---|---|---|---|
| 余额分叉 | 多处直接改余额 | 单玩家资产错误 | 双分录不平衡 | 单一账本、越权检测 |
| 交易双花 | 并发提交、冻结不彻底 | 双方资产错误 | 同一道具多次易手 | 托管状态机、锁与版本号 |
| 产出失控 | 活动配置错误、刷取漏洞 | 全服通胀 | 来源标签突增、价格指数 | 限额、回滚、冻结核查 |
| 对账缺口 | 异步落账失败 | 账实不符 | 日终差异条数 | 补偿任务、人工挂账 |
2.7 成长与任务
| 失败模式 | 触发 | 影响面 | 可探测信号 | 兜底 |
|---|---|---|---|---|
| 进度重复累加 | 事件重复投递 | 单玩家任务异常完成 | 同事件多条进度 | 去重键、幂等累加 |
| 重置漏做 | 调度失败、时区错误 | 一批玩家日常未刷新 | 重置任务成功率 | 补做窗口、幂等执行 |
| 属性计算漂移 | 加成顺序不一致 | 战斗结果异常 | 同配置属性不一致 | 单一计算入口、快照校验 |
| 赛季切换错位 | 旧榜未冻结、奖励重复 | 排名与奖励错乱 | 赛季边界告警 | 截止快照、幂等结算 |
2.8 社交与公会
| 失败模式 | 触发 | 影响面 | 可探测信号 | 兜底 |
|---|---|---|---|---|
| 关系不对称 | 单边写入失败 | 单对玩家好友状态异常 | 双向校验差异 | 补偿任务、定期修复 |
| 权限越权 | 缓存了旧角色 | 公会仓库资产风险 | 越权拒绝日志 | 权限版本号、即时失效 |
| 仓库并发 | 多人同时取物 | 公会资产错误 | 库存负值、冲突数 | 事务 + 版本号 |
| 聊天刷屏 | 绕开单频道限速 | 单频道体验受损 | 消息速率、重复率 | 全局配额、审核钩子 |
2.9 排行榜与赛季
| 失败模式 | 触发 | 影响面 | 可探测信号 | 兜底 |
|---|---|---|---|---|
| 榜单延迟 | 写缓冲积压 | 玩家看到的排名滞后 | 缓冲队列长度 | 降级直写、提示延迟 |
| 同分错序 | 规则未定义 | 边界玩家奖励争议 | 同分名次抖动 | 明确次级排序键 |
| 赛季重复结算 | 任务重跑 | 重复发奖 | 同赛季多份结算 | 赛季幂等键 |
| 缓存脏读 | 失效失败 | 单玩家名次错误 | 缓存与源数据差异 | TTL + 主动失效 |
2.10 邮件与奖励
| 失败模式 | 触发 | 影响面 | 可探测信号 | 兜底 |
|---|---|---|---|---|
| 重复投递 | 上游重试 | 玩家收到多封邮件 | 去重键冲突数 | 幂等键、批次号 |
| 附件重复领取 | 并发点击 | 资产翻倍 | 同邮件多次领取 | 领取状态机、唯一约束 |
| 过期误删 | 时区/宽限期错误 | 玩家资产损失 | 过期量与客诉 | 宽限期、到期转补发 |
| 补偿风暴 | 事故后全服补偿重复触发 | 经济与邮件系统过载 | 补偿批次激增 | 审批、批次幂等、限速 |
2.11 支付与合规
| 失败模式 | 触发 | 影响面 | 可探测信号 | 兜底 |
|---|---|---|---|---|
| 回调伪造 | 验签缺失 | 资产损失 | 验签失败日志 | 强制验签、来源白名单 |
| 发货重复 | 回调重试 | 重复发货 | 同订单多笔发货 | 订单幂等键 + 唯一约束 |
| 漏单 | 回调丢失 | 玩家付费未到账 | 渠道账单与订单差异 | 主动对账、补单 |
| 退款不回收 | 退款流程缺步骤 | 资产套利 | 退款单与资产变动不一致 | 退款状态机、冻结优先 |
| 合规误判 | 实名/时段规则错误 | 玩家无法登录或超额 | 拒绝率突增 | 规则灰度、人工复核 |
2.12 平台服务
| 失败模式 | 触发 | 影响面 | 可探测信号 | 兜底 |
|---|---|---|---|---|
| 平台单点 | 共用组件无冗余 | 多款游戏同时不可用 | 跨游戏错误率同升 | 冗余、舱壁、降级开关 |
| 租户越权 | 上下文丢失 | 跨游戏数据泄露 | 越权拒绝日志 | 强制租户上下文、审计 |
| 平台变更破坏兼容 | 接口升级未留窗口 | 旧游戏无法调用 | 调用失败率 | 版本化、灰度、回滚 |
| 配额挤占 | 单一游戏活动暴增 | 其他游戏受影响 | 分租户配额使用率 | 配额与优先级 |
三、跨系统故障链
单点失败不可怕,可怕的是它沿着依赖链放大。下面几条是游戏服务端最常见的链路。
3.1 登录雪崩
票据服务变慢
→ 客户端超时重试
→ 网关连接数上涨
→ 账号服务被打满
→ 更多超时与重试
断链点在两处:客户端必须指数退避,网关必须限制单位时间的新建连接。只加机器通常追不上重试的放大速度。
3.2 重复发奖
结算任务超时
→ 调度器重跑
→ 发奖接口未做幂等
→ 同一玩家收到多份奖励
→ 经济指标异常
断链点只有一个:发奖接口的幂等键与唯一约束。下游对账只能发现,不能阻止。
3.3 补偿风暴
事故公告
→ 运营触发全服补偿
→ 邮件系统批量写入
→ 邮件库与推送过载
→ 其他系统延迟上升
断链点:补偿必须走审批与批次幂等,并且限速;不要用“再发一次”解决“可能没发到”。
3.4 赛季边界错位
赛季截止任务延迟
→ 旧榜仍在写入
→ 结算读到截止后的数据
→ 排名与奖励争议
断链点:截止时刻先冻结写入,再结算;冻结与结算都要幂等。
3.5 时区重置错误
重置任务按 UTC 执行
→ 与玩家所在时区不一致
→ 部分玩家日常提前/延后
→ 客诉与重复领取
断链点:重置窗口按产品规则显式计算,并在执行前校验时区配置。
四、最小可观测集
每个核心系统至少暴露下面六类信号,缺一项就意味着故障只能靠客诉发现。
| 类别 | 例子 | 用途 |
|---|---|---|
| 流量 | QPS、连接数、房间创建数 | 判断突增与容量 |
| 延迟 | P50/P99/最大值,按接口分 | 发现尾部恶化 |
| 错误 | 分类错误码,不只看总数 | 区分客户端错误与系统故障 |
| 饱和度 | 队列长度、连接池占用、CPU | 预测即将过载 |
| 业务 | 登录成功率、结算成功率、发货差异 | 直接对应玩家体验 |
| 一致性 | 对账差异、双写冲突、越权拒绝 | 发现静默的数据错误 |
指标要带租户、游戏、分区维度,否则多游戏共用平台时无法判断影响面。
五、演练与复盘
5.1 演练的最小场景
不需要一上来就做混沌工程。先做三个可控实验:
- 依赖超时:给账号或支付接口注入固定延迟,观察重试与排队是否放大;
- 实例摘除:手动下线一个网关或房间节点,观察归属表与重连;
- 重复投递:把同一条结算或支付回调投递两次,验证幂等。
三个实验都能在测试环境完成,且能覆盖大部分高频故障。
5.2 复盘要回答的问题
- 故障是如何被发现的?如果是客诉,说明可观测性有缺口;
- 影响面为什么是这么大?是故障域设计问题,还是隔离失效;
- 哪个环节本可以自动兜底,却没有;
- 哪个契约没有被遵守,导致问题跨系统放大;
- 下一次同类故障,系统应该有哪些不同。
复盘结论要落到具体改动:代码、配置、监控、流程,至少有一项。只写“加强监控”“提高意识”的复盘,下次还会发生。
六、常见错误
| 错误 | 后果 | 纠正 |
|---|---|---|
| 只统计错误总数 | 无法区分客户端错误与系统故障 | 按错误码分类 |
| 用平均值判断延迟 | 尾部恶化被掩盖 | 看 P99 与最大值 |
| 故障时先扩容 | 可能放大重试与成本 | 先限流、降级,再扩容 |
| 补偿当作兜底 | 重复补偿制造新事故 | 幂等 + 审批 + 批次 |
| 复盘只写现象 | 同样问题重复出现 | 每条结论对应改动与负责人 |
| 没有影响面口径 | 无法判断优先级 | 按玩家、房间、分片、游戏分级 |
七、一页纸模板
故障编号:INC-____
发现方式:监控 / 客诉 / 巡检 发现时间:____
影响面:____ 个玩家 / ____ 个房间 / ____ 个分片 / ____ 款游戏
直接原因:____
放大链路:____ → ____ → ____
断链点(本应生效的契约):____
临时处置:____(时间,负责人)
永久改动:____(代码 / 配置 / 监控 / 流程)
新增或修改的失败模式:____(回填本清单)
复审日期:____
清单到这里结束。它的价值不在于列全所有故障,而在于让团队在事故发生前,就把“怎么发现、影响多大、谁来兜底”写成可执行的条目,而不是等到会议上才第一次讨论。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。