接口幂等性措施

接口幂等性

概念

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的,更复杂的操作幂等保证是利用唯一交易号(流水号)实现.

对于同一笔支付信息如果我其中某一次处理成功了,我虽然又接收到了消息,但是这时我不处理了,即保证接口的 幂等性

对于业务中需要考虑幂等性的地方一般都是接口的重复请求,重复请求是指同一个请求因为某些原因被多次提交。

导致这个情况会有几种场景

  • 前端重复提交:提交订单,用户快速重复点击多次,造成后端生成多个内容重复的订单。
  • 接口超时重试:对于给第三方调用的接口,为了防止网络抖动或其他原因造成请求丢失,这样的接口一般都会设计成超时重试多次。
  • 消息重复消费:MQ消息中间件,消息重复消费。

幂等性实现方式

前端处理

对于和web端交互的接口,我们可以在前端拦截一部分,例如防止表单重复提交,按钮置灰、隐藏、不可点击等方式。

但是前端做控制实际效益不是很高,懂点技术的都会模拟请求调用你的服务,所以安全的策略还是需要从后端的接口层来做。

那么后端要实现分布式接口的幂等性有哪些策略方式呢?主要可以从以下几个方面来考虑实现:

后端处理

Token机制#

针对前端重复连续多次点击的情况,例如用户购物提交订单,提交订单的接口就可以通过 Token 的机制实现防止重复提交

在这里插入图片描述

数据库去重表#

往去重表里插入数据的时候,利用数据库的唯一索引特性,保证唯一的逻辑。唯一序列号可以是一个字段,例如订单的订单号,也可以是多字段的唯一性组合。例如设计如下的数据库表

Redis实现#

上面介绍过防重表的设计方式和伪代码,也说过它的一个很明显的缺点。所以我们另外介绍一个Redis的实现方式。

Redis实现的方式就是将唯一序列号作为Key,唯一序列号的生成方式和上面介绍的防重表的一样,value可以是你想填的任何信息。唯一序列号也可以是一个字段,例如订单的订单号,也可以是多字段的唯一性组合。当然这里需要设置一个 key 的过期时间,否则 Redis 中会存在过多的 key。具体校验流程如下图所示,实现代码也很简单这里就不写了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
幂等性指的是对同一个接口多次调用,结果是一样的,不会产生副作用。在实际场景中,比如网络不稳定、请求超时等情况下,可能会导致接口被重复调用,如果接口不具备幂等性,就有可能造成数据重复提交等问题。 为了保证接口幂等性,我们可以在接口中添加某些操作,比如在数据库中添加唯一约束、使用分布式锁等等。下面是一个使用 Spring Boot 和 Redis 实现接口幂等性的示例代码: ```java @RestController public class DemoController { @Autowired private RedisTemplate<String, String> redisTemplate; @PostMapping("/demo") public String demo(@RequestParam("id") String id) { String key = "demo:" + id; ValueOperations<String, String> opsForValue = redisTemplate.opsForValue(); Boolean absent = opsForValue.setIfAbsent(key, "true"); if (absent != null && absent) { // 执行业务逻辑 // ... redisTemplate.delete(key); return "success"; } return "fail"; } } ``` 在这个示例中,我们使用 Redis 来实现接口幂等性。当第一次请求接口时,我们使用 Redis 的 setIfAbsent 方法来设置一个键值对,如果设置成功,说明这个接口还没有被调用过,可以执行业务逻辑。执行完业务逻辑之后,我们再删除这个键值对,这样下次再请求同一个接口时,就不会重复执行业务逻辑了。 需要注意的是,接口幂等性实现不是一成不变的,具体实现方式需要根据业务场景进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EmineWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值