鹤岗吧:实现接口幂等性的几种方案

2020-03-31 23 views 0

扫一扫用手机浏览

「申慱手机<下载>版」

欢迎进入「申慱手机<下载>版」!Sunbet 【申博提供申博〖开户〗】(sunbet〖开户〗)、SunbetAPP<下载>、Sunbet客户端<下载>、Sunbet「代理合作等业务」。

,

抢微信红包的时候我们都知道:一个红包一旦你抢过之后,「以后无论你点多」少 次[都是一样的结果。【红包会提示你已经抢过此红包】, 而不会让你再抢一[ 次[。

「抢红包」接口就是一个非常典型的幂等接口,‘抢一 次[「<《‘‘和’’》>」抢多 次[具有一样的效果’。类似的接口在我们的开发过程<中>会有很多,“比如在电商的下单过程<中>”:

订单创建接口,第一 次[调用返回超时了,重试机制一般会再 次[调用这个接口,「此时我们不能因为这个接」口被调了两 次[就创建两个一样的订单;
〖库存扣减接口〗,支付接口也是类似的逻辑;

【今】天的文章就来讲讲什么是接口的幂等性,并介绍几种实现接口幂等性的方案。

什么是幂[等

幂等原先是数学<中>的一个概念, 表[〖示进行〗1《 次[变换「<《‘‘和’’》>」进行》N{ 次[变换产生的效果}相同。

当我们讨论接口的幂等性时一般是在说:以相同的请求调用这个接口一 次[「<《‘‘和’’》>」调用这个接口多 次[,‘对’系统产生的影响是相同的。如果一个接口满足这个特性,那么我们就说这个
接口是一个幂等接口[。比如上面的抢红包接口。

PS:「这边顺带说下幂等」「<《‘‘和’’》>」防止重复提交的区别。
【防止重复提交更多的是不让用户发起多 次[一样的请求】。比如说用户在线购物下单时点了提交订单按钮,〖但是由于网络原因响应很慢〗,此时用户比较心急多 次[点击了订单提交按钮。
‘这种情况下就’可能会造成多 次[下单。一般防止重复提交的方案有:‘将订单按钮置灰’,<跳转到结果页等>。【‘主要还是从客户端’的角度】{来解决这个}问题

幂等更多的是在重复请求已经发生[,“或是无法”避免的情况下,‘采取一定的技术’手段让这些重复请求不给系统带来副作用。

《什》么情况下需要幂等

{并不是所有接口都需}「要保证幂等性」。〖以相〗同的请求调用这个接口一 次[或多 次[,“需要给调用方返回一致的结果时”,就要考虑将这个接口设计成幂等接口。

实现幂等的几种方案

〖在我们设计幂等接口时重点关注新增接口〗「<《‘‘和’’》>」更新接口[。〖因为「查询」「<《‘‘和’’》>」删除操作天生是幂等的〗(根据id「查询」「<《‘‘和’’》>」根据id「删除多 次[对系统的影响是一致的」),《不需要我们提供额外的》
<技术手段来保证幂等性>。(??)

<对于新增「<《‘‘和’’》>」更新接口>,〖(大致有以下几种方案可以保证接)〗口幂等性。

【来源加序列号】

【 这是一种比较好理解[】,“通用”的方案。

当调用接口时[,参数<中>必须传入source〖字段〗「<《‘‘和’’》>」seq〖字段〗(<这边举了一个我们项目<中>的列子>,其实并不一定要传两个〖字段〗,【传一个唯一的序列】号uuid也能达到一样的效果)。〖服务〗“端接收到”请求,<先判断自己是否是一个幂等接>口,{如果不是幂等接口就正常处理请求}。

(如果是一个幂等接口),《就将》source「<《‘‘和’’》>」seq 组[成联合主键去数据库表<中>或者是Redis<<中>「查询」>,如果没有「查询」到,‘〖说明没处理过这〗个请求’,‘然后正常处理请求就行了’。处理完之后将处理结果「<《‘‘和’’》>」source「<《‘‘和’’》>」seq<信息一个存入数据库或>Redis<中>。

如果根据source「<《‘‘和’’》>」seq“能「查询」到”,(说明已经处)“理过这个请求了”,直接将处理的结果返回即可。

我们发现这种方案非常简单,{<而且易于理解>},“通用”。「但是如果请求量很大的话」,【存放请求记录的表会很大】,“<这个时候可以将一段时间之前的记录删除>”,《『以提升性能』》。

《唯一索引》(<唯一〖字段〗>)

(这种方案适合用于执行)新增操作的接口。

「比如」说新增用户接口。我们将用户表<中>的身份证〖字段〗加上《唯一索引》。“当同一个请求调用两 次[时”,『我们可以先根据身份证〖字段〗「查询」下用户是否存在』,“不存在的话再新”增。【存在的话就返回新增失败】。
或者直接新增也行,《数据库会抛异常》,我们对异常处理返回前台就行了。

PS:《“大家可能会有一个疑”》问,『我同一个请求调用两 次[』,《第一返回新增成功》,第二 次[返回失败,(返回的结果)不同啊。《这个接口》还是幂等接口么?
这边我要重申下概念,幂等强调的是接口一 次[调用「<《‘‘和’’》>」多 次[调用产生的效果是一样的。这边调用一 次[「<《‘‘和’’》>」调用多 次[都是新增了一个对象,「所以还是满」足幂等的。

乐观锁

这种方案适用于执行更新操作的接口。

【乐观锁只是在更新数据那一刻锁】表, 其他时间不锁表[,《所以相对于悲观锁》,『效率更高』。 {‘我们一般通过数据库来实现乐观锁’},比较“通用”的做法是增加一个时间戳〖字段〗。

update table_xxx set name=#name#, timestamp = now where id=#id# and timestamp=#timestamp# --这个值由前端到数据<<中>「查询」>出来,再传过来

参考

  • 分布式系统的接口幂等性设计[
  • {如何避免下重复订单}

公众号推荐

〖欢迎〗大家关注我的微信公众号,『我会』把好的博客同步更新到公众号上

Sunbet网站内容转载自互联网,如有侵权,联系Sunbet 删除。

本文链接地址:http://www.shfkgcjxyxgs.com/post/1271.html

相关文章

发表评论