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

面试官心理分析

从这个问题开始,面试官就已经进入了实际的生产问题的面试了。

一个分布式系统中的某个接口,该如何保证幂等性?这个事儿其实是你做分布式系统的时候必须要考虑的一个生产环境的技术问题。啥意思呢?

你看,假如你有个服务提供一些接口供外部调用,这个服务部署在了 5 台机器上,接着有个接口就是付款接口。然后人家用户在前端上操作的时候,不知道为啥,总之就是一个订单不小心发起了两次支付请求,然后这俩请求分散在了这个服务部署的不同的机器上,好了,结果一个订单扣款扣两次。

或者是订单系统调用支付系统进行支付,结果不小心因为网络超时了,然后订单系统走了前面我们看到的那个重试机制,咔嚓给你重试了一把,好,支付系统收到一个支付请求两次,而且因为负载均衡算法落在了不同的机器上,尴尬了。。。

所以你肯定得知道这事儿,否则你做出来的分布式系统恐怕容易埋坑。

面试题剖析

这个不是技术问题,这个没有通用的一个方法,这个应该结合业务来保证幂等性。

所谓幂等性,就是说一个接口,多次发起同一个请求,你这个接口得保证结果是准确的,比如不能多扣款、不能多插入一条数据、不能将统计值多加了 1。这就是幂等性。

其实保证幂等性主要是三点:

  • 对于每个请求必须有一个唯一的标识,举个栗子:订单支付请求,肯定得包含订单 id,一个订单 id 最多支付一次,对吧。
  • 每次处理完请求之后,必须有一个记录标识这个请求处理过了。常见的方案是在 mysql 中记录个状态啥的,比如支付之前记录一条这个订单的支付流水。
  • 每次接收请求需要进行判断,判断之前是否处理过。比如说,如果有一个订单已经支付了,就已经有了一条支付流水,那么如果重复发送这个请求,则此时先插入支付流水,orderId 已经存在了,唯一键约束生效,报错插入不进去的。然后你就不用再扣款了。

实际运作过程中,你要结合自己的业务来,比如说利用 redis,用 orderId 作为唯一键。只有成功插入这个支付流水,才可以执行实际的支付扣款。

要求是支付一个订单,必须插入一条支付流水,order_id 建一个唯一键 unique key。你在支付一个订单之前,先插入一条支付流水,order_id 就已经进去了。你就可以写一个标识到 redis 里面去,set order_id payed,下一次重复请求过来了,先查 redis 的 order_id 对应的 value,如果是 payed 就说明已经支付过了,你就别重复支付了。

原文地址:https://www.cnblogs.com/lingboweifu/p/11897360.html

时间: 2024-08-01 09:44:27

分布式服务接口的幂等性如何设计的相关文章

7.分布式服务接口请求的顺序性如何保证?

作者:中华石杉 面试题 分布式服务接口请求的顺序性如何保证? 面试官心理分析 其实分布式系统接口的调用顺序,也是个问题,一般来说是不用保证顺序的.但是有时候可能确实是需要严格的顺序保证.给大家举个例子,你服务 A 调用服务 B,先插入再删除.好,结果俩请求过去了,落在不同机器上,可能插入请求因为某些原因执行慢了一些,导致删除请求先执行了,此时因为没数据所以啥效果也没有:结果这个时候插入请求过来了,好,数据插入进去了,那就尴尬了. 本来应该是 “先插入 -> 再删除”,这条数据应该没了,结果现在

fastdfs分布式文件系统之与dubbo整合实现分布式服务接口

fastdfs是开源的轻量级分布式文件系统,它提供了java版本的client api.通过client API可以实现对文件的上传.追加.下载.删除等功能. 为了避免每个应用都配置fasdtfs参数.读取配置文件.调用client api获取trackerServer和StorageServer进行上传.下载.删除等操作及返回结果的 处理.所以采用与dubbo整合,提供分布式服务接口,来简化其它服务和应用的文件操作处理,同时提高代码的复用性. 1.总体结构 如图,总共分为fastdfs-api

《分布式服务架构:原理、设计于实战》总结

