出现原因
- 用户提交多次,没有做幂等性校验
- 中间件超时重试,导致出现重复订单
防止订单重复提交
在用户提交订单的操作上我们就可以做好预防处理,常用方法如下:
前端
按钮防止重复触发,可以从用户端拦截,减少后端服务器压力
后端
方案一:接口合法性判断
如果别人直接写脚本直接通过接口访问的话,我们就需要从后端入手了,常用方法如下每次向接口访问时需要在接口后面添加token或者用于校验的字符串,用于判断该接口是合法的,例如:前端访问生成订单的接口时,首先从服务器拿到合法令牌,然后再将拿到的合法令牌添加到订单生成接口中,再订单生成的业务生判断该令牌是否合法,合法则生成订单,该操作防止了同一用户短时间访问同一接口多次, 再生成合法令牌的操作中可以添加对访问对象的判断,如果访问了多次则对该IP进行相应的处理
方案二:预生成全局唯一订单号
那么这时候就有人说了,如果还是有重复请求到达我的后端,我该如何处理呢,比如订单号通过uuid生成的,我已经通过uuid生成了多个订单号咋办呢,那么这时候就可以通过方案二进行处理了
用户进入下单页面时,后端提前生成uuid作为订单号传递给前端,用户提交订单时,请求接口中添加进该全局唯一订单号,后面再从数据库中添加订单时,判断订单号是否存在再添加
但是方案二的订单号需要靠后端自己维护,在分布式中实现起来可能有一定难度,实际中的订单号如果是分布式后端外加分库分表的话那么一般可能通过中间件进行维护,如果有了解的佬可以分享一下