重复提交问题
常见原因:
- 用户手速快导致重复操作。
- 大商户使用工具刷单。
- 前端忘记实现防抖功能。
- 接口失败后的自动重试机制。
- 队列处理中的重复消费问题。
可能造成的问题:
- 重复扣减库存。
- 积分错误增加。
- 订单被重复创建。
防重与幂等概念
- 防重:防止重复提交,对结果没有严格要求。
- 幂等:在防重的基础上,要求每次操作的结果都一致。
实际场景分析与解决方案
场景1:客户端重复提交
- 原因:网络抖动、前端重复提交、页面重复进入。
- 解决方案:
- 前端处理:确保流程不回退,实现防抖功能。
- 服务端处理:
- 使用token机制保证请求在特定时间内的唯一性。
- 利用CAS(比较和交换)操作避免库存或状态的重复修改。
场景2:第三方服务重复调用
- 原因:可能是服务消费失败后的重复调用。
- 解决方案:
- 每次请求生成唯一订单ID。
- 使用非对称加密技术进行请求校验,防止恶意请求。
场景3:失败重试
- 原因:支付渠道可能存在重复调用问题。
- 解决方案:
- 根据订单号查询判断,防止长时间跨度的重复调用。
- 使用数据库唯一索引避免并发情况下的重复问题。
总结
- 前端下单后流程不退回。
- 使用唯一token进行防重校验。
- 依赖上游服务进行重复请求校验。
- 每次下单生成新的订单。
- 使用数据库唯一索引作为兜底措施。