分布式接口幂等性设计实现

分布式幂等性 幂等性是指在分布式系统中,一个操作多次执行的结果与其执行一次的结果相同。设计具有幂等性的分布式系统可以有效避免数据不一致和重复处理的问题。 阅读详情

面对分布式架构和微服务复杂的系统架构和网络超时服务器异常等带来的系统稳定性问题,分布式接口的幂等性设计显得尤为重要。本文简要介绍了几种分布式接口幂等性设计实现,包括Token去重机制、乐观锁机制、数据库主键和状态机实现等,以加深理解。


1、分布式接口幂等性相关概念
1.1 什么是幂等性

幂等性来源自数学领域,数学上的幂等性是指对于某一元运算为幂等的操作,在任意元素上多次执行的结果是相同的。例如,函数f(x) = f(x)对于任意的x,在x上的第一次和第二次执行可以得到相同的结果。

在HTTP/1.1规范中幂等性的定义如下:

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.

一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。

在HTTP协议中,HTTP GET是一个清晰的幂等操作,HTTP DELETE/POST是非幂等的,HTTP PUT也是幂等的,因为对同一个URI进行多次PUT的side-effetcs是一致的。

在这里插入图片描述

在分布式架构或者微服务架构中,由于分布式自身的时序问题以及系统网络的稳定性,接口具有成功、失败和无响应的三种状态,为了提供系统的可用性,重复提交是不可避免的,而重试就会引发幂等性的问题。

1.2 幂等性的使用场景

分布式接口的幂等性实际上就是接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的。幂等性适用于以下场景:

  1. 前端重复提交:在订单系统中用户在前端提交订单,快速重复点击多次,造成后端生成多个内容重复的订单,但是后台应该只产生一个订单。
  2. 接口超时重试:对于给第三方调用的接口,为了防止网络抖动或其他原因造成请求丢失,这样的接口一般都会设计成超时重试多次。防止外部多次调用对系统数据状态的发生多次改变,将服务接口设计成幂等,就是为了防止多次重试造成系统不一致的问题。比如账户扣款操作超时重试了多次,理应只扣款一次。
  3. 消息重复消费:MQ消息中间件,消息重复消费,相同请求条件下这次消费的结果与下一次应该保持一致。
1.3 分布式接口幂等性的实现方案

接口幂等性的解决方案可以在客户端和服务端实现,但是客户端控制效果不佳,比如按钮置灰、不可点击等,由于涉及到多设备兼容性以及接口调用的问题,并不能真正实现幂等。因此安全的措施还是从后端接口层进行控制,有以下几种方案:

  1. Token去重:根据业务的操作和内容生成一个Token值(全局唯一ID),在执行操作前先根据这个全局唯一ID进行校验,来判断这个操作是否已经执行。如果存在则表示该方法已经执行。
  2. 乐观锁机制:适用于更新操作。在查询和删除操作中使用乐观锁机制,保证一次处理结果,避免重复操作。设计表结构时使用乐观锁,通过version来做乐观锁,这样既能保证执行效率,又能保证幂等。
  3. 数据库主键:适用于插入时的幂等性。利用数据库中主键唯一约束的特性,保证一张表中只能存在一条带该唯一主键的记录。
  4. 状态机幂等:根据业务表的状态特性设计,只支持状态的单向改变,在执行的时候加上状态信息,实现幂等。

幂等性设计简化了客户端的处理逻辑,却增加了服务端逻辑处理和设计上的复杂性,增加额外控制幂等的业务逻辑的同时,将并行执行改为串行降低了执行效率。

2、几种接口幂等性方案介绍
2.1 Token去重

