Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在IT领域,什么是幂等性(idempotence)?为什要实现幂等?如何解决幂等性?

在IT领域,什么是幂等性(idempotence)?为什要实现幂等?如何解决幂等性?

作者头像
崔认知
发布于 2024-03-22 03:22:09
发布于 2024-03-22 03:22:09
1.8K02
代码可运行
举报
文章被收录于专栏:nobodynobody
运行总次数:2
代码可运行

幂等性(idempotence)的定义

幂等性(idempotence)是一个数学和计算机学概念,指的是对于同一操作,无论是一次还是多次执行,产生的结果是一致的,不会因为多次执行而产生副作用。在编程中,幂等操作是指可以使用相同参数重复执行,对系统产生的影响是一样的,即对资源的作用是一样的,不会发生副作用

为什要实现幂等性

在分布式系统和网络通信中,幂等性尤为重要,以防止数据重复或丢失更新问题开发人员在日常开发中必须要考虑幂等性的,尤其是转账、支付等涉及金额交易的场景,如果出现幂等性的问题,造成的后果是非常严重的

非幂等的常见原因

非幂等的重要因素是重复提交引起的,一般情况下,接口调用时都能正常返回信息,不会重复提交,但遇见以下情况时就可能会出现问题,常见的场景如下:

●因网络波动,用户重复提交请求

●用户恶意进行刷单行为

●接口超时重试请求

定时任务重试 ●使用消息队列时,重复消费现象

如何解决幂等性

幂等设计一般有两种处理方法:

(1)需要下游系统提供相关的查询接口。超时业务重试时,先通过接口查询,如果查询到数据,表明上次的调用已经成功,如果失败了就走失败流程。

(2)通过幂等性的方式。也就是这个查询操作交给下游系统,上游系统只管重试,由下游系统保证一次和多次的请求结果是一样的。

幂等的解决方案非常多,需要根据具体的业务场景选择具体策略。

方案一:数据库唯一索引实现幂等性

在保存数据前,可以先select一下数据是否存在。如果数据已存在,则不再写入数据,如果数据不存在,则执行insert操作

但在高并发的场景下,可能会出现两个请求select的时候,都没有查到数据,然后都执行了insert操作,所以此时会有重复数据产生,因此在数据库中,我们需要添加唯一索引来保证幂等

在数据库中,唯一索引是不会引起重复数据的兜底策略。

方案二:防重表机制

防重表机制与唯一索引机制是相同的原理,只不过是单独建一个防重表,防重表也必须引入唯一索引,而且防重表与业务表必须在同一数据库,并且操作要在同一个事务中

防重表机制的主要流程:把唯一主键插入防重表,再进行业务操作,且它们处于同一个事务中。当重复请求时,因为去重表有唯一约束,导致请求失败,可以避免幂等问题。注意去重表和业务表应该在同一个库中,这样就保证了在同一个事务中,即使业务操作失败,也会把去重表的数据回滚。这样可以很好地保证数据的一致性。该方案也是比较常用的,去重表跟业务无关,很多业务可以共用同一个去重表,只要规划好唯一主键即可。

方案三:数据库乐观锁实现幂等性

数据库乐观锁方案适用于执行更新操作,通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号等于数据库表当前版本号,则予以更新,否则认为是过期数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 update account set amount=amount-50,version=version+1 
 
 where id=123 and version = 1;

方案四:悲观锁实现幂等性

悲观锁的实现,往往依靠数据库提供的锁机制,具有强烈的独占和排他特性。

通过mysql 的sql 语句 for update 可以锁住数据;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 select * from account where id = 123 for update;

这里id字段一定要是主键或者唯一索引,不然会锁住整张表,严重影响性能。

方案五:防重Token令牌实现幂等

此方案包含两个请求阶段:

1.客户端请求服务端申请获取token。

2.客户端携带token再次请求,服务端校验token后进行操作。

方案六:分布式锁

分布式锁的逻辑是,每次请求都通过业务唯一ID来尝试获取锁,如果获取成功,就进行后续业务逻辑操作,如果获取失败,就舍弃请求直接返回。

分布式锁通常是基于redis来实现的。

方案六:状态机

很多时候,业务流程是有状态流转的,这个时候可以使用状态机来保证幂等性。

如订单业务中,存在状态「1-已下单,2-已支付,3-已完成,4-已取消」,按照业务流程,状态是依次流转的,所以在update操作时,我们就要根据本次的状态来更新下一次的状态

状态机其实是乐观锁的一种特例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 update order_info set status = 3 
 
 where id = 123 and status = 2;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 认知科技技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?