第一章: 互联网企业对传统技术进行发展和演化,形成一套具有互联网特色的互联网技术,互联网技术以拆分为原则来满足服务于海量 用户的需求,从架构上来讲,分布式.服务化( SOA ). 微服务得到了深入发展,以拆分和服务化为基础,将海量用户产 生的大规模的访问流量进行分 解,采用分而治之的方法,达成用户需要的功 能指标,并同时满足用户对高可用性.高性能. 可伸缩.可扩展和安全性的非功能质量的要求. 这断话摘自书中的一段内容: 原文地址:https://www.cnblogs.com/gxyandwmm

WCF分布式开发步步为赢(6):WCF服务契约继承与分解设计

上一节我们学习了WCF分布式开发步步为赢(5)服务契约与操作重载部分.今天我们来继续学习WCF服务契约继承和服务分解设计相关的知识点.WCF服务契约继承有何优势和缺点?实际项目里契约设计有什么原则和依据?面向对象的设计经验有何值得借鉴的地方?这里我们会一一给出详细的介绍.本文首先介绍的是WCF服务中契约继承的一些概念.例子代码分析,其次来讲解服务契约的设计问题.首先介绍的也是进行服务设计的必要性,服务设计的原则,示例代码分析.最后是全文的总结部分.结构如下:[1]OO面向对象设计原则,[2]服务

分布式服务的幂等性设计

目录 为什么需要保证幂等性 唯一ID UUID Snowflake 共享存储 避免不必要的查询 为什么需要保证幂等性 编程中的"幂等性"是指任意多次执行所产生的影响,与一次执行的影响相同.一个拥有幂等性设计的接口,保证无论一次或多次来调用接口,都能够得到相同的结果.接口的幂等性设计在某些场景下是必需的,例如用户下单的场景. 我们知道,服务之间的调用存在三种状态:成功.失败.超时.超时是一种未知的状态:被调服务是否执行成功,这个状态是未知的.上游服务调用下游服务超时时可能会进行重试.对于

微服务架构之幂等性问题及设计思想,你不得不知的一些幂等方案

前言 小伙伴们有没有遇到过生产环境经常出现过重复的数据?在排查问题的时候,数据又是正常的.这个是何解呢?怎么会出现这种情况,而且还很难排查问题.今天我给大家分享一下这里的原因,以及解决方案. 大家觉得还不错的可以关注我的主页[点击进入],每天都会更新一下技术干货.电子书.架构资料等免费领取! 罪魁祸首 产生重复数据或数据不一致(假定程序业务代码没问题),绝大部分就是发生了重复的请求,重复请求是指同一个请求因为某些原因被多次提交.导致这个情况会有几种场景: 1)微服务场景,在我们传统应用架构中调用

Dubbo服务接口的设计原则

1.接口粒度 1.1 服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo暂未提供分布式事务支持.同时可以减少系统间的网络交互. 1.2 服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸. 1.3 不建议使用过于抽象的通用接口,接口名称的定义应遵循望文生义原则,如:Map query(Map),这样的接口没有明确语义,会给后期维护带来不便. 2.接口版本 2.1 每个接口都应定义版本号,为后续不兼容升级提供可能,如:

RSF 分布式服务框架设计

是时候设计一个分布式服务框架了.我先将它定名为 Hasor-RSF,"RSF"为 Remote Service Framework 的缩写. RSF的目的是为了提供一种高效的远程服务访问方式,例如"A机器访问在B机器上的一个服务".当然首先它是运行在Java上的,但是我并不希望 Java 成为 RSF的唯一平台. 它应该是分布式的,就是说服务 A 可能会分布在若干台机器内. 当我的应用打算调用这个服务时我应该可以在这若干服务提供的机器上随机调用.这样做的好处是有助于

[分布式服务]海量互联网服务设计之降级设计

目录 降级一致性 缓存的使用 流程异步化 行为聚集化 体验降级 简化流程 分级体验 降级服务要点 上周在 [分布式服务]海量互联网服务设计的有损价值观 这篇文章中提到,与金融行业服务要求的强一致性不同,海量互联网服务要求的是能够扛住更高的qps,服务降级研究的问题是在服务器资源有限的情况下,如何提供更大的访问量,并保证系统稳定运行. 最近我搬了个房子,房东还没来得及上面装宽带,所以在家里我是用手机热点上网的.热点网速有限,看视频的时候,为了视频流程的播放,我将视频从蓝光调整到270P,虽然视频清