保证接口幂等性的解决方案(后台)

假如有个服务提供一个接口(服务部署在多个服务机器),接着有个接口是付款接口。用户在前端上操作的时候,一个订单不小心发起了两次支付请求,然后这两个请求分散在了这个服务部署的不同的机器上,结果一个订单扣款扣两次。这样的场景,就是接口没有保证幂等性的结果。

保证幂等性的核心

1.对于每个请求必须有一个唯一的标识。

2.每次处理完请求之后,必须有一个记录标识这个请求处理过了。

3.每次接收请求需要进行判断之前是否处理过的逻辑处理。

常见解决方案

1.业务表内唯一索引

如果要对创建销售出库单的接口保证幂等性,也就是说人家网络超时,重复调用的时候,保证一个订单只能有一个对应的销售出库单。针对销售出库单的表的订单id,创建一个唯一索引,你如果接口被重试,同一个订单创建一个销售出库单的话,一定会违反唯一索引,那么此时会报错。

2.业务表内状态机

修改订单状态,比如说将订单状态修改为【待发货】的时候,订单的状态其实就变为了【待发货】。

update order set status = ‘待发货‘ where status = ‘待付款‘ and id = 1;

这时候如果id为1的订单接口被重复调用了,即使再执行一次这个操作也不会有效果,因为这时候该订单记录的状态字段已经改变了,SQL并不会命中该记录。

在这种业务场景中也是通常都会有逻辑判断的,比如当前是否处于某个状态,然后才能流转到下一个状态(状态为待付款的才能流转到待发货)。

3.基于版本号的更新

id name age version
1 yanggb 18 1

给业务表内添加一个版本号的字段,如果要调用一个接口去更新年龄之前,就需要先查一下他的版本号是多少,然后调用接口的时候带上版本号。

在接口里保证分布式接口的幂等性(在更新的SQL中添加version的条件判断):

update user set age = 21, version = version + 1 where id = 1 and version = 1;

这样,多次提交的请求,因为版本号(version)都一样,因为第一次请求执行成功之后version已经+1了,则后面的请求因为version对应不上,都不会被执行。

4.基于MySQL的去重表 / 基于Redis的去重

比如说接口方法为changeAge(1, 21, 1),可以将所有的参数拼接成一个字符串,或者是从这些入参里选择一些参数(可以唯一标识这一次请求的一些参数),每次请求进来,在操作之前先校验这个字符串,如果校验通过则继续执行操作,校验失败则跳过。

如果基于MySQL,可以单独搞一个表出来(可以就一个字段),在这个表上的一个字段建一个唯一索引,插入的记录值就是前面拼接的字符串。因为第一次请求到达的时候,这个字符串在表中还不存在对应的记录,则会往表中插入该记录,并继续执行业务逻辑。后面的请求再到达的时候,因为这个字符串在表中已经存在了对应的记录了,唯一索引就会报一个冲突出来,这次插入就会失败,后续的业务逻辑也就会跳过执行了。

如果接口调用量很大,并发很高,还可以选择使用Redis。同样是拼接一个字符串串出来,直接set设置到Redis里去,如果下一次请求再过来,会发现这个key已经存在了,那么这个时候就不能执行了,因为已经可以知道出现了重复调用的情况了。

幂等的缺点

幂等是为了简化客户端逻辑处理,但是却增加了服务提供者的逻辑和成本,是否有必要在系统中引入幂等,需要根据具体场景具体分析,因此除了业务上的特殊要求外,一般建议是尽量不提供幂等的接口。

1.增加了额外控制幂等的业务逻辑,复杂化了业务功能。

2.把并行执行的功能改为串行执行,降低了执行效率。

"人不能太深情的活着,也不能总是追缅过去。"

原文地址:https://www.cnblogs.com/yanggb/p/11713309.html

时间: 2024-12-13 11:30:57

保证接口幂等性的解决方案(后台)的相关文章

Springboot + redis + 注解 + 拦截器来实现接口幂等性校验

Springboot + redis + 注解 + 拦截器来实现接口幂等性校验 1. SpringBoot 整合篇 2. 手写一套迷你版HTTP服务器 3. 记住:永远不要在MySQL中使用UTF-8 4. Springboot启动原理解析 一.概念 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次比如: 订单接口, 不能多次创建订单 支付接口, 重复支付同一笔订单只能扣一次钱 支付宝回调接口, 可能会多次回调, 必须处理重复回调 普通表单提交接口, 因为网络超时

