接口幂等性的理解

article/2025/10/3 15:42:26

一. 什么是接口幂等性

幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。它是系统服务对外的一种承诺(注意不是一种实现),接口服务提供方承诺只要调用接口成功了,外部多次调用对系统的影响是一致的。

举一个最常见的例子,用户购买商品后支付扣款成功,但是此时网络发生了异常,导致返回结果失败。因为没收到返回结果,用户就会再次点击付款按钮,就会多付了一笔钱,一旦用户发现余额少了,开发人员就等着被祭天吧,这就是没有保证接口的幂等性。

需要强调一点是,声明为幂等的服务会认为调用方调用失败是常态,并且调用失败后必然会有重试。

现在我们已经知道了什么是接口幂等性,那又有哪些场景需要保证幂等性呢?

二. 需要保证幂等性的场景分析


以 SQL 为例,有下面三种场景,只有第三种场景需要开发人员使用策略来保证幂等性:

1. 场景一:查询
 

SELECT column1 FROM table1 WHERE column2 = 2

无论执行多少次都不会改变状态,是天然的幂等。

2. 场景二:常量赋值更新

UPDATE table1 SET column1 = 1 WHERE column2 = 2

无论执行成功多少次状态都是一致的,因此也是幂等操作。

3. 场景三:变量赋值更新

UPDATE table1 SET column1 = column1 + 1 WHERE column2 = 2

每次执行的结果都会发生变化,这种场景就不是幂等的。

三. 为什么需要实现幂等性


如果接口没有实现幂等性,遇到以下情况就会出现问题:

前端重复提交表单: 在填写表格时,用户填写完成提交,很多时候会因网络波动没有及时返回成功响应,致使用户认为没有提交成功,然后一直点提交按钮,这时就会导致重复提交表单请求。
用户恶意刷单: 在实现用户投票这种功能时,如果用户针对同一个人进行重复投票,会导致接口接收到用户重复提交的投票信息,会使投票结果与事实严重不符。
接口超时重复提交: 很多时候 HTTP 客户端工具都默认开启超时重试的机制,尤其是第三方调用接口时,为了处理网络波动超时等造成的请求失败,都会添加重试机制,导致一个请求提交多次。
消息重复消费: 当使用 MQ 消息中间件时,如果消息中间件出现错误未及时提交消费信息,就会导致消息重复消费。


四. 引入幂等性后对系统的影响


幂等性是为了简化客户端逻辑处理,能防止重复提交,但却增加了服务端的逻辑复杂性和成本:

把并行执行的功能改为串行执行,降低了执行效率;
增加了额外控制幂等的业务逻辑,业务功能变得更加复杂;
所以在使用时,需要考虑引入幂等性的必要性,根据实际业务场景分析,除了业务上的特殊要求外,一般情况下不建议引入接口幂等性。

五. 如何实现接口幂等性


乐观锁

这里的乐观锁指的是用乐观锁的原理去实现,为数据字段增加一个 version 字段,当数据需要更新时,先去数据库里获取此时的 version 版本号:
 

SELECT version FROM tablename WHERE ...

更新数据时首先和版本号作对比,如果不相等说明已经有其他的请求去更新数据了,就会提示更新失败。

UPDATE tablename
SET count = count + 1,version = version + 1
WHEREversion = #{version}

不过,乐观锁存在失效的情况,就是常说的 ABA 问题,不过如果 version 版本一直是自增的就不会出现这种情况,乐观锁主要用于读多写少的场景。

悲观锁

乐观锁可以实现的往往用悲观锁也能实现,是指在获取数据时进行加锁,当同时有多个重复请求时其他请求都无法进行操作。

SELECT*
FROMtablename
WHEREid = 1 FOR UPDATE

注意:id 字段一定是主键或者唯一索引,不然会锁表。

悲观锁一般伴随事务一起使用,数据锁定时间可能会很长,根据实际情况选用; 

数据库唯一性索引

利用数据库表单的特性来实现幂等,常用的一个思路是在表上构建唯一性索引,保证某一类数据一旦执行完毕,后续同样的请求再也无法成功写入。

以博客点赞为例,要想防止一个人重复点赞,可以设计一张去重表,将博客 id 与用户 id 绑定建立唯一索引,每当用户点赞时就往表中写入一条数据,这样重复点赞的数据就无法写入了。

分布式锁

去重表也可以使用分布式锁来代替,比如 Redis。

在分布式环境下,锁定全局唯一资源,使请求串行化,实际表现为互斥锁,防止重复,解决幂等。

Token 令牌

这种机制适用范围较广,有多种不同的实现方式。其核心思想是为每一次操作生成一个唯一性的凭证,也就是 Token。一个 Token 在操作的每一个阶段只有一次执行权,一旦执行成功就直接保存执行结果。

它主要针对客户端连续点击或者调用方的超时重试等情况,例如提交订单,此种操作就可以用 Token 的机制实现防止重复提交。

简单的说就是调用方在调用接口的时候先向后端请求一个全局 ID(Token),请求的时候携带这个全局 ID 一起请求(最好将其放到 Headers 中),后端需要对这个 Token 作为 Key,用户信息作为 Value 到 Redis 中进行键值内容校验,如果 Key 存在且 Value 匹配就执行删除命令,然后正常执行后面的业务逻辑。如果不存在对应的 Key 或 Value 不匹配就返回重复执行的错误信息,以此来保证幂等操作。


 


http://chatgpt.dhexx.cn/article/YHE6lVfD.shtml

相关文章

