什么是幂等性?

参考地址:解决幂等问题

概念:

一个接口,不管我调多少次,只要参数不变,结果也应该不变。

但是在实际工作中,幂等性一般分为两种:

  1. 请求幂等:每次请求,如果参数一样,结果也应该一样。
  2. 业务幂等:同一次业务请求,在拿到最终状态之后的每次请求,结果要保证一样。在没拿到状态之前,每一次请求需要正常执行业务逻辑,直到推进到最终状态。

一般来说,我们谈到的幂等性,大部分都是业务幂等。
比如:一次支付请求,如果支付返回处理中,或者系统异常等,我们需要重试,继续调用,直到他明确的返回支付成功,或者明确的无法支付失败结果。

如何保证幂等性?

想要保证幂等性,最简单的做法就是:在做业务操作之前,先查一下,判断下本次操作是否有被执行过,如果执行过,则不再执行,否则继续执行。

但是,这个方案存在一个关键性的问题:就是在高并发场景中,可能会有幂等击穿的。


所以,想要解决好这个问题,需要做好并发控制。

解决幂等问题口诀:一锁、二判、三更新

一锁、二判、三更新

一锁:第一步,先加锁。可以加分布式锁,或者悲观锁。但是一定要是一个互斥锁。
二判:第二步,进行幂等性判断。可以基于状态机、流水表、唯一性索引等进行重复操作判断。
三更新:第三步,进行数据的更新,将数据进行持久化。


三步需要严格控制顺序,确保加锁成功后进行数据查询和判断,幂等性判断通过后再更新,更新结束后释放锁。

以上操作需要有一个前提,那就是第一步加锁、和第二步判断的时候,需要有一个依据,这个就是幂等号了,通常需要和上游约定一个唯一ID作为幂等号。然后通过对幂等号加锁,再通过幂等号进行幂等判断即可。

一锁这个过程,建议使用Redis实现分布式锁,因为他是非阻塞的高效率的互斥锁。非常适合在幂等控制场景中。

二判这个过程,如果有操作流水,建议基于操作流水做幂等,并将幂等号作为唯一性约束,确保唯一性。如果没有流水,那么基于状态机也是可以的。

但是不管怎么样,数据库的唯一性约束都要加好,这是系统的最后一道防线。万一前面的锁失效了,这里也能控制得住不会产生脏数据。

如何解决接口幂等性问题?相关推荐

  1. springboot幂等性_如何使用 SpringBoot + Redis 优雅的解决接口幂等性问题

    前言: 在实际的开发项目中,一个对外暴露的接口往往会面临,瞬间大量的重复的请求提交,如果想过滤掉重复请求造成对业务的伤害,那就需要实现幂等! 我们来解释一下幂等的概念: 任意多次执行所产生的影响均与一 ...

  2. redistemplate使用_如何使用 SpringBoot + Redis 优雅的解决接口幂等性问题

    # 前言 在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求,我们来解释一下幂等的概念:任意多次执行所产生的影响均与一次执行的影响相同.按照这个含义,最终的含义就是 对数据库的影响只能是一次性 ...

  3. redis实现接口幂等性

    redis实现接口幂等性 1. 说明 幂等性的概念:任意多次执行所产生得影响均与一次执行的影响相同,对数据库的影响只能是一次性的,不能重复处理.在实际项目中,在客户端没限制幂等性,重复调用接口,导致接 ...

  4. oracle 锁表如何解决_「技术分享」高并发下的接口幂等性解决方案

    高并发下的接口幂等性解决方案! 一.背景我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果.例如:前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果.我们发起 ...

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

    作者:三分恶 原文链接:https://cnblogs.com/three-fighter/p/14054749.html 博主负责的项目报了一个问题,用户操作回退失效.我们的设计里,操作回退是回到操 ...

  6. mysql的api框架_API接口幂等性框架设计

    表单重复提价问题 rpc远程调用时候 发生网络延迟  可能有重试机制 MQ消费者幂等(保证唯一)一样 解决方案: token 令牌 保证唯一的并且是临时的  过一段时间失效 分布式: redis+to ...

  7. 接口幂等性的设计之————redis分布式锁的应用

    接口幂等性的设计之----redis分布式锁的应用 在集群分布式机器部署的前提下,接口在相同数据高并发的情况下如果没有唯一索引的情况下,可能会有一些问题. 比如: 插入或更新商品的接口,如果没有则插入 ...

  8. 【案例分析】分布式系统的接口幂等性设计!

    概念 幂等性, Idempotence, 这个词来源自数学领域, 百科 上一元运算的幂等性解释如下:设 f 为一由 {x} 映射至 {x} 的一元运算, 则 f 为幂等的, 当对于所有在 {x} 内的 ...

  9. java幂等性原理_Java接口幂等性设计原理解析

    在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景: 一个订单创建接口,第一次调用超时了,然后调用方重试了一次 在订单创建时,我们需要去扣减库存,这时接口发生了超时,调用方重试了一次 当这笔订 ...

最新文章

  1. 数学仍然是人类的“火炬”
  2. keepalived + haproxy 实现web 双主模型的高可用负载均衡--转
  3. 【NLP】可交互的 Attention 可视化工具!我的Transformer可解释性有救了?
  4. HDU4372 Count the Buildings
  5. LeetCode 186. 翻转字符串里的单词 II
  6. spring中怎么让事物提交_Spring怎么在一个事务中开启另一个事务
  7. android判断点击次数_Android应用统计-使用时长及次数统计(一)
  8. SAP 严重漏洞可导致供应链攻击
  9. mysql-connector-java-5.1.22下载
  10. BMS 项目过程中遇到的问题
  11. PHP代码审计基础知识
  12. 云班课资源自动下载详细教程
  13. 博客整理002-KICAD生成gerber板厂打不开的原因
  14. 吴恩达机器学习课后编程作业第二课解析:logistic regression
  15. java读取加密excel_Java 加密和解密Excel文档
  16. 不能成为跳槽理由的理由
  17. 使用Windows 10自带工具 校验MD5 SHA1 SHA256类型文件
  18. VuePress 博客之 SEO 优化(一) sitemap 与搜索引擎收录
  19. 时序分析基础(1)----寄存器时序分析模型
  20. 【拆解】Apple Watch Series 6 ,电池更大、陶瓷和蓝宝石外壳更薄,更强硬,更耐磨!...

热门文章

  1. 计算机八股文:操作系统总结
  2. 西门子S7以太网通讯处理器编程调试驱动安装
  3. [Cnbeta]龙芯处理器性能怎么样
  4. 写html代码的ws,wstest.html
  5. 流体动力学—拉格朗日法和欧拉法
  6. [附源码]Python计算机毕业设计Django-Steam游戏平台系统论文
  7. 基于墨刀的界面原型设计——应用集APP
  8. Hive创建分区表、动态插入、删除分区表
  9. Latex排版中遇到的难点(以Elsevier为例)
  10. 2021湖北技能高考文化综合成绩查询,2021年湖北省技能高考文化综合考试大纲