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

这篇具有很好参考价值的文章主要介绍了分布式接口幂等性设计实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

面对分布式架构和微服务复杂的系统架构和网络超时服务器异常等带来的系统稳定性问题,分布式接口的幂等性设计显得尤为重要。本文简要介绍了几种分布式接口幂等性设计实现,包括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机制能够实现并发更新下的幂等性,也可以通过数据库悲观锁机制在业务操作前获取锁资源实现唯一性操作。总而言之,分布式接口的幂等性是在牺牲一定的并发和性能的前提下,以实现系统的稳定性和容错性。


参考资料:文章来源地址https://www.toymoban.com/news/detail-450597.html

  1. https://blog.csdn.net/tengxvincent/article/details/81773745
  2. https://www.cnblogs.com/jajian/p/10926681.html
  3. https://blog.csdn.net/qq_41863849/article/details/123973348
  4. https://zhuanlan.zhihu.com/p/70748661

到了这里,关于分布式接口幂等性设计实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot 定时任务,分布式下幂等性如何解决

    在分布式环境下,定时任务的幂等性问题需要考虑多个节点之间的数据一致性和事务处理。 一种解决方法是使用分布式锁来保证同一时间只有一个节点能够执行该任务。具体实现可以使用Redis或Zookeeper等分布式协调工具提供的分布式锁功能。 另一种解决方法是使用消息队列来

    2024年02月11日
    浏览(31)
  • 【Spring Cloud系列】- 分布式系统中实现幂等性的几种方式

    在开发订单系统时,我们常遇见支付问题,既用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条。在以前的单应用系统中,

    2024年02月10日
    浏览(43)
  • 开源:Taurus.Idempotent 分布式幂等性锁框架,支持 .Net 和 .Net Core 双系列版本

    分布式幂等性框架的作用是确保在分布式系统中的操作具有幂等性,即无论操作被重复执行多少次,最终的结果都是一致的。幂等性是指对同一操作的多次执行所产生的效果与仅执行一次的效果相同。 以下是分布式幂等性框架的主要作用: 避免重复操作: 在分布式系统中,

    2024年03月09日
    浏览(37)
  • 「并发编程实战」接口幂等性设计的最佳实现(8种实现方案)

    文章参考: 实战!聊聊幂等设计 基于幂等表思想的幂等实践 追忆四年前:一段关于我被外企CTO用登录注册吊打的不堪往事 弹力设计篇之“幂等性设计” 幂等是一个数学与计算机科学概念。 在数学中,幂等用函数表达式就是: f(x) = f(f(x)) 。比如求绝对值的函数,就是幂等的

    2024年01月22日
    浏览(41)
  • 云事业群CTO线技术晋升考核机试题-分布式专题-G 分布式幂等架构设计

    作者:田超凡 1 幂等的基本概念 答:幂等指的是同一块业务逻辑重复多次执行时,只能令其生效一次,防止重复执行。 2 幂等的发生场景 答: RPC 调用接口的幂等性问题 MQ 消费者防止重复消费的幂等性问题 定时任务防止重复执行的幂等性问题 3 RPC调用接口的幂等性问题产生

    2024年02月16日
    浏览(38)
  • 一文搞定接口幂等性架构设计方案

    现如今很多系统都会基于分布式或微服务思想完成对系统的架构设计。那么在这一个系统中,就会存在若干个微服务,而且服务间也会产生相互通信调用。那么既然产生了服务调用,就必然会存在服务调用延迟或失败的问题。当出现这种问题,服务端会进行重试等操作或客户

    2023年04月20日
    浏览(35)
  • 腾讯二面:如何保证接口幂等性?高并发下的接口幂等性如何实现?

    什么是接口幂等性 接口幂等性这一概念源于数学,原意是指一个操作如果连续执行多次所产生的结果与仅执行一次的效果相同,那么我们就称这个操作是幂等的。在互联网领域,特别是在Web服务、API设计和分布式系统中,接口幂等性具有非常重要的意义。 具体到HTTP接口或者

    2024年03月19日
    浏览(43)
  • 一个注解实现接口幂等性,真心优雅!

    简单来说,就是对一个接口执行重复的多次请求,与一次请求所产生的结果是相同的,听起来非常容易理解,但要真正的在系统中要始终保持这个目标,是需要很严谨的设计的,在实际的生产环境下,我们应该保证任何接口都是幂等的,而如何正确的实现幂等,就是本文要讨

    2024年02月03日
    浏览(41)
  • Spring Boot 实现接口幂等性的 4 种方案

    现在的系统或平台,为了追求体验性、内容丰富性,都是前后端分离,系统为了解藕会引入各种MQ等,都不可避免就引入了数据幂等性的问题。 幂等是一个数学与计算机学概念,在数学中某一运算为幂等时,其作用在任一元素两次会和其作用一次的结果相同。 在计算机编程中

    2024年02月06日
    浏览(51)
  • 幂等性设计与实现

    幂等性(Idempotence) 是一个在计算机科学中使用的术语。当某个操作无论进行一次或多次都产生相同的结果,我们就说这个操作是幂等的。 例如,删除文件的操作就是幂等的,因为无论你尝试删除一次还是两次,结果都是文件被删除。相对地,计数器增加操作就不是幂等的,

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包