Mysql实现幂等_阿里面试官:接口的幂等性怎么设计?

8a36377c0fa349b7a54189380ee55f4a.png

大家好,我是狂聊。

自己最近负责的几个接口,都涉及到了幂等性的操作,抽空总结了一下,这也是面试官比较爱问的问题。

一、什么是幂等?

看一下维基百科怎么说的:

9344031409ec1d0d4a2f837ca55c5300.png

幂等性:多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。

二、使用幂等的场景

1、前端重复提交

用户注册,用户创建商品等操作,前端都会提交一些数据给后台服务,后台需要根据用户提交的数据在数据库中创建记录。如果用户不小心多点了几次,后端收到了好几次提交,这时就会在数据库中重复创建了多条记录。这就是接口没有幂等性带来的 bug。

2、接口超时重试

对于给第三方调用的接口,有可能会因为网络原因而调用失败,这时,一般在设计的时候会对接口调用加上失败重试的机制。如果第一次调用已经执行了一半时,发生了网络异常。这时再次调用时就会因为脏数据的存在而出现调用异常。

3、消息重复消费

在使用消息中间件来处理消息队列,且手动 ack 确认消息被正常消费时。如果消费者突然断开连接,那么已经执行了一半的消息会重新放回队列。

当消息被其他消费者重新消费时,如果没有幂等性,就会导致消息重复消费时结果异常,如数据库重复数据,数据库数据冲突,资源重复等。

三、解决方案

1、token 机制实现

通过token 机制实现接口的幂等性,这是一种比较通用性的实现方法。

示意图如下:

8ac8c0db4d60f4e8e9bd7aae375b2faa.png

具体流程步骤:

客户端会先发送一个请求去获取 token,服务端会生成一个全局唯一的 ID 作为 token 保存在 redis 中,同时把这个 ID 返回给客户端

客户端第二次调用业务请求的时候必须携带这个 token

服务端会校验这个 token,如果校验成功,则执行业务,并删除 redis 中的 token

如果校验失败,说明 redis 中已经没有对应的 token,则表示重复操作,直接返回指定的结果给客户端

注意:

对 redis 中是否存在 token 以及删除的代码逻辑建议用 Lua 脚本实现,保证原子性

全局唯一 ID 可以用百度的 uid-generator、美团的 Leaf 去生成

2、基于 MySQL 实现

这种实现方式是利用 mysql 唯一索引的特性。

示意图如下:

dacd1ee71833dc4826a67a6bcb9ed6ad.png

具体流程步骤:

建立一张去重表,其中某个字段需要建立唯一索引

客户端去请求服务端,服务端会将这次请求的一些信息插入这张去重表中

因为表中某个字段带有唯一索引,如果插入成功,证明表中没有这次请求的信息,则执行后续的业务逻辑

如果插入失败,则代表已经执行过当前请求,直接返回

3、基于 Redis 实现

这种实现方式是基于 SETNX 命令实现的

SETNX key value:将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。

该命令在设置成功时返回 1,设置失败时返回 0。

示意图如下:

b5af2434baef18006038bb91f97288a9.png

具体流程步骤:

客户端先请求服务端,会拿到一个能代表这次请求业务的唯一字段

将该字段以 SETNX 的方式存入 redis 中,并根据业务设置相应的超时时间

如果设置成功,证明这是第一次请求,则执行后续的业务逻辑

如果设置失败,则代表已经执行过当前请求,直接返回

总结

这几种实现幂等的方式其实都是大同小异的,类似的还有使用状态机、悲观锁、乐观锁的方式来实现,都是比较简单的。

总之,当你去设计一个接口的时候,幂等都是首要考虑的问题,特别是当你负责设计转账、支付这种涉及到 money 的接口,你要格外注意喽!

【编辑推荐】

【责任编辑:姜华 TEL:(010)68476606】

点赞 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌搜索揭示人性最黑暗的秘密

全世界只有3.14 % 的人关注了数据与算法之美《卫报》网站发布文章指出,我们能够从我们在网上问的问题获得对自己更多的了解呢。美国数据科学家塞斯斯蒂芬斯-大卫多维茨(Seth Stephens-Davidowitz)通过分析谷歌的匿名搜索数据,揭示…

杂集

为什么80%的码农都做不了架构师?>>> 符号相关快捷键: 千分符号:alt 0137 (小键盘) 回车符号:alt 10(小键盘) 查看目录结构:进入windows concole,执行命令tree 转载于:https://my.o…

接口管理平台YApi

介绍YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的…

saiku 连接 MySQL_Saiku连接mysql数据库(二)

Saiku连接Mysql数据库展示数据参考链接:https://www.cnblogs.com/shirui/p/8573491.html前提:Saiku已安装好,mysql已安装好1.添加Saiku的数据库驱动: mysql-connect-java-5.1.17.jar下载相应的数据库驱动放到 saiku-server\tomcat…

TreeView控件应用--访问文件或文件夹(一)

C#用TreeView访问文件或文件夹,通过递归,展开所有文件夹(类似资源管理器的树形窗体) 首先,算法是用递归算法,不断的递归文件。以此来遍历整个电脑的磁盘内容,过程也很简单。这种算法的时间复杂度…