如何保证接口的幂等性。。。。。

在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景: 一个订单创建接口,第一次调用超时了,然后调用方重试了一次 在订单创建时,我们需要去扣减库存,这时接口发生了超时,调用方重试了一次 当这笔订单开始支付,在支付请求发出之后,在服务端发生了扣钱操作,接口响应超时了,调用方重试了一次 一个订单状态更新接口,调用方连续发送了两个消息,一个是已创建,一个是已付款.但是你先接收到已付款,然后又接收到了已创建 在支付完成订单之后,需要发送一条短信,当一台机器接收到短信发送的消息之后,处理较慢.消息中

(转)关于接口幂等性的总结

前言 元旦放假哪也没去一个人在家里闷得慌,突然间想写点东西打发打发时间,刚好想起前几天在公司听到一些同事在讨论线上数据库出现数据重复的问题,据说是因为接口与前端都没有做重复提交的约束导致的问题,因为我没有参与到相关业务的开发中,所以具体情况不了解,只是听他们在讨论过程中知道一点就是有可能是用户误操作导致接口出现并发问题,还猜测有可能是用户端通过程序脚本的方式来刷接口,虽说后端API使用了Https协议加密传输,但还是有被刷的可能性,也有同学表示说接口要加个同步锁来排重等等.初一听好像没有什么问题

分布式接口幂等性

https://www.cnblogs.com/huaixiaonian/p/9577567.html 最近跟朋友聊起这个话题,想深入了解下,于是学习总结,记录下来,此文章参考以下博客综合而来表示感谢: http://blog.brucefeng.info/post/api-idempotent http://825635381.iteye.com/blog/2276077 https://www.cnblogs.com/leechenxiang/p/6626629.html 1. 接口调用存在

micro-service(3):分布式事务和接口幂等性

分布式服务需要满足CAP原则,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),但三者不可得兼:一般都会优先保证可用性和分区容错性,并且保证最终一致性.BASE理论是对CAP原则的补充,Basically Available,Soft state,Eventually Consistent,也就是当CAP三者不能兼得的时候,可以做到最终一致性. 大型应用一般需要做业务分拆以便于提升业务的可维护性和扩展性,但由于业务分布于

API接口幂等性框架设计

表单重复提价问题 rpc远程调用时候 发生网络延迟  可能有重试机制 MQ消费者幂等(保证唯一)一样 解决方案: token 令牌 保证唯一的并且是临时的  过一段时间失效 分布式: redis+token 注意在getToken() 这种方法代码一定要上锁  保证只有一个线程执行  否则会造成token不唯一 步骤 调用接口之前生成对应的 token,存放在redis中 调用接口的时候,将该令牌放到请求头中 (获取请求头中的令牌) 接口获取对应的令牌,如果能够获取该令牌 (将当前令牌删除掉),

实现接口幂等性的几种方案

抢微信红包的时候我们都知道:一个红包一旦你抢过之后,以后无论你点多少次都是一样的结果.红包会提示你已经抢过此红包,而不会让你再抢一次. 抢红包接口就是一个非常典型的幂等接口,抢一次和抢多次具有一样的效果.类似的接口在我们的开发过程中会有很多,比如在电商的下单过程中: 订单创建接口,第一次调用返回超时了,重试机制一般会再次调用这个接口,此时我们不能因为这个接口被调了两次就创建两个一样的订单: 库存扣减接口,支付接口也是类似的逻辑: 今天的文章就来讲讲什么是接口的幂等性,并介绍几种实现接口幂等性的方

google支付接口被刷以及解决方案 google支付查单

google支付接口被刷以及解决方案 google支付回调验证 Google支付问题 20150218,挂机的日本服务器出现google支付被刷单现象,虽然目前进行的修补,但是这个问题并没有完全从根源上解决.并且公司以前的GooglePlay支付也有不完善的地方,在SDK端给支付回调发送支付信息后,支付回调程序没有调用Google API进行订单验证.因此Google支付流程需要进行完善. Google支付解决方案 上面的支付问题,Google有自己的解决方案,就是根据订单号去向Google A

高并发下接口幂等性解决方案

一.幂等性概念 在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数.这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变.例如,“getUsername()和setTrue()”函数就是一个幂等函数. 更复杂的操作幂等保证是利用唯一交易号(流水号)实现. 我的理解:幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的. 二.幂等性场景1.查询操作:查询一次和查询多次,在数