什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?

博主负责的项目报了一个问题,用户操作回退失效。我们的设计里,操作回退是回到操作前的状态。经过查看日志发现,用户之前的操作做了两次,也就是说提交操作的接口被调用了两次,导致之用户上一次的状态和这一次的状态是一…

接口幂等性校验

接口幂等性校验 一、概念 幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。 在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指…

接口幂等性这么重要,它是什么?怎么实现?

什么是幂等性? 对于同一笔业务操作,不管调用多少次,得到的结果都是一样的。 幂等性设计 我们以对接支付宝充值为例,来分析支付回调接口如何设计? 如果我们系统中对接过支付宝充值功能的,我们需要给支付宝…

接口的幂等性怎么设计?

自己最近负责的几个接口,都涉及到了幂等性的操作,抽空总结了一下,这也是面试官比较爱问的问题。 一、什么是幂等? 看一下维基百科怎么说的: 幂等性:多次调用方法或者接口不会改变业务状态,可以…

java中接口幂等性解决方案总结

一、概念 一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变…

高并发下接口幂等性解决方案

一、背景 我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。 例如1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果;2. 我们发起一笔付款请求,应该只扣用户…

接口幂等性测试

前言 所谓幂等: 多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。 我们在开发中主要操作也就是CURD,其中读取操作和删除操作是天然幂等的,我们所关心的就是创建操作、更新操作。 创建操作一定是非幂等的因为要涉及到…

接口幂等性是什么?如何设计?

接口幂等 什么是接口幂等?为什么接口需要幂等性设计前端重复提交表单黑客恶意攻击接口超时重复提交消息重复消费 哪些接口需要幂等?如何实现幂等前端拦截数据库唯一索引实现数据库乐观锁实现数据库悲观锁实现JVM锁实现分布式锁实现Token实现 总结 接口幂…

开发中是如何保证接口幂等性的?

文章目录 一、定义二、业务场景三、保证幂等性常用方法方案1: insert前先select(基于mysql的分布式锁)方案2:加悲观锁 select * from table where id 1 for update(基于mysql的分布式锁)方案3:加乐观锁 增…

如何保证接口的幂等性?常见的实现方案有哪些?

什么是幂等性 幂等用于表示任意多次请求均与一次请求执行的结果相同,也就是说对于一个接口而言,无论调用了多少次,最终得到的结果都是一样的。 如何保证接口的幂等性 1、前端拦截 2、使用数据库实现幂等性 3、使用 JVM 锁实现幂等性 4、…

接口幂等性常见的解决方案

一、什么是接口幂等性? 接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。 举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的…

接口幂等性解决方案

一、分布式锁解决方案 先说这种方案,在网上有一些文章说可以通过分布式锁来保证幂等性。但是我认为这种方案不能保证幂等性,不可取。看下面分析 ①、方案流程介绍 用户通过浏览器发起请求,服务端接收请求数据,并且从请求数据中…

什么是接口的幂等性,如何实现接口幂等性?一文搞定

微信搜索《Java鱼仔》,每天一个知识点不错过 每天一个知识点 什么是接口的幂等性,如何实现接口幂等性? (一)幂等性概念 幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口&#x…

什么是幂等性?四种接口幂等性方案详解

幂等性在我们的工作中无处不在,无论是支付场景还是下订单等核心场景都会涉及,也是分布式系统最常遇见的问题,除此之外,也是大厂面试的重灾区。 知道了幂等性的重要性,下面我就详细介绍幂等性以及具体的解决方案&#…

接口的幂等性

1、接口调用存在的问题 现如今我们的系统大多拆分为分布式 SOA,或者微服务,一套系统中包含了多个子系统服务,而一个子系统服务往往会去调用另一个服务,而服务调用服务无非就是使用 RPC 通信或者 restful。既然是通信,…

如何保证接口的幂等性?

什么是幂等性?所谓幂等,就是任意多次执行所产生的影响均与一次执行的影响相同。 为什么会产生接口幂等性问题 在计算机应用中,可能遇到网络抖动,临时故障,或者服务调用失败,尤其是分布式系统中,接口调用…

什么是接口的幂等性以及如何实现接口幂等性

目录 1、接口调用存在的问题 2、什么是接口的幂等性 3、不做接口的幂等性会产生什么影响 4、什么情况下需要保证接口的幂等性 4.1 select:查询操作 4.2 insert:新增操作 4.3 delete:删除操作 4.3.1 绝对删除 具有幂等性 4.3.2 相对删…

Python安装pygame教程

Python安装pygame教程 1、版本说明 由于python3.8与pygame存在不兼容的问题,因此在下载Python的时候,需要下载python3.8以下版本的,我下载的是python3.7.5 2、具体步骤 1、在本机控制台通过命令安装pygame pip install pygame 出现错误 …

Pygame 教程(2):重要的概念及对象

本章,将介绍 Pygame 中的重要概念及对象。 导航 上一章:创建第一个应用程序 下一章:绘制图形 文章目录 导航像素坐标Rect 对象Color 对象Surface 对象实例:矩形生成器创建初始窗口创建生成矩形的函数调用函数完整代码 结语 像素…

Pygame教程系列二:MoviePy视频播放篇

【前言】 在pygame 2.0.0版本之前,播放视频可以使用pygame.movie.Movie(xxxx.mpg)播放(只支持.mpg格式的视频),但是在pygame 2.0.0之后,作者因为觉得视频模块维护成本太高就给抛弃了,假如你使用pygame 2.0.0,还调用上述…