接口幂等解决方案
一、什么是幂等?
- 常见描述,对于相同的请求应该返回相同的结果,所以查询类接口是天然的幂等性接口。
- 正确回答:幂等指的是相同请求(identical request)执行一次或者多次所带来的结果是一样的。
二、幂等场景
- 前端调后端接口发起支付超时,然后再次发起重试。可能会导致多次支付
- 因为重试机制导致的
- 因为补偿机制导致的
目标或者想要实现的效果:接口的幂等性实际上就是接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的
三、解决方案
1、建去重表:在插入数据的时候,插入去重表,利用数据库的唯一索引特性,保证唯一的逻辑。
2、版本控制:先查询下一些关键数据(版本号等),判断是否已经执行过(标识),在进行业务处理就可以了,不过业务处理的时候要使用悲观锁(防止并发)。
3、状态机幂等:在设计任务相关的业务,肯定会涉及到状态机的状态变化,就是业务上面有个状态,状态在不同的情况下会发生变更,一般情况下存在有限状态机,这时候,如果状态机已经处于下一个状态,这时候来了一个上一个状态的变更,理论上是不能够变更的,这样的话,保证了有限状态机的幂等。
4、token机制,防止页面重复提交。
5、采用token加redis:数据提交前要向服务的申请token,token放到redis或jvm内存,设置token有效时间,提交后后台校验token,同时删除token,生成新的token返回。token特点:要申请,一次有效性,可以限流。
6、全局唯一ID:如果使用全局唯一ID,就是根据业务的操作和内容生成一个全局ID,在执行操作前先根据这个全局唯一ID是否存在,来判断这个操作是否已经执行。如果不存在则把全局ID,存储到存储系统中,比如数据库、redis等。如果存在则表示该方法已经执行。