同一笔事件在 3 毫秒内推了两次,幂等表里出现两条记录,库存扣了两次。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

ALTER TABLE callback_log ADD UNIQUE KEY uk_event (event_id);
SELECT event_id,COUNT(*) c FROM callback_log GROUP BY event_id HAVING c>1;

幂等键取的是当前毫秒时间戳,两次请求落在不同毫秒就生成了两个键。键本身不携带事件身份,判重自然失效。这一点先确认清楚,后面就不用反复试。

「幂等键设计」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

具体做法是,幂等键换成渠道事件 id 或业务单号加事件类型;数据库加唯一索引 不只靠先查后插;捕获唯一冲突后直接返回成功;已有重复数据按业务单号合并。

改完照着核一遍,3 毫秒内连发两次只落一条记录 库存只扣一次。

作者 9823189