Token机制是通过在服务端生成一个唯一的Token,并将其存储在客户端中,来保证多个客户端之间对同一个服务的请求结果的一致性。Token机制的实现原理如下:

  1. 服务端生成Token:服务端需要生成一个唯一的Token,可以使用时间戳、随机数等信息来生成。生成Token后,将其存储在服务端的数据库中。
  2. 客户端获取Token:客户端在每次请求服务时,需要向服务端发送一个请求Token。请求Token是服务端根据Token生成的唯一标识,客户端通过该Token来识别自己的身份,并在服务端的数据库中查找对应的Token。
  3. 如果找到了对应的Token,则说明该请求是第一次请求,服务端将其存储在数据库中,并返回一个唯一的标识符;如果在数据库中找不到该Token,则说明该请求是重复请求,服务端不返回任何结果,并提示用户重新操作。
  4. 如果在数据库中也找不到该Token,则说明该请求是幂等请求,服务端可以直接返回结果,不做任何操作。

在这里插入图片描述

Token机制的优点是实现简单、易于部署和维护,能够保证分布式系统的幂等性。但是,它也存在一些局限性,例如需要在服务端和客户端之间传递Token,可能会导致性能问题;另外,如果Token被滥用,也可能会带来安全问题。因此,在使用Token机制时,需要根据具体情况进行权衡和选择。

2.2 乐观锁机制

数据库乐观锁方案一般适用于更新操作的幂等性,实现逻辑是在对应的数据表中添加一个version字段,作为当前数据的的版本标识。这样每次对这条数据执行更新时,都会将该版本标识作为一个条件,值需要为上次待更新数据中的版本标识的值。

1)先根据条件查询数据,得到对应的版本号version

select version from tablename where xxx

2)更新数据时带上版本号version,只有版本号匹配才会更新数据,如果不匹配则不更新

update tablename set count=count+1, version=version+1 where version=#{version}

3)更新数据的时候,同时需要更新数据对应的版本号version,这样可以解决ABA问题。

如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到它仍然是A值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回A,那CAS操作就会误认为它从来没有被修改过。这个问题被称为CAS操作的 "ABA"问题。

乐观锁机制实际上是牺牲了并发性来实现更新操作的幂等性,在并发场景下会导致大量的锁冲突等待和性能问题。

2.3 数据库主键

数据库唯一主键机制是利用主键的唯一性约束,适用于插入操作的幂等性,当插入主键重复的数据时会抛出异常,保证数据的一致性。表结构设计如下所示:

