怎么理解接口幂等,项目中如何保证的接口幂等

都 2024 年了,竟然还有人不知道接口幂等是什么东西。
hi,大家好,我是 浮生
今天正好有空,给大家分享一下 幂等的实现。 什么是幂等?

一、问题解析

简单来说,就是一个接口,使用相同的参数重复执行的情况下,对数据造成的改变只发生一次。
比如支付操作,如果支付接口被重复调了 N 次,那资金的扣减只发生一次,这就是幂等。有同学会比较好奇, 这个事情不是很正常吗?为什么还要单独拧出来说。原因很简单{如图}, 在分布式架构中,由于引入了网络通信导致一个请求,除了成功/失败以外,还多了一个未知状态。
也就是如果一次远程接口调用失败,有可能这个请求在服务端执行成功了。而客户端为了确保本次请求执行成功,可能会发起重试的操作,导致同一个接口被重复调用了多次。 为了保证服务端接口的幂等性,我们就需要在服务端的接口中去识别当前请求是重复请求,从而不再进行数据的变更操作。
通常的解决方案有几种。
31. 使用数据库唯一索引的方式实现, 我们可以专门创建一个消息表,里面有一个消息内容的字段并且设置为唯一索引,每次收到消息以后生成 md5 值插入到这个消息表里面。一旦出现重复消息,就会抛异常,我们可以捕获这个异常来避免重复对数据做变更。
32. 使用 Redis 里面的 setNx 命令,我们可以把当前请求中带有唯一标识的信息存储到Redis 里面,根据 setNx 命令返回的结果来判断是否是重复执行,如果是则丢弃该请求。
33. 使用状态机的方式来实现幂等,在很多的业务场景中,都会存在业务状态的流转,并且这些状态流转只会前进,所以我们在对数据进行修改的时候,只需要在条件里面带上状态,就能避免数据被重复修改的问题。

二、问题总结

当然,除了这几种方法以外,肯定还有其他更多的解决方案。不管采用哪种方案,核心本质都是需要去识别当前请求是重复请求。当然,如果大家还有更好的方案,可以在评论区留言。

 三、粉丝福利

最近很多同学问我有没有java学习资料,我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我
公众号:“ 
灰灰聊架构 ”, 回复暗号:“ 321 ”即可获取

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

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

相关文章

2.右值引用和移动语义

文章目录 右值引用和移动语义&&的特性右值引用优化性能,避免深拷贝移动(move )语义forward 完美转发emplace_back 减少内存拷贝和移动unordered container 无序容器map和unordered_map的差别内部实现机理不同优缺点以及适用处 小结优缺点以及适用处 小结 代…

JavaScript音视频,使用JavaScript如何在浏览器录制电脑摄像头画面为MP4视频文件并下载视频文件到本地

前言 本章介绍使用JavaScript如何在浏览器录制电脑摄像头画面为MP4视频文件并下载视频文件到本地。 实现功能 1、使用navigator.mediaDevices.getUserMedia获取摄像头画面 2、将获取到的摄像头画面渲染到canvas画板上 3、将canvas转换为blob对象 4、通过document.createElem…

哈希表的实现(1)----除留余数法实现

一,哈希表的介绍 哈希表是一种通过哈希思想实现的一种数据结构。哈希表这种数据结构的特点便是可以通过一个值快速的定位这个值所在的位置实现插入,删除,查找。在这篇博客里面,我们便来实现一个通过除留余数法实现的一个哈希表。 …

【软件工程】项目管理与迭代开发:DevOps平台、敏捷协作平台与软件需求交付

文章目录 1、项目管理与软件需求交付2、DevOps平台3、敏捷协作平台 1、项目管理与软件需求交付 软件需求交付方法: DevOps:DevOps是一种软件开发和运维的方法论,它强调开发团队和运维团队之间的紧密协作和沟通,以实现快速、高效、…

laravel 中间件记录日志

前提 我希望通过中间件记录用户的请求数据、我的返回数据,如果出现异常捕获异常。 代码 路由文件:追加中间件api-logging,用于记录日志 Route::prefix(api)->middleware([api, api-logging])->group(function () {...路由内容 });n…

IntersectionObserver

IntersectionObserver 这个API主要实现图片懒加载、加载更多等等。 该API作用是观察两个元素之间有没有交叉,有没有重叠 现在要做的是当图片跟视口有交叉的情况下,把data-src的图片路径替换给src属性 //第一个参数是 回调,第二个参数的 配置…

