如何实现接口幂等性?

概述

幂等,英文idempotent [aɪ'dempətənt]

幂等这个词源自数学,是数学中的一个概念,常见于抽象代数中,表达的是N次变换与1次变换的结果相同,在计算机的各个领域都借用了该概念

幂等函数或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数,简单来说就是如果方法调用一次和多次产生的效果是相同的,不会导致系统数据出错,那么它就具有幂等性;

幂等性衍生到我们系统中,它的语义是指函数/接口可以使用相同的参数重复执行,不应该影响系统状态,也不会对系统造成改变;

也就是任意多次执行所产生的影响均与一次执行所产生的影响相同;

场景

1、因网络波动,可能会引起重复请求;

2、用户重复操作,用户可能会无意的触发多次下单多次交易,甚至没有响应而有意触发多笔交易

3、应用使用了失败或超时重试机制(如RPC重试、业务层重试等)

4、第三方平台的接口(如:支付成功回调接口),因为异常导致多次回调;

5、中间件/应用服务根据自身的特性,也有可能进行重试

6、用户双击提交按钮;

7、用户页面重复刷新:

8、使用浏览器后退按钮重复之前的操作,导致重复提交表单:

9、使用浏览器历史记录重复提交表单:

10、浏览器重复的HTTP请求:

11、定时任务重复执行;

1. 什么是幂等性?

接口幂等性是指无论对同一个接口进行多少次相同的操作,最终的结果都是相同的。换句话说,即使对同一个接口发送多次相同的请求,也不会改变服务器的状态或产生额外的副作用。

举例1:

假设有一个用于创建用户的接口,当客户端发送一个POST请求到该接口时,会在服务器上创建一个新的用户。接口的幂等性意味着无论客户端发送多少次相同的请求,只会创建一个用户,并且重复的请求不会对服务器上已有的用户数据产生影响。

举例2:

银行转账接口。如果该接口是幂等的,同一个订单支付接口,无论客户端发送多少次相同的转账请求,最终账户的余额都只会被减去相同的金额,而不会重复扣款。

通过保持接口的幂等性,开发人员可以确保系统在出现网络故障、重试请求或处理并发请求时,都能保持一致的状态,避免产生重复数据或不一致的结果。

3.SQL的幂等性

SELECT * FROM USER WHER ID = 1;            // 无论执行多少次重复请求,都不会改变状态,是天然的幂等。
UPDATE USER SET STATE =  1 WHERE ID = 1;   // 无论执行多少次重复请求,都不会改变状态,也是幂等操作。
UPDATE USER SET AGE = AGE + 1 WHERE ID = 1;// 每次执行的结果都会发生变化,这种就不是幂等的。

SQL

4.RESTful API 接口的幂等性

5.为什么要保证幂等?

  1. 防止前端重复提交表单;

  2. 防止用户恶意发送请求;

  3. 防止接口超时重复提交;

  4. 防止消息出现重复消费。

6.如何保证幂等?

幂等,可以通过唯一的业务单号来保证。也就是说相同的业务单号,无论请求多少次认为是同一笔业务,相同的业务单号的处理逻辑和执行效果是一致的。

比如银行第三方支付,需要传递订单号,保证业务的唯一性

7.幂等方案(防重令牌)的原理

①. 服务端提供获取TOKEN的接口;

②. 客户端向服务端发起请求前,第一步先获取TOKEN,将该TOKEN存入REDIS后并将TOKEN返回给客户端;

③. 第二步,客户端在HEADER中携带该TOKEN向服务端发起业务请求;

④. 服务端接收请求从HEADER中解析TOKEN,并在REDIS中查找该TOKEN;

⑤. 如果TOKEN存在,则删掉该TOKEN,继续执行下面的业务操作;

⑥. 如果TOKEN不存在,说明第一次请求已将TOKEN删除,当前的请求并不是第一次请求,则返回重复操作的信息。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

stm32单片机个人学习笔记6(EXTI外部中断)

前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…

大模型Qwen2.5 家族的最新成员

阿里今天发布了 Qwen 家族的最新成员:Qwen2.5,包括语言模型 Qwen2.5,以及专门针对编程的 Qwen2.5-Coder 和数学的 Qwen2.5-Math 模型。 所有开放权重的模型都是稠密的、decoder-only 的语言模型,提供多种不同规模的版本&#xff…

某准网爬虫逆向

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、目标网站二、抓包分析 1.数据包2.逆向过程总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不…

AI 时代的网络危机沟通计划

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

ICM20948 DMP代码详解(35)

接前一篇文章:ICM20948 DMP代码详解(34) 上一回终于解析完了inv_icm20948_initialize_lower_driver函数,本回回到icm20948_sensor_setup函数,继续往下进行解析。为了便于理解和回顾,再次贴出icm20948_senso…

OpenLayers 开源的Web GIS引擎 - 地图初始化

在线引用&#xff1a; 地址&#xff1a;OpenLayers - Get the Code 离线引用&#xff1a; 下载地址&#xff1a;Releases openlayers/openlayers GitHub v10.0.0版本 地图初始化代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><…

以STM32CubeMX创建DSP库工程方法二

以Keil创建DSP库工程方法二 Keil 中宏定义的添加 编译后直接报错高达420项&#xff0c;摘取一部分错误信息下来如下&#xff1a; D:\AppData\Local\Arm\Packs\ARM\CMSIS\5.7.0\CMSIS\DSP\Include\arm_math.h(6911): error: #757: function “int32_t” is not a type name 以…

【开源免费】基于SpringBoot+Vue.JS图书馆管理系统(JAVA毕业设计)

本文项目编号 T 044 &#xff0c;文末自助获取源码 \color{red}{T044&#xff0c;文末自助获取源码} T044&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

数据结构:二叉树(一)

ps&#xff1a;偷懒了几天&#xff0c;接着更新 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的…

银河麒麟高级服务器操作系统V10:提升普通用户操作权限

银河麒麟高级服务器操作系统V10&#xff1a;提升普通用户操作权限 1. 打开终端2. 切换到root用户&#xff08;可选&#xff09;3. 将用户加入到wheel组4. 验证用户组变更5. 使用sudo执行命令结论 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f4…

利用人工智能改变视频智能

人工智能视频分析正在将安全摄像头变成强大的传感器&#xff0c;可以改善您监控站点安全的方式。借助人工智能 (AI)&#xff0c;摄像头可以独立准确地检测威胁&#xff0c;而无需人工不断观看视频。 这并不奇怪——过去几年&#xff0c;这一直是安全行业协会 (SIA) 提出的几大…

软考高级:数据库关系模式推理规则 AI 解读

你提出的是关系模式中的一些经典推理规则&#xff0c;这些规则在数据库理论、函数依赖和范式相关的讨论中经常出现。我们可以通过以下方式深入理解这些规则&#xff0c;并且对其中的推理逻辑进行分解。 生活化例子 想象你在管理一家快递公司&#xff0c;货物需要从仓库&#…

低版本SqlSugar的where条件中使用可空类型报语法错误

SQLServer数据表中有两列可空列&#xff0c;均为数值类型&#xff0c;同时在数据库中录入测试数据&#xff0c;Age和Height列均部分有值。   使用SqlSugar的DbFirst功能生成数据库表类&#xff0c;其中Age、Height属性均为可空类型。   开始使用的SqlSugar版本较低&…

传奇外网架设全套图文教程-BLUE引擎

提示&#xff1a; 当你拿到一个BLUE引擎的版本&#xff0c;首先查看一下版本内文件是否完整&#xff0c;一个完整的BLUE版本包括&#xff1a;DBServer、LoginGate、LoginSrv、LogServer、Mir200、Mud2、RunGate、SelGate、网站和GameCenter.exe&#xff08;引擎&#xff09;&am…

群晖套娃:群晖+飞牛fnOS二合一,群晖nas安装飞牛fnOS系统实录(飞牛fnOS初体验,如何挂载网盘视频,轻松实现影视刮削)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 飞牛fnOS 📒📝 什么是飞牛fnOS?📝 准备工作📝 安装飞牛fnOS📝 影视刮削⚓️ 相关链接 ⚓️📖 介绍 📖 最近有一款很火的国产NAS系统吸引了不少用户的注意。你是否曾想过,将这种新兴系统安装到你的群晖设备上,实…

LLMs之MemLong:《MemLong: Memory-Augmented Retrieval for Long Text Modeling》翻译与解读

LLMs之MemLong&#xff1a;《MemLong: Memory-Augmented Retrieval for Long Text Modeling》翻译与解读 导读&#xff1a;MemLong 是一种新颖高效的解决 LLM 长文本处理难题的方法&#xff0c;它通过外部检索器获取历史信息&#xff0c;并将其与模型的内部检索过程相结合&…

Wpf使用NLog将日志输出到LogViewer

1 LogViewer LogViewer是通过UDP传输的高性能实时log查看器。 具有一下特性&#xff1a; 通过UDP读取日志通过文件导入日志导出日志到一个文件中排序、过滤&#xff08;日志树&#xff0c;日志等级&#xff09;和查找突出显示搜索文本从UPD接收日志时忽略IP地址列表多接收器支…

HTML5中新增元素介绍

引入了许多新元素&#xff0c;以增强网页的语义和功能。这些新元素大致可以按以下几类进行分类和介绍。 下面是对各标签的详解&#xff0c;section、header、footer、nav、article、aside、figure、code、dialog、meter、time、progress、video、audio、details、atagrid、menu…

数据库提权【笔记总结】

文章目录 UDF提权以有webshell只有数据库权限条件复现msf工具sql语句提权 MOF提权前言条件复现msf工具php脚本提权 sqlserver提权前言条件xp_cmdshell提权复现 沙盒提权介绍复现 Oracle提权靶场搭建执行任意命令复现 通过注入存储过程提权&#xff08;低权限提升至DBA&#xff…

深度学习之概率论预备知识点(3)

在深度学习中&#xff0c;概率论和数理统计是理解许多算法背后的理论基础。这些知识在处理不确定性、估计模型参数、理解数据分布等方面非常关键 1、概率 一种用来描述随机事件发生的可能性的数字度量&#xff0c;表示某一事件发生的可能性。 概率并不客观存在&#xff0c;是…