技术复盘
会议时间:0000-00-00 16:00 至 17:05
主持人:张伟
参会人:刘洋、陈静、王芳、周敏、李莉
主题:用品申领重复扣减
结论:幂等已修复,库存已加回
一、事件回顾
9月11日 15:20 发布的申领提交逻辑,在库存接口超时时允许页面重试。重试生成了新的申领单号,库存服务把第二次调用当成新的扣减。到 9月12日 09:20,共 26 笔申领被扣了两次,其中 4 笔把签字笔库存扣成负数,柜子里实际仍有 19 支。刘洋于 09:28 关闭自动重试。周敏对照流水,李莉于 11:05 把多扣的 26 笔数量加回。库存偏差窗口约 20 小时,员工已领走的实物与第一次扣减一致,没有人多拿物品。
二、有效做法
- 周敏在 9月12日早间对账时先发现签字笔余量为负数,6 分钟内叫到刘洋,没有先按感觉改库存数字。
- 每笔扣减都留有申领单号和请求时间,李莉逐笔加回,26 笔的数量与流水一致。
- 张伟在 09:35 决定先停重试、再修数据。停用后的 40 分钟内新申领 7 笔,全部只扣一次。
- 王芳保留了超时当时的页面录屏,复盘时能看清第二次点击发生在第一次按钮尚未返回之时。
三、问题与原因
超时重试使用了新的申领单号,库存服务无法识别这是同一笔领取。幂等键应当使用员工、用品和首次提交时间组成的稳定键,在 10 分钟内重复提交只保留第一笔。预发当时只模拟了库存成功,没有模拟「第一次已扣减、页面仍显示处理中」的情况。15:20 的发布选在下午,发布后没有人在当晚对一次库存负数,异常留到次日早晨才进入视野。
数据结果
多扣的 26 笔分布在签字笔 14 笔、笔记本 8 笔、电池 4 笔。加回后三类用品余量与周敏 11:20 的实物盘点一致:签字笔 19 支、笔记本 42 本、电池 30 节。负数状态从 09:20 持续到 11:05。
四、改进项
五、复盘结论
这次偏差来自重试换了新单号,库存服务按单号记账本身是符合约定的。幂等修复已于 9月13日 11:00 上线,当日对账差额为 0,9月14日全天新申领 31 笔,重复扣减 0 笔。张伟指定陈静在周会跟踪表中的四项,直到「未开始」和「进行中」都关闭。实物以周敏的盘点为准,系统数字以加回后的流水为准。