1. 什么是幂等
我理解的幂等是 无论进行多少次重复执行 结果都相同,这个结果是 最终态的意思。
2. 为什么需要幂等
平台作为下游系统要做好幂等控制,比如外部医院对平台发起退款时,在没拿到最终状态之前,每一次请求需要正常执行业务逻辑,直到推进最终状态,拿到最终状态之后,每次请求,结果都保证一样。
比如发起退款时,如果返回退款异常或者退款中,外部都可以进行重试,继续调用,直到返回明确状态。
3. 如何设计幂等(结合项目的场景)
场景1:提供给外部 退款接口
- 根据【订单流水号】查询本地支付单数据,没有则抛出异常交易记录不存在。
- Redis锁
- 通过 【外部】退款流水号 查找 【退款主订单】
- 如果【退款主订单】存在并且状态明确,则幂等返回。
- 如果【退款主订单】不存在,则创建退款主订单,并执行 退款业务类。
- Redis解锁
所以我们可以归纳总结一套设计接口幂等的框架
一锁、二判断、三更新
一锁 使用redis分布式锁
二判 比如支付单的流水号是支付单的唯一性约束,对任何支付单的退款操作首先要进行查询,只有存在的情况才能继续进行业务操作,支付单存的是 订单状态以及可退金额等。通过支付单流水号和外部退款流水号查询 主退款单(其中外部退款流水号也是唯一性约束),如果存在且状态明确则幂等返回,否则 创建主退款单 之后 进行具体的业务操作。
三更新 进行具体的业务操作的过程中 会分别对不同的退款单进行退款等操作 依次更新 各自退款的单的状态、退款主订单的状态、订单表的状态。