大家好,我是狂聊。
自己最近负责的几个接口,都涉及到了幂等性的操作,抽空总结了一下,这也是面试官比较爱问的问题。
一、什么是幂等?
看一下维基百科怎么说的:
幂等性:多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。
二、使用幂等的场景
1、前端重复提交
用户注册,用户创建商品等操作,前端都会提交一些数据给后台服务,后台需要根据用户提交的数据在数据库中创建记录。如果用户不小心多点了几次,后端收到了好几次提交,这时就会在数据库中重复创建了多条记录。这就是接口没有幂等性带来的 bug。
2、接口超时重试
对于给第三方调用的接口,有可能会因为网络原因而调用失败,这时,一般在设计的时候会对接口调用加上失败重试的机制。如果第一次调用已经执行了一半时,发生了网络异常。这时再次调用时就会因为脏数据的存在而出现调用异常。
3、消息重复消费
在使用消息中间件来处理消息队列,且手动 ack 确认消息被正常消费时。如果消费者突然断开连接,那么已经执行了一半的消息会重新放回队列。
当消息被其他消费者重新消费时,如果没有幂等性,就会导致消息重复消费时结果异常,如数据库重复数据,数据库数据冲突,资源重复等。
三、解决方案
1、token 机制实现
通过token 机制实现接口的幂等性,这是一种比较通用性的实现方法。
示意图如下:
具体流程步骤:
注意:
2、基于 MySQL 实现
这种实现方式是利用 mysql 唯一索引的特性。
示意图如下:
具体流程步骤:
3、基于 Redis 实现
这种实现方式是基于 SETNX 命令实现的
SETNX key value:将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。
该命令在设置成功时返回 1,设置失败时返回 0。
示意图如下:
具体流程步骤:
总结
这几种实现幂等的方式其实都是大同小异的,类似的还有使用状态机、悲观锁、乐观锁的方式来实现,都是比较简单的。
总之,当你去设计一个接口的时候,幂等都是首要考虑的问题,特别是当你负责设计转账、支付这种涉及到 money 的接口,你要格外注意喽!
创建一个HTML页面, 其内容为一个无序列表, 列表中至少包含了5本畅销书,每本书...
转载一下问题的图 -------------------------------------------- 报错是这个 Mi...
跨入2021年之后,我们也迎来了Edge浏览器的首次更新,与以往的小打小闹不同,此...
Array () 函数返回一个数组 表达式Array(list) 允许数据类型:字符,数字均可 实...
本文大纲如下: Spring事务应用大纲 编程式事务 Spring提供了两种编程式事务管理...
★文章内容学习来源拉勾教育大前端就业集训营 目录 上篇 本篇 一、背景颜色 back...
用Javascript实现倒计时效果,供大家参考,具体内容如下 正在学习大前端中,有代...
本文实例讲述了Thinkphp5框架中引入Markdown编辑器操作。分享给大家供大家参考,...
本文转载自微信公众号「猿天地」,作者尹吉欢 。转载本文请联系猿天地公众号。 ...
但是我这个的特点是追究原理,我在乎的事情都想弄明白,于是各个qq群依次发信息...