如何解决接口幂等性(接口如何保持幂等性)
off999 2025-03-20 17:38 38 浏览 0 评论
前言:
接口幂等性是指一个接口在多次调用相同请求时,产生的结果与一次调用的结果相同。换句话说,无论请求被执行多少次,最终的效果都是一致的,不会因为多次调用而导致状态的变化。
为什么会产生接口幂等性问题?
- 网络波动, 可能会引起重复请求
- 用户重复操作,用户在操作时候可能会无意触发多次下单交易,甚至没有响应而有意触发多次交易应用
- 使用了失效或超时重试机制(Nginx重试、RPC重试或业务层重试等)
- 页面重复刷新
- 使用浏览器后退按钮重复之前的操作,导致重复提交表单
- 使用浏览器历史记录重复提交表单
- 浏览器重复的HTTP请求
- 定时任务重复执行
- 用户双击提交按钮
解决接口幂等性问题
解决接口幂等问题,,只需要记住一句口令"一锁、二判、三更新",只要严格遵守这个过程,那么就可以解决并发问题。
一锁:第一步,先加锁。可以加分布式锁、或者悲观锁都可以。但是一定要是一个互斥锁!
二判:第二步,进行幂等性判断。可以基于状态机、流水表、唯一性索引等等进行重复操作的判断。
三更新:第三步,进行数据的更新,将数据进行持久化。
以下是个简单的示例:
//一锁:先加一个分布式锁
@DistributeLock(scene ="OEDER",keyExpression ="#request.identifier",expire = 3000)
public orderResponse apply(orderRequest request){
OrderResponse response =new rderResponse);
OrderDTo orderDT0 =orderService.queryorder(request.getProduct),request.getIdentifier());
//二判:判断请求是否执行成功过
if(orderDTo !=null){
response.setsuccess(true);
response.setResponseCode("DUPLICATED");
return response;
}
//三更新:执行更新的业务逻辑
return orderservice.order(request);
}三步需要严格控制顺序,确保加锁成功后进行数据查询和判断,幂等性判断通过后再更新,更新结束后释放锁。
一锁这个过程,建议使用Redis实现分布式锁,因为他是非阻塞的高效率的互斥锁。非常适合在幂等控制场景中。
二判这个过程,如果有操作流水,建议基于操作流水做幂等,并将幂等号作为唯一性约束,确保唯一性。如果没有流水,那么基于状态机也是可以的。
但是不管怎么样,数据库的唯一性约束都要加好,这是系统的最后一道防线。万一前面的锁失效了这里也能控制得住不会产生脏数据。
第一步加锁为了解决高并发场景下的幂等问题,如果没有高并发,不需要第一步了,就直接查询更新,再更新的时候做乐观锁控制就行了:
请求幂等与业务幂等
请求幂等:每次请求,如果参数一样,结果也要一样。
业务幂等:同一次业务请求,在拿到最终状态之后的每次请求,结果要保证一样。再没拿到最终状态。
比如,一次支付请求,如果支付返回处理中,或者系统异常等,我们需要重试,继续调用,直到他明确的返回支付成功,或者明确的无法成功的支付失败结果。
一般来说,在幂等请求中,应该如下返回:
success =true
responseCode = DUPLICATED这样既能让别人知道是成功了,也能知道是因为幂等而导致的成功。
总结
接口幂等性问题也是在项目中经常考虑的点,做好接口幂等性对业务数据流控制至关重要的。在工作中大家可以参考上述方案进行接口幂等性控制。
相关推荐
- 国内外十大免费crm软件推荐(免费版crm)
-
悟空CRM9.0完全开源免费,采用前后端分离模式,前端框架vue后端框架PHP/JAVA多框架语言。ZohoCRM有免费版,限3用户免费,它还配有免费的手机app,很方便。你可以到这个地址查看一...
- 电脑显示屏(电脑显示屏图片)
-
1、LCD显示器LCD显示器即液晶显示屏,优点是机身薄,占地小,辐射小,给人以一种健康产品的形象。我看不尽是,使用液晶显示屏不一定可以保护到眼睛,这需要看各人使用计算机的习惯。2、等离子显示器等离子显...
- 把文件删了怎么恢复(文件删除之后如何恢复)
-
首先我们需要通过浏览器搜索互盾数据恢复软件,将这款软件下载到我们的电脑上1、下载好后运行互盾数据恢复软件,软件界面有六大功能,因为我们需要对回收站清空的数据进行恢复,所以点击界面的“误清空回收站”即...
- 360路由器怎么设置密码(360路由器怎么设置密码192.168.0.1)
-
360路由器p1的具体步骤:1、首先按照说明书进行常规连接路由器,然后我们打开浏览器,地址栏输入luyou.360.cn或192.168.0.1回车。2、立即开启,就会看见下一个设置界面,路由器管理员...
- 电脑特别卡反应特别慢怎么办
-
网速能快多少?很多朋友发现家里的网速明明是百兆光纤,但网速总是提不上来,其实影响这的原因很多,但有一点或许是很多人都不知道的,那就是因为我们的系统为了适应不同配置的电脑,需要保留一定的宽带来减轻网络给...
- cpu使用率过高(cpu使用率过高怎么解决 换配置)
-
关闭不必要的程序和服务:找出并关闭后台运行的、不必要的程序,注意可能的开机自启动程序影响。结束后台进程:通过任务管理器或系统监视器来结束不必要的后台进程,特别注意那些占用大量CPU资源的进程。检查...
- 智能abc输入法电脑版(智能abc输入法免费下载)
-
要安装智能ABC输入法,首先需要在笔记本上打开浏览器,然后在搜索栏中输入“智能ABC输入法下载”,找到官方网站或者可信赖的第三方网站,点击下载并安装该输入法软件。安装完成后,在输入法设置中选择启用智能...
- 如何给电脑设置密码开机密码
-
1、点击左下角开始,选择控制面板!(有的可以右击我的电脑)2、然后在选择用户账户3、一般没有设置密码的需要设置administrative的管理员密码!也可以创建新的账户4、然后在选择创建密码5、然后...
- 系统盘制作u盘要多大(制作系统u盘要多少g)
-
u盘制作启动盘,8g空间足够了。随着WINDOWS系统的不断完善,操作系统本身文件也越来越大,因为操作系统集成了更多的设备驱动和补丁,但是就WINDOWS10系统来说,有8g的空间足够把U盘做成启动...
- 网吧电脑怎么关闭防火墙(网吧如何关掉防火墙)
-
1、首先,我们点击电脑桌面左下角的微软按钮,弹出的界面,我们找到windows系统,点击打开它,弹出的界面,我们点击控制面板;2、弹出的界面,我们点击WindowsDefender防火墙;3、之后我...
- win7安装需要标准nvm(安装win7要求)
-
1、把操作系统的安装镜像用WINRAR软件全部解压。2、找一个U盘,不小于8GB,格式化为FAT32格式,把上一步解压的文件复制到U盘中。3、重启电脑,按F12,选择电脑当前从U盘启动,进可以进入安装...
- win10不兼容32位软件(win10系统不兼容软件)
-
使用电脑管家更新下驱动就可以了。1、打开腾讯电脑管家,点击“工具箱”。2、在工具箱里找到“硬件检测”。3、在硬件检测里点击“驱动安装”。4、可以看到“安装状态”,如果是未安装可以直接点击安装。首先你...
- win7的屏保设置在哪里(win7 如何设置屏保)
-
要设置屏保,按照以下步骤进行操作:1.点击桌面上空白处右键,选择“个性化”。2.在个性化窗口中,点击左侧菜单栏中的“屏幕保护程序”选项。3.在“屏幕保护程序”窗口中,可以选择系统提供的屏保样式。...
- 电脑重新分区后如何恢复数据
-
如果电脑从新分区后没有进行数据覆盖,那么数据恢复的可能性是存在的。但是需要注意的是,分区操作本身就会对硬盘进行一定程度的数据覆盖,因此恢复成功的可能性会受到影响。如果您需要恢复分区后的数据,可以尝试使...
- 手机连接电脑没反应只能充电
-
手机连接到电脑上,只显示充电状态,可能有以下原因。1.使用的USB线只是充电线。可以更换USB数据线。2.手机的USB连接,设置为仅充电了。设置为数据传输就行了。3.电脑中缺少手机使用的USB驱动。可...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