凭自己本事单的身是一种怎样的体验?你根本配不上如此优秀的我!

全世界只有3.14 % 的人关注了数据与算法之美8月12号,微博网友烂剧斗士发了这么一条微博,称“看脱口秀大会这个哥没把我给笑死”。一位从事IT(黑客)的小哥哥,是这样回忆自己的求爱经历的↓↓#她根本配不上我这么聪明的男…

gather torch_浅谈Pytorch中的torch.gather函数的含义

pytorch中的gather函数pytorch比tensorflow更加编程友好,所以准备用pytorch试着做最近要做的一些实验。立个flag开始学习pytorch,新开一个分类整理学习pytorch中的一些踩到的泥坑。今天刚开始接触,读了一下documentation,写一个一…

WPF 右下角弹窗的简单实现

软件中经常出现右下角弹窗,从下面缓缓弹出的,这次就做个简陋的实现,思路就是在窗口加载和关闭时执行动画DoubleAnimation今天懒得做界面了,只实现了功能。看看效果:下面看看代码:主窗口添加一个按钮 &#…

你周围需要这6种人(文摘)

几乎没有什么不可思议的产品是一个人就能完成的。你需要其他人来帮助你,你也需要去帮助别人。在一个好的团队中,都需要哪种类型的人进驻?来自Forbes的Jessica Hagy告诉我们,你的周围需要这6种人:1. “怂恿者”&#xf…

今年不容易,要懂得爱护自己

冬天到了,衣服逐层加厚,脖子老是皱巴巴的,坐在位置上老是觉得周身不舒服,小木提醒下大家该爱护一下自己的颈椎。这个像缩成一团的东西,是什么?打开以后,它就变成个旅行枕啦,就是我们…

实现多租户系统的一点思考

2020年突发的新冠疫情,让在线协同办公在疫情期间成为了刚需。我们也从 2020 年的 2月3 日开始在家远程办公,直到四月份。协同办公软件一下子火爆了起来,钉钉、企业微信、特别是腾讯会议等都在疫情期间表现突出,呈现出井喷式的发展…

mysql cast 四舍五入_MySQL数据库中CAST与CONVERT函数实现类型转换的讲解

MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。两者具体的语法如下: CAST(value as type);CONVERT(value, type);就是CAST(xxx AS 类型), CONVERT(xxx,类型)。可以转换的类型是有限制的。这个类型可以是以下值其中的一个&…

都说Python库千千万,这几个你认识不?

目前,人工智能的应用日渐广泛。而作为人工智能核心的机器学习,是一门多领域的交叉学科,专门研究计算机模拟或实现人类学习行为的方法,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。简单来说&a…

Js黑客帝国效果 文字下落 制作过程和思路

效果预览: http://jsfiddle.net/dtdxrk/m8R6b/embedded/result/ Js黑客帝国效果 文字向下落制作过程和思路 1.css控制文字竖显示 2.动态添加div 用随机数当文本 3.获取分辨率 把div随机分布到屏幕里 4.随机文字的大小和透明度 5.用setInterval定时替换文本 改变div的top值 6.定…

C# 8.0 默认接口实现

C# 8.0 默认接口实现IntroC# 8.0 开始引入了默认接口实现,也就是可以在接口里写方法实现。在之前的版本中接口上是没有办法定义实现的,方法也都是 public 的,除了接口和属性之外是不能定义其他数据的,这也意味着,接口从…

50款大数据分析神器 :你还在用Excel

全世界只有3.14 % 的人关注了数据与算法之美你平时用什么大数据分析工具?D3? R? 还是Processing?PS和计算器...只有你还在用excel!工欲善其事,必先利其器!一款好的工具可以让你事半功倍。大数据…

WEB安全测试软件

为什么80%的码农都做不了架构师?>>> 五种必会软件: SubSonic CodeSmith Professional 4.1 HttpWatch Professional IE Developer Toolbar Fiddler 是一个web调试代理。它能够记录所有客户端和服务器间的http请求,允许你监视&…

python区域增长算法_区域增长算法

嘿大家好。我真的很难搞清楚这个逻辑,希望你能帮我。在我继续之前,我只想告诉你,我是业余程序员,也是一个初学者,没有任何形式的正式计算机科学培训,所以请容忍我。:D另外,我使用的是…

P6砖家:对不起,我没.NET5高并发经验,我要跑路了!

“秒杀活动”“抢红包”“微博热搜”“12306抢票”“共享单车拉新”等都是高并发的典型业务场景,那么如何解决这些业务场景背后的难点问题呢?秒杀系统中,QPS达到10万/s时,如何定位并解决业务瓶颈?明星婚恋话题不断引爆…

孩子觉得数学难?那是底子没打好!

孩子觉得数学难?那是底子没打好!(北师大学前教育博士帮你一起塑造孩子的数学思维!)要说陪娃写作业这事儿的状态和成果,用一句诗词就能概括:我本将心向明月,奈何明月照沟渠。陪得好&a…