为什么说接口幂等性很重要

先讲个故事

大概三年前,外卖平台 Uber Eats 在印度发生了一次重大事故,使得用户可以免费获得食品。

一天早上,有人试图通过印度的 Uber Eats 订购食物,并使用印度的支付平台 Paytm 付款。但是,他的账户里面没有足够的余额,没有下单成功。但是,这个人不死心,继续订购,这一次居然成功了!让他在没有付款的情况下,可以订购食物。消息传开以后,人们疯狂地下单。Uber Eats 短时间涌入大量订单,餐馆无法接单,不得不下线。平台发现了以后,立刻停止使用 Paytm 作为付款方式。调查发现,这个事故与 Paytm 团队前一天上线的一个看似无害的代码变更有关。他们把付款失败的 API 从幂等改为非幂等。

事后,餐馆得到了报酬,滥用这个 bug 的用户也没被追究,免费享用了食物

什么是幂等

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变,表达式f(x) =f(f(x)) . 例如绝对值abs(x)=abs(abs(x))

在计算机可相互中,幂等表示一次或者多次请求某个资源时,具有相同的结果。即多次相同请求锁产生的影响和第一次请求执行的影响相同,幂等性是系统对外一种承诺

举个例子如果你重复请求同一个 API,每次都得到相同的响应。如下

  1. "尝试在没有资金的情况下向 X 钱包充值"-> 返回 Error1

  1. "尝试再次在没有资金的情况下向 X 钱包充值"-> 返回 Error1

上面的故事中两次相同的请求变成了非幂等

  1. "尝试在没有资金的情况下向 X 钱包充值"-> 返回 Error1

  1. "尝试再次在没有资金的情况下向 X 钱包充值"-> 返回 Error2

故事里Uber Eats 的代码有问题。他们假设这个 API 是幂等的,并没有做正常的返回结果处理, 只比较了再次请求失败返回的结果,跟上一次失败的结果是否相同。如果不相同,就认为第二次支付成功了。正是因为这样的处理,当 Paytm 团队将付款失败API从幂等修改为非幂等时。第二次付费失败被当做了付款成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

=PNZ=BeijingL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值