CREATE TABLE `t_check` (
  `id` int(11) NOT NULL COMMENT 'ID',
  `serial_no` varchar(255)  NOT NULL COMMENT '唯一序列号',
  `source_type` varchar(255)  NOT NULL COMMENT '资源类型',
  `status` int(4) DEFAULT NULL COMMENT '状态',
  PRIMARY KEY (`id`)
  UNIQUE KEY `key_s` (`serial_no`,`source_type`)  COMMENT '保证业务唯一性'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='幂等性校验表';

唯一主键UNIQUE KEY的关键性字段如下:

  • serial_no:唯一序列号的值,在分布式架构下是全局唯一的ID
  • source_type:业务类型,区分不同的业务,订单,支付等。

具体处理逻辑如下图所示:

在这里插入图片描述

2.4 状态机实现幂等

对于很多业务是有业务流转状态的,如订单的待提交,待支付,已支付,取消等,在业务逻辑处理的时候只支持状态的单向改变。业务表在设计的时候增加状态字段status,这样在更新的时候加上“status=期望的status”,多次调用的话实际也只会执行一次。

update xx where id=1 and status=1

在这里插入图片描述

3、总结

分布式架构下幂等性是保证接口能够重复执行的重要机制,幂等性和防重又有所不同,防重是在第一次请求已经成功的情况下人为多次重复操作导致的状态改变,幂等性是在不确定第一次请求结果的情况下,发起多次请求不会出现状态的变化。实际使用中,通过数据库主键的唯一性可以实现幂等性和防重,乐观锁的version机制能够实现并发更新下的幂等性,也可以通过数据库悲观锁机制在业务操作前获取锁资源实现唯一性操作。总而言之,分布式接口的幂等性是在牺牲一定的并发和性能的前提下,以实现系统的稳定性和容错性。


参考资料:

  1. https://blog.youkuaiyun.com/tengxvincent/article/details/81773745
  2. https://www.cnblogs.com/jajian/p/10926681.html
  3. https://blog.youkuaiyun.com/qq_41863849/article/details/123973348
  4. https://zhuanlan.zhihu.com/p/70748661
Pascal Context数据集实战:从安装到格式转换的完整指南 本文提供了Pascal Context数据集的完整实战指南,从安装配置到格式转换的详细步骤。Pascal Context是计算机视觉领域重要的语义分割数据集,包含540个精细标注类别。文章涵盖数据集下载、环境配置、预处理技巧和常见问题解决方案,帮助开发者高效利用这一数据集进行场景理解任务。 阅读详情

相关推荐

INCA基础教程

以软件自带Demo为例记录INCA学习过程,主要内容包括测量与标定。

yunqianrui的博客 6万+

分布式服务的接口幂等性如何设计

操作完成后,释放掉锁,因为幂等问题,通常是一个请求快速过来两次或者多次,所以在释放锁之前让后来的同一个用户的请求,直接失败即可,保证当前方法在短时间之内只能被执行一次,切记控制锁的粒度。然后用户在前端上操作的时候,不知道为啥,总之就是一个砍一个订单 不小心发起了两次砍一刀请求,然后这俩请求分散在了这个服务部署的不同的机器上,结果造成一个用户被砍了扣两次。所谓幂等性,就是说一个接口,多次发起同一个请求,你这个接口得保证结果是准确的,比如不能多扣款,不能多插入一条数据,不能将统计值多加了1。

程序员小刘 1338

ROS2_IGH方案配置(二)——Ubuntu22.04 实时内核性能验证与调优

本文详细介绍了在Ubuntu22.04系统上配置ROS2_IGH方案时,如何验证和调优PREEMPT_RT实时内核性能。通过使用cyclictest工具进行基准测试和压力测试,分析中断与硬件延迟,并优化内核参数,确保系统满足工业控制领域对硬实时性的苛刻要求。文章还提供了针对ROS2的特殊优化建议和性能监控方案,帮助开发者实现毫秒级延迟的稳定控制。

weixin_30791095的博客 222

分布式系统中接口的幂等性如何设计

分布式系统中接口的幂等性如何设计

qq_39350797的博客 543

高速SerDes均衡技术解析

均衡技术是高速SerDes链路中补偿信道损耗和失真的核心技术,通过FFE、CTLE和DFE三种主要方法对抗码间干扰(ISI)。FFE在发射端预补偿前光标干扰,CTLE通过提升高频增益补偿信道损耗,DFE则精准消除后光标干扰。三种技术各具优势:FFE实现简单且不放大噪声,CTLE功耗低易于集成,DFE能自适应调整且保持信噪比。这些技术协同工作可有效提升系统传输速率和可靠性。

一只豌豆象的博客 1945

RocketMQ源码分析之消息轨迹

文章目录前言一、消息轨迹二、消息轨迹源码分析1、producer端2、consumer端三、消息轨迹中存储的信息1.TraceContext2.TraceBean3.TraceType四、总结 前言   本篇文章将会从以下方面介绍消息轨迹:什么是消息轨迹?如何启用消息轨迹?示例demo、消息轨迹的源码分析和消息轨迹中存储的信息。最后会用一张图来总结消息轨迹的工作原理。 一、消息轨迹 1.什么是消息轨迹? 消息轨迹是用来跟踪记录消息发送、消息消费的轨迹。 2.如何启用消息轨迹? broker端 需要在b

不爱学习的小妞博客 1074

分布式系统中的幂等性

什么是幂等性 现如今我们的系统大多拆分为分布式SOA,或者微服务,一套系统中包含了多个子系统服务,而一个子系统服务往往会去调用另一个服务,而服务调用服务无非就是使用RPC通信或者restful,既然是通信,那么就有可能再服务器处理完毕后返回结果的时候挂掉,这个时候用户端发现很久没有反应,那么就会多次点击按钮,这样请求有多次,那么处理数据的结果是否要统一呢?那是肯定的!尤其再支付场景...

JinXYan的博客 2083

PyTorch实战:手把手教你用QAT量化感知训练拯救模型精度(附避坑指南)

本文详细介绍了如何使用PyTorch进行QAT量化感知训练,以提升模型在边缘设备上的推理精度。通过核心原理讲解、实战代码示例和避坑指南,帮助开发者掌握从环境配置、模型训练到边缘部署的全流程,有效解决传统量化方法导致的精度损失问题。

c7d8e的博客 325

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

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

xmt1139057136的专栏 1443

XILINX RFSoC全面解析(五)—— Zynq UItrascale+ RF Data Converter IP核详解

这期我们来看看RFSoC独有的IP核——Zynq UItrascale+ RF Data Converter如何使用。 我使用的VIVADO版本是2018.3,这个是最低版本,要开发RFSoC,VIVADO版本必须不低于2018.3。 另外电脑配置也需要很高,64位,8核@3.4GHz CPU,16GB内存,固态硬盘基本就是低配,跑起来很勉强。建议有条件的朋友使用工作站或者服务器。 首先在VIVADO中新建一个工程,因为我使用的是xilinx官方的开发板,所以可以直接设定选board就行。 在I

1万+

CANoe.DiVa的应用——生成测试用例过程流程详解(一)

Diva 生成用例过程

LOVE135149的博客 7925

【分布式】: 幂等性和实现方式

在HTTP/1.1中,对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外),即第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。这里的副作用是不会对结果产生破坏或者产生不可预料的结果。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。

