幂等性

一,幂等性概念

  幂等性:一次或多次请求同一个资源,资源本身应该有相同的影响(网络超时,宕机等除外),

      或者说,任意多次请求某一资源对资源本身的影响,与一次执行的产生的影响是一样的。

      (这里有个隐含前提是,“一次或多次请求”指的是同一事件,而不是互为独立事件

二,幂等性是指一次或多次请求资源,对资源的影响是相同的。

    比如,第一次查询结果是三条数据,随后新增了两条,第二次查询结果是5条数据。查询结果不同,但查询请求本身对资源没有任何影响。这是幂等的!

       比如,第一次更新一条数据,版本号 version = 5,第二次,更新这条数据,版本号 version = 5。之后的任意次更新数据,他的version = 5;则是幂等的。

       第一次更新一条数据,版本号 version = version + 1 = 5,第二次,更新这条数据,版本号 version = version + 1 = 6。此后每次结果都 + 1。

      (这里的多次操作都是同一事件,不是独立事件)

          举个列子:淘宝买鞋,生成一个订单号,支付时,扣除买家账户500。由于某种原因,支付按钮出现重复提交现象。重复提交发出多次扣款请求,

          这个时候,多次请求的结果与一次请求是同一事件,只需要对买家账户进行一次扣款,而不是重复提交的每次请求都扣掉买家500。

          如果买家再次加购同一款鞋,生成的另一订单号,这个时候的扣款则是另外一次事件。与上一个订单是互为独立事件。 

  需要注意的是网络超时、服务宕机等问题,不在幂等的范围。               

  幂等性 是系统服务对外的一种承诺,并不是一种实现。接口提供方承诺,对于同一事件,一次调用与多次调用的影响一致。

  声明为幂等的服务,调用失败是一种常态,属于正常业务,并且允许重试。

三,适用“幂等”的场景

  开发过程中,经常遇到重复提交的问题。造成重复提交的原因有很多,比如,由于网络不稳定,获取不到提交结果,再次提交。或者前端按钮点击过快造成重复提交。

  一般像银行的 业务,或者电商支付这些涉及到金钱交易的,都需要考虑到幂等。负责一个流水号扣了n次钱,会造成严重的生产事故。

  以SQL为例,

    1,查询    SELECT * FROM ORDER WHERE id = 'a2fe2a235afer456g453wg2';

        无论执行多少次,查询请求都不会去对数据库有任何影响。是天然幂等的!

    2,根据唯一标识更新:update order  set ifPayFlag = 1 where id = ‘a2fe2a235afer456g453wg2’

      无论执行多少次,ifPayFlag 都是1,符合幂等要求。

    3,Update StructData set version = version+1 where id = 2

      每次更新,version 都会自增1。不符合幂等要求。Update StructData set version = version+1 where id = 2 and version = 1;

      

posted @ 2020-08-10 10:22  404UnknownCoder  阅读(98)  评论(0)    收藏  举报