如何解决接口幂等性问题?
什么是幂等性?
参考地址:解决幂等问题
概念:
一个接口,不管我调多少次,只要参数不变,结果也应该不变。
但是在实际工作中,幂等性一般分为两种:
- 请求幂等:每次请求,如果参数一样,结果也应该一样。
- 业务幂等:同一次业务请求,在拿到最终状态之后的每次请求,结果要保证一样。在没拿到状态之前,每一次请求需要正常执行业务逻辑,直到推进到最终状态。
一般来说,我们谈到的幂等性,大部分都是业务幂等。
比如:一次支付请求,如果支付返回处理中,或者系统异常等,我们需要重试,继续调用,直到他明确的返回支付成功,或者明确的无法支付失败结果。
如何保证幂等性?
想要保证幂等性,最简单的做法就是:在做业务操作之前,先查一下,判断下本次操作是否有被执行过,如果执行过,则不再执行,否则继续执行。
但是,这个方案存在一个关键性的问题:就是在高并发场景中,可能会有幂等击穿的。
所以,想要解决好这个问题,需要做好并发控制。
解决幂等问题口诀:一锁、二判、三更新
。
一锁、二判、三更新
一锁:第一步,先加锁。可以加分布式锁,或者悲观锁。但是一定要是一个互斥锁。
二判:第二步,进行幂等性判断。可以基于状态机、流水表、唯一性索引等进行重复操作判断。
三更新:第三步,进行数据的更新,将数据进行持久化。
三步需要严格控制顺序,确保加锁成功后进行数据查询和判断,幂等性判断通过后再更新,更新结束后释放锁。
以上操作需要有一个前提,那就是第一步加锁、和第二步判断的时候,需要有一个依据,这个就是幂等号了,通常需要和上游约定一个唯一ID作为幂等号。然后通过对幂等号加锁,再通过幂等号进行幂等判断即可。
一锁这个过程,建议使用Redis实现分布式锁,因为他是非阻塞的高效率的互斥锁。非常适合在幂等控制场景中。
二判这个过程,如果有操作流水,建议基于操作流水做幂等,并将幂等号作为唯一性约束,确保唯一性。如果没有流水,那么基于状态机也是可以的。
但是不管怎么样,数据库的唯一性约束都要加好,这是系统的最后一道防线。万一前面的锁失效了,这里也能控制得住不会产生脏数据。
如何解决接口幂等性问题?相关推荐
- springboot幂等性_如何使用 SpringBoot + Redis 优雅的解决接口幂等性问题
前言: 在实际的开发项目中,一个对外暴露的接口往往会面临,瞬间大量的重复的请求提交,如果想过滤掉重复请求造成对业务的伤害,那就需要实现幂等! 我们来解释一下幂等的概念: 任意多次执行所产生的影响均与一 ...
- redistemplate使用_如何使用 SpringBoot + Redis 优雅的解决接口幂等性问题
# 前言 在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的影响相同.按照这个含义,最终的含义就是 对数据库的影响只能是一次性 ...
- redis实现接口幂等性
redis实现接口幂等性 1. 说明 幂等性的概念:任意多次执行所产生得影响均与一次执行的影响相同,对数据库的影响只能是一次性的,不能重复处理.在实际项目中,在客户端没限制幂等性,重复调用接口,导致接 ...
- oracle 锁表如何解决_「技术分享」高并发下的接口幂等性解决方案
高并发下的接口幂等性解决方案! 一.背景我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果.例如:前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果.我们发起 ...
- 什么是接口幂等性?为什么会产生这个问题?如何保证接口幂等性?
作者:三分恶 原文链接:https://cnblogs.com/three-fighter/p/14054749.html 博主负责的项目报了一个问题,用户操作回退失效.我们的设计里,操作回退是回到操 ...
- mysql的api框架_API接口幂等性框架设计
表单重复提价问题 rpc远程调用时候 发生网络延迟 可能有重试机制 MQ消费者幂等(保证唯一)一样 解决方案: token 令牌 保证唯一的并且是临时的 过一段时间失效 分布式: redis+to ...
- 接口幂等性的设计之————redis分布式锁的应用
接口幂等性的设计之----redis分布式锁的应用 在集群分布式机器部署的前提下,接口在相同数据高并发的情况下如果没有唯一索引的情况下,可能会有一些问题. 比如: 插入或更新商品的接口,如果没有则插入 ...
- 【案例分析】分布式系统的接口幂等性设计!
概念 幂等性, Idempotence, 这个词来源自数学领域, 百科 上一元运算的幂等性解释如下:设 f 为一由 {x} 映射至 {x} 的一元运算, 则 f 为幂等的, 当对于所有在 {x} 内的 ...
- java幂等性原理_Java接口幂等性设计原理解析
在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景: 一个订单创建接口,第一次调用超时了,然后调用方重试了一次 在订单创建时,我们需要去扣减库存,这时接口发生了超时,调用方重试了一次 当这笔订 ...
最新文章
- 数学仍然是人类的“火炬”
- keepalived + haproxy 实现web 双主模型的高可用负载均衡--转
- 【NLP】可交互的 Attention 可视化工具!我的Transformer可解释性有救了?
- HDU4372 Count the Buildings
- LeetCode 186. 翻转字符串里的单词 II
- spring中怎么让事物提交_Spring怎么在一个事务中开启另一个事务
- android判断点击次数_Android应用统计-使用时长及次数统计(一)
- SAP 严重漏洞可导致供应链攻击
- mysql-connector-java-5.1.22下载
- BMS 项目过程中遇到的问题
- PHP代码审计基础知识
- 云班课资源自动下载详细教程
- 博客整理002-KICAD生成gerber板厂打不开的原因
- 吴恩达机器学习课后编程作业第二课解析:logistic regression
- java读取加密excel_Java 加密和解密Excel文档
- 不能成为跳槽理由的理由
- 使用Windows 10自带工具 校验MD5 SHA1 SHA256类型文件
- VuePress 博客之 SEO 优化(一) sitemap 与搜索引擎收录
- 时序分析基础(1)----寄存器时序分析模型
- 【拆解】Apple Watch Series 6 ,电池更大、陶瓷和蓝宝石外壳更薄,更强硬,更耐磨!...