当用户在客户端向服务器发起请求时,如果网络出现问题,用户可能会对同一个接口发起多次请求,幂等性就是要保证多次请求的结果一致。
幂等性在支付场景中使用的较多,它能保证用户在下单扣款时,不会由于网络原因而出现重复扣款的现象。
那么如何实现幂等性呢?最常用的有两种方式:方式一:代码中通过逻辑判断实现,方式二:给需要幂等的接口加一个唯一id。
下面以支付接口为例。
逻辑判断实现幂等性
当用户支付完成准备扣款时,可以使用订单id加订单状态来实现幂等性。用户第一次扣款后,由于网络原因,又发起一次支付,这时可以根据客户端传入的订单id加订单表中的订单状态来判断订单是否已支付。若已支付,则返回结果就行,不用再执行一次扣款炒操作。
接口添加唯一id
用户请求购买接口时,返回一个唯一id,同时将id保存在redis中。用户支付时,需要传入此id,若不传则提示支付失败。用户支付时,支付接口需要校验此id与redis中保存id的一致性,若一致,则支付成功,同时删除redis中的id,否则支付失败。
上面就是两种实现幂等性的方式,若还有其他的方式,欢迎交流。