HarmonyOS4.0 系列——06、渲染之条件渲染、循环渲染以及懒加载渲染

HarmonyOS4.0 系列——06、渲染之条件渲染、循环渲染以及懒加载渲染 if/else:条件渲染 ArkTS 提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用 if、else 和 else if 渲染对应状态下的 UI 内容。 写法和 TS 的一样,简单看一下即可…

【数据结构之树和二叉树】

数据结构学习笔记---007 数据结构之树和二叉树概念篇1、树的概念和结构1.1、树的相关概念1.2、树的存储结构 2、二叉树概念及结构2.1、二叉树概念2.2、满二叉树2.3、完全二叉树2.4、满二叉树或完全二叉树的存储形式 3、堆的概念及结构3.1、堆的性质3.2、堆的意义 4、二叉树的存…

python_selenium_安装基础学习

目录 1.为什么使用selenium 2.安装selenium 2.1Chrome浏览器 2.2驱动 2.3下载selenium 2.4测试连接 3.selenium元素定位 3.1根据id来找到对象 3.2根据标签属性的属性值来获取对象 3.3根据xpath语句来获取对象 3.4根据标签的名字获取对象 3.5使用bs4的语法来获取对象…

解惑:测试圈网红工具 Jmeter 到底难在哪里

作为一名测试人员,你是否也曾经遇到过这些问题: 同样的起点,同样的工作时间,为什么别人接那么多项目,你还是在点点点;为什么别人升职了,而你还在原地踏步? 同样的工作内容&#xf…

GNU Tools使用笔记

GCC命令选项 预处理器选项 -M选项 作用:生成源文件的依赖关系,包含了该源文件所有的依赖,默认会发送到标准输出(stdout)。 示例1:在ubuntu中,新建如下main.c、main.h、head1.h、head2.h文件。…

数据库的数据类型

文章目录 前言一、数据类型数据类型分类数值类型bit类型小数类型floatdecimal 字符串类型charvarcharchar和varchar比较 日期和时间类型enum和set 前言 一、数据类型 数据类型分类 数值类型 下面我们来创建一个表,表中创建一个tinyint类型的数据。当我们不指定tiny…

【贪心】重构字符串

/*** 思路:如果s长度小于2,直接返回s,假设字符串s的长度为n。* n为偶数,如果字符串中的某个字符数量超过 n/2 则肯定会存在相邻的字符。* n为奇数,如果字符串中的某个字符的数量超过 (n1&am…

机器学习顶会ICML 2024今日开放投稿,CCF A类,中稿率27.94%(附ICML23杰出论文+18篇高分论文)

ICML 2024今天开放投稿了!距离截稿还有24天,想冲ICML的同学速度! ICML 全称 International Conference on Machine Learning,由国际机器学习学会(IMLS)举办,与NIPS一同被认为是人工智能、机器学…

debian 11 arm64 aarch64 D2000 平台编译 box86 box64 笔记

参考资料 https://github.com/ptitSeb/box86/blob/master/docs/COMPILE.md 源码地址 GitHub - ptitSeb/box86: Box86 - Linux Userspace x86 Emulator with a twist, targeted at ARM Linux devices deb在线源地址(打不开): Itais box86…

腾讯云免费服务器怎么申请?腾讯云免费服务器申请难吗?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

C++ 具名要求-全库范围的概念 - 一种等价关系(operator==)- 是一种严格弱序关系(operator< )

此页面中列出的具名要求,是 C 标准的规范性文本中使用的具名要求,用于定义标准库的期待。 某些具名要求在 C20 中正在以概念语言特性进行形式化。在那之前,确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做&#xf…

一文解析低代码平台

一、低代码概念 低代码开发平台是一种无需编码或者只需要少量代码即可快速生成应用程序的开发平台,通过可视化进行应用程序开发的方法,让不同经验水平的开发人员可以通过图形化的用户界面,使用拖拽组件和模型驱动的逻辑来创建网页和移动应用程…

MySQL夯实之路-存储引擎深入浅出

innoDB Mysql4.1以后的版本将表的数据和索引放在单独的文件中 采用mvcc来支持高并发,实现了四个标准的隔离级别,默认为可重复读,并且通过间隙锁(next-key locking)策略防止幻读(查询的行中的间隙也会锁定…

Redis:原理速成+项目实战——Redis实战13(GEO实现附近商铺、滚动分页查询)

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Redis:原理速成项目实战——Redis实战12(好友关注、Feed流(关注推送)、滚动分页查…