// 提交前生成 requestId
// 服务端
SETNX order:req:{requestId} 1 EX 600
// 数据库
ALTER TABLE orders ADD UNIQUE KEY uk_request (request_id);

用户网络慢连点两次提交,后台生成两笔相同订单,对账和发货都受影响。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,接口没有幂等约束,每次请求都当作新业务处理。

「接口幂等设计」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

处理上按这个顺序:前端提交后禁用按钮;服务端用唯一请求号去重;数据库加唯一索引兜底。

改完只确认一件事:重复提交只生成一笔订单,第二次请求返回相同结果。

作者 9823189