寓教于乐。教己助人 1606

【推荐100个unity插件之2】 DoTween动画插件的安装和使用整合(最全)

摘要:DOTween动画插件使用指南 DOTween是Unity中强大的动画插件,比原生动画更便捷。安装后需进行初始化设置,通过工具菜单生成程序集。主要提供通用方法(DOTween.To)和便捷方法(如transform.DOMove)两种动画实现方式。插件支持丰富的动画设置(循环、缓动等)和事件回调(OnComplete、OnKill)。还提供动画管理功能,包括清除(DOTween.Clear)、完成(DOTween.CompleteAll)和终止(DOTween.KillAll)动画。常用功能涵盖移动、

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

java接口幂等性设计

幂等性 用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。 举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条。在以前的单应用系统中,我们只需要把数据操作放入事务中即可,发生错误立即回滚,但是再响应客户端的时候也有可能出现网络中断或者异常等等。 发生幂等性问题的原因: 网络问题/用户误操作/恶意操作,用户点击多

架构路上的博客 908

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java面试篇:SpringCloud常见组件,服务注册发现,负载均衡实现,服务雪崩,服务降级,服务熔断,服务监控,服务限流,CAP和BASE理论,分布式事物,接口幂等性设计,分布式任务调度

可以自己创建类实现IRule接口,然后再通过配置类或者配置文件配置即可,通过定义IRule实现可以修改负载均衡规则.服务雪崩:—个服务失败,导致整条链路的服务都失败的情形。

jungleirim的博客 1813

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

什么是接口幂等?

更新失败的博客 5278

SpringBoot接口幂等性实现的4种方案!

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》

2301_79600088的博客 427

Spring Boot中幂等性的应用

Spring Boot 中的幂等性实现,是确保接口安全性和数据一致性的关键。数据库唯一约束:简单场景,直接使用。Redis 分布式锁:高并发场景,提升性能。幂等字段校验:需要记录唯一请求的场景。幂等性设计不仅是接口安全的保障,更是系统稳定性的核心体现。

print_helloword的博客 709

