重复下单
案例1:
1. 用户点击“确认下单”按键进行下单操作;
2. 后台系统接收到请求,并处理返回结果;
3. 网络发生问题,用户没有收到成功返回,以为没有下单成功,再次发起请求;
案例2:
1. 用户因为某种原因,多次发起“确认下单”请求,但以为只请求一次;
2. 后台系统在1秒内接收到同一个用户的多次相同请求,并处理返回结果;
HTTP的幂等性
HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的结果。在HTTP 1.1规范中幂等性定义是:
Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.
幂等性的数学表达:f(f(x)) = f(x)。
幂等性的系统说明
幂等性是系统的接口对外一种承诺而不是实现, 承诺只要调用接口成功, 外部多次调用对系统的影响是一致的. 声明为幂等的接口会认为外部调用失败是常态, 并且失败之后必然会有重试。
检测重复下单
在下单接口中,使用随机字符串来生成一个处理订单Id来标识一个订单接口传入(由后端系统来生成);后台系统保证每个订单传入的都必须是唯一,如果后台系统发现处理订单Id重复就拒绝成生订单
接口的幂待性
接单接口中传入的ID,至多只会被处理一次(处理完的,直接删除传入的ID),且每次调用都返回第一次调用时的处理结果。这样调用方就可以放心的多次调用,而不会造成系统数据混乱与结果的错乱。
鉴于这个机制,案例1与2的解决方案如下:
- 每次进入下单场景,都需要获取一个全新的Id
- 用户一旦点击“确认下单”按键进行下单操作,此按建都要立刻Hold住,设置为“不可用状态”,等待后端接口返回;
- 如果超过一定的时限(1-2秒)没有收到后端系统的返回,则进入到另一个页面弹出相应的提示告之用户下单异常请查询或订单无法确定,引导用户去查询订单状态,反复确认直到订单状态是成功或失败。
- 如果反复确认都不无法得后端返回的响应,请在相应的界面上引导人户去重新下单。
- 后台在接单接口上要符合幂等性。