博主负责的项目报了一个问题,用户操作回退失效。我们的设计里,操作回退是回到操作前的状态。经过查看日志发现,用户之前的操作做了两次,也就是说提交操作的接口被调用了两次,导致之用户上一次的状态和这一次的状态是一样的,所以操作回退是没有问题的,问题出在了操作的接口被调用了两次。
三分恶
2020/12/01
1.7K0
什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?
如何保证接口幂等性?
幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。
程序猿川子
2023/01/05
8650
面试官:如何保证接口幂等性?一口气说了12种方法!
幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。
程序员大彬
2022/12/22
2.1K0
面试官:如何保证接口幂等性?一口气说了12种方法!
高并发下如何保证接口的幂等性?
幂等性就是同一个操作执行多次,产生的效果一样。如http的get请求,数据库的select请求就是幂等的
Java识堂
2020/07/21
1.2K0
浅谈网络中接口幂等性设计问题
所谓幂等性设计,就是说,一次和多次请求某一个资源应该具有同样的副作用。用数学的语言来表达就是:f(x) = f(f(x))。
栗筝i
2023/03/08
6600
如何做到接口的幂等性
我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。例如:
用户3467126
2019/10/24
5.2K0
如何做到接口的幂等性
幂等性如何保证
幂等概念来自数学,表示对数据源做N次变换和1次变换的结果是相同的。在工程中幂等性用来表示用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
main方法
2021/06/17
1.2K0
幂等性如何保证
接口幂等性的解决方案
在编程中,幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数指的是那些使用相同参数重复执行也能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。比如说getIdCard()函数和setTrue()函数就是幂等函数。
崔笑颜
2020/07/25
6850
深入理解为什么要设计幂等性的服务
HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。
搜云库技术团队
2019/10/18
1.4K0
高并发下接口幂等性解决方案
我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。例如1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果;2. 我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也应该只扣一次钱;3. 发送消息,也应该只发一次,同样的短信发给用户,用户会哭的;4. 创建业务订单,一次业务请求只能创建一个,创建多个就会出大问题等等很多重要的情况都需要幂等的特性来支持。
用户2781897
2021/01/13
4730
高并发下接口幂等性解决方案
高并发下的接口幂等性解决方案!
来源:blog.csdn.net/u011635492/article/details/81058153
芋道源码
2019/11/21
9170
谈谈高并发下的幂等性处理
Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.
Bug开发工程师
2018/07/23
3K0
接口幂等性
接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用;比如说支付场景,用户购买了商品支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条...,这就没有保证接口的幂等性。
一个风轻云淡
2023/10/15
3010
一文理解如何实现接口的幂等性
幂等,这个词来源自数学领域。幂等性衍生到软件工程中,它的语义是指:函数/接口可以使用相同的参数重复执行, 不应该影响系统状态,也不会对系统造成改变。
全菜工程师小辉
2021/06/25
5K0
一文理解如何实现接口的幂等性
浅谈高并发下接口幂等性解决方案
在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和setTrue()”函数就是一个幂等函数. 更复杂的操作幂等保证是利用唯一交易号(流水号)实现.
IT技术小咖
2019/06/26
4.8K0
聊聊幂等设计
当前互联网的系统几乎都是解耦隔离后,会存在各个不同系统的相互远程调用。调用远程服务会有三个状态:成功,失败,或者超时。前两者都是明确的状态,而超时则是未知状态。我们转账超时的时候,如果下游转账系统做好幂等控制,我们发起重试,那即可以保证转账正常进行,又可以保证不会多转一笔。
捡田螺的小男孩
2022/01/05
9500
聊聊幂等设计
系统幂等设计浅谈
幂等设计在分布式系统设计中占有很重要的地位,是实现数据一致性和事务完整性的重要手段。近期在优化交易系统,系统中很多地方用到了幂等设计,遂对其进行了总结。
用户1139732
2019/09/03
1.7K0
系统设计——幂等性与解决方案
摘要 幂等概念来自数学,表示N次变换和1次变换的结果是相同的。这里讨论在某些场景下,客户端在调用服务没有达到预期结果时,会进行多次调用,为避免多次重复的调用对服务资源产生副作用,服务提供者会承诺满足幂等。HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的副作用(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。
终有救赎
2023/10/16
5450
系统设计——幂等性与解决方案
详细讲解服务幂等性设计
在日常工作中的一些技术设计方案评审会上,经常会有提到注意服务接口的幂等性问题,最近就有个同学就跑到跟前问我,幂等性到底是个啥?
架构精进之路
2021/11/08
1.8K0
详细讲解服务幂等性设计
我是这样给同事分析幂等性问题的
在日常一些技术设计方案评审会上,经常会提到注意服务接口的幂等性问题,最近有个同学就跑到跟前问我,到底啥是幂等性?
架构精进之路
2020/08/17
6690
我是这样给同事分析幂等性问题的
相关推荐
什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验