记得之前面试被问到,你们接口是怎么实现幂等性的,当时我一脸懵逼,幂等是什么?我怎么没听过o(╥﹏╥)o,在网上各种查找资料,现在做个整理。
什么是幂等性?
就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
举例:
支付场景,订单支付成功后,在返回结果的时候网络发生异常,这个时候是扣了钱的,用户再次点击支付,支付成功然后返回结果会发现多扣了一次金额,资金流水也产生了两条记录。
设计接口幂等性方案
不同场景接口幂等设计是不一样的,如果只是单一的支付操作,我们可以创建一个唯一性ticketId(就是门票),门票只能使用一次。
场景一,单一支付接口,具体步骤如下:
1、异步请求创建ticketId
2、调用支付接口传入ticketId
3、根据ticketId查询是否操作过,如果操作过就直接返回结果,如果没有操作过就继续支付并保存结果。
4、返回结果到客户端
场景二,先支付后修改订单状态,具体实现步骤:
1、查询订单支付状态(支付状态:已支付,未支付)
2、如果已经支付直接返回结果。
3、如果未支付状态就调用支付并修改订单状态
4、返回结果