再次提醒我一次“幂等性”

Posted 丶何苦丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再次提醒我一次“幂等性”相关的知识,希望对你有一定的参考价值。

什么是幂等性

  • 提供的接口承诺幂等性 含义:

    • 只要调用接口成功,外部对接口的多次调用得到的结果是相同的。即执行多次和一次的效果是一样的。

为什么需要幂等

  1. 用户在APP上连续点击了多次提交订单,后台应该只产生一个订单;(下多个相同的单,我有病啊)

  2. 向支付宝发起支付请求,由于网络问题或系统BUG重发,支付宝应该只扣一次钱。(多付N笔钱,我真有钱啊) 很显然,幂等接口认为,外部调用者会存在多次调用的场景,为了防止重试对数据状态的改变,需要将接口的设计为幂等的。

什么情况下需要保证幂等性

以SQL为例,有下面三种场景,只有第三种场景需要开发人员使用其他策略保证幂等性

  1. SELECT col1 FROM tab1 WHERE col2=2,无论执行多少次都不会改变状态,是天然的幂等。

  2. UPDATE tab1 SET col1=1 WHERE col2=2,无论执行成功多少次状态都是一致的,因此也是幂等操作。

  3. UPDATE tab1 SET col1=col1+1 WHERE col2=2,每次执行的结果都会发生变化,这种不是幂等的。


保证幂等策略

例: 不考虑并发的情况下,实现幂等很简单

  1. 先查询一下订单是否已经支付过,

  2. 如果已经支付过,则返回支付成功;如果没有支付,进行支付流程,修改订单状态为‘已支付’。

防重复提交策略

并发下保证幂等方案分两步

  • 第2步依赖第1步的查询结果,无法保证原子性的。

  • 在高并发下就会出现下面的情况:

    • 第二次请求在第一次请求第2步订单状态还没有修改为‘已支付状态’的情况下到来。既然得出了这个结论,余下的问题也就变得简单:把查询和变更状态操作加锁,将并行操作改为串行操作。


以上是关于再次提醒我一次“幂等性”的主要内容,如果未能解决你的问题,请参考以下文章

接口幂等性

接口幂等性

幂等性学习及接口的幂等性

RabbitMQ---幂等性,优先级队列,惰性队列

RabbitMQ消息幂等性问题

接口服务中的幂等性设计和防重保证,详细分析幂等性设计几种实现方法