什么是接⼝幂等性?什么情况下需要保证接⼝的幂等性?如何设计接⼝才能做到幂等?
接⼝幂等性
幂等(idempotent、idempotence)是⼀个数学与计算机学概念,常⻅于抽象代数中。
在编程中⼀个幂等操作的特点是其任意多次执⾏所产⽣的影响均与⼀次执⾏的影响相同。幂等函数,或 幂等⽅法,是指可以使⽤相同参数重复执⾏,并能获得相同结果的函数。这些函数不会影响系统状态, 也不⽤担⼼重复执⾏会对系统造成改变。例如,“setTrue()”函数就是⼀个幂等函数,⽆论多次执⾏,其结 果都是⼀样的,更复杂的操作幂等保证是利⽤唯⼀交易号(流⽔号)实现.
接⼝幂等性就是⽤户对于同⼀操作发起的⼀次请求或者多次请求的结果是⼀致的,不会因为多次点击⽽ 产⽣了副作⽤。
什么情况下需要保证接⼝的幂等性
在增删改查4个操作中,尤为注意就是增加或者修改,
A: 查询操作
查询对于结果是不会有改变的,查询⼀次和查询多次,在数据不变的情况下,查询结果是⼀样的。 select是天然的幂等操作
B: 删除操作
删除⼀次和多次删除都是把数据删除。(注意可能返回结果不⼀样,删除的数据不存在,返回0,删除 的数据多条,返回结果多个,在不考虑返回结果的情况下,删除操作也是具有幂等性的)
C: 更新操作
修改在⼤多场景下结果⼀样,但是如果是增量修改是需要保证幂等性的,如下例⼦:
把表中id为XXX的记录的A字段值设置为1,这种操作不管执⾏多少次都是幂等的
把表中id为XXX的记录的A字段值增加1,这种操作就不是幂等的
D: 新增操作
增加在重复提交的场景下会出现幂等性问题,如以上的⽀付问题
幂等性实现⽅式
使⽤token机制实现
- 服务端提供了发送token的接⼝。我们在分析业务的时候,哪些业务是存在幂等问题的,就必须在 执⾏业务前,先去获取token,服务器会把token保存到redis中。(微服务肯定是分布式了,如果 单机就适⽤jvm缓存)。
- 然后调⽤业务接⼝请求时,把token携带过去,⼀般放在请求头部。
- 服务器判断token是否存在redis中,存在表示第⼀次请求,这时把redis中的token删除,继续执⾏ 业务。
- 如果判断token不存在redis中,就表示是重复操作,直接返回重复标记给client,这样就保证了业 务代码,不被重复执⾏。
Redis实现
Redis实现的⽅式就是将唯⼀序列号作为Key,唯⼀序列号的⽣成⽅式和上⾯介绍的防重表的⼀样, value可以是你想填的任何信息。唯⼀序列号也可以是⼀个字段,例如订单的订单号,也可以是多字段 的唯⼀性组合。当然这⾥需要设置⼀个 key 的过期时间,否则 Redis 中会存在过多的 key
总结
通过以上的了解我们可以知道,针对不同的业务场景我们需要灵活的选择幂等性的实现⽅式。
例如防⽌类似于前端重复提交、重复下单的场景就可以通过 Token 的机制实现,⽽那些有状态前置和后 置转换的场景则可以通过状态机的⽅式实现幂等性,对于那些重复消费和接⼝重试的场景则使⽤数据库 唯⼀索引的⽅式实现更合理。