分布式服务接口的幂等性如何设计(比如不能重复扣款)?

分布式服务接口的幂等性如何设计(比如不能重复扣款)?

weixin_55682785的博客 951

SpringBoot接口防抖(防重复提交),接口幂等性,轻松搞定

接口幂等性是指在分布式系统中,对于相同的请求,无论请求多少次,都应该返回相同的结果。这意味着,如果请求已经处理完毕,那么重复请求应该返回相同的响应,而不应该产生额外的副作用。这种特性对于确保系统的稳定性和一致性非常重要,尤其是在处理并发请求和网络异常的情况下。在编程中,可以通过一些特定的设计来实现接口幂等性,例如使用全局唯一的ID来标记请求,或者使用乐观锁机制来防止重复处理等。

2509_93882308的博客 1007

深入理解Java幂等性

深入理解Java幂等性 1. 概念理解 幂等:是一个数学概念,表示N次变换和1次变换的结果相同。 幂等操作:其特点是任意多次执行所产生的影响均与一次执行的影响相同(不会改变资源状态,对数据没有副作用)。 幂等性:一系列操作都是幂等操作。 幂等接口:幂等接口认为,外部调用者会存在多次调用的场景,为了防止重试对数据状态的改变,需要将接口的设计为幂等的 HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。说白了就是,同一个请求,发送一次和发送N次效果是一样的!幂等性是分布式系统设计中十

gb4215287的博客 3874

架构师学习第17周-分布式接口幂等性,分布式限流

架构师学习第17周-分布式接口幂等性,分布式限流接口设计与重试机制引发的问题接口幂等性什么情况下需要幂等性Update操作的幂等性 接口设计与重试机制引发的问题 提交订单按钮如何防止重复提交? 表单录入页如何防止重复提交? 接口幂等性 什么情况下需要幂等性 重复提交、接口重试、前端操作抖动等。 业务场景:用户多次点击提交订单,后台应只生成一个订单。 业务场景:支付时,由于网络问题重发,应该只扣一次钱。 并不是所有的接口都要求幂等性,要根据业务而定。 幂等性的核心思想:通过唯一的业务单号保证幂等。

weixin_46089779的博客 258

如何避免重复提交?分布式服务的幂等性设计!

来源:https://www.cnblogs.com/QG-whz/p/10372458.html 作者:melonstreet 为什么需要保证幂等性 编程中的“幂等性”是指任意多次执行所产生的影响,与一次执行的影响相同。一个拥有幂等性设计的接口,保证无论一次或多次来调用接口,都能够得到相同的结果。接口的幂等性设计在某些场景下是必需的,例如用户下单的场景。 我们知道,服务之间的调用存在三种状态:成功、失败、超时。超时是一种未知的状态:被调服务是否执行成功,这个状态是未知的。上游服务调用下游服务超时.

tyrroo的博客 402

如果保证接口的幂等性

对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的

weixin_44434274的博客 148

接口幂等性

一次和多次请求某一个资源对于资源本身应该具有同样的结果

zetor的专栏 650

不要重复它!幂等性的设计

原文:不要重复它!幂等性的设计 面向对象编程中有个重要的原则:Don’t repeat yourself!(不要重复你自己,简称DRY),指系统中的每一部分都必须有一个单一的、明确的、权威的代表,劝导程序员不要写重复代码,做重复设计。由此引申出来一个概念:Don’t repeat it!(不要重复它)也非常有趣,指面向用户提供的公共方法或者接口服务不会对同一件事情重复去做。如果以前已经计算过这个结果,那么直接返回它,如果以前已经执行了这个事务,那么直接跳过这个事务。也就是说,软件设计要支持幂等性。 幂等是一

u011453312的专栏 422
上一篇: 百度AI模型“文心一言”新鲜体验
下一篇: 分布式限流算法及实现介绍
solihawk
博客等级 码龄17年 7995粉丝 184原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值