美文网首页
编程思想之幂等性

编程思想之幂等性

作者: 苏康申 | 来源:发表于2019-03-26 21:25 被阅读0次

    前言

    今天面试被问到幂等性如何实现,答的稀里糊涂,回来冷静的思考一下

    什么是幂等性

    既然幂等性源于数学,那我就使用数学公式来表示,即可一目了然!

    f(f(x)) = f(x)
    

    显然,从上面的二元函数可以看出,无论x(等幂元素)被函数y无限地执行运算,它的结果都是相同的。在计算机编程领域中,我们可以这么定义幂等性:在调用某个方法、接口中,我们使用相同的参数(相同的特定参数),其返回值都是相同的,我们便可称方法、接口具有幂等性。从信仰上说,幂等性是一种承诺,只要一次答应某个承诺,其承诺内容都是不会改变的。

    幂等性场景

    思路一:TOKEN机制

    假如目前我向一个基金账户进行赎回账户金额操作,突然APP由于网络原因或者APP闪退导致赎回失败,假如我再次发起赎回可能会出现赎回两次的操作,这时问题就来了
    原本的方法是这样设计的

    function add($userToken, $orderMessage){
      //todo
    }
    
    function add($seq,$userToken, $orderMessage){
      // 现根据seq来判断是否已经处理过了,是的话就返回第一次处理的结果
      $resultJson = $this->redis->get('***_pre_' . $seq);
      if(false != $resultJson){
        return $resultJson;
      }
      // 既然没有处理过,那就正式处理
      // todo 
      // 处理完了,没有问题那就将结果保存起来
      // todo
      return $resultJson;
    }
    
    两个步骤:

    后端生产票据 | 坐火车首先买票,买完后才能上车
    根据上一步拿到合法的票据来提现

    function createTicketSequence($user) : string{
      // todo 
    }
    
    function withdraw($ticketSequence,$user,$amount){
      // todo
    }
    

    场景理解
    1、用户在取款的时候,客户端先带上token请求服务端生成一个合法的取款凭证ticketSequeuence
    2、用户在输入取款金额并确认取款后,客户端将会带上用户登录凭证userToken、取款票据ticketSequence以及取款金额amount进行请求
    3、服务端接收到请求后,先校验userToken,校验失败则返回重新登录,否则换取user对象
    4、用户鉴权通过后,那么再来校验取款票据ticketSequence,票据不合法,那么取款失败,否则继续进行取款,一直到取款成功并根据票据作为幂等值来保存提现成功的结果
    5、即使客户端请求后与服务端失去了联系,并且服务端处理成功,客户端处于假死的状态并再次请求取款,也是返回第一次的结果,并且是迅速的响应。

    思路二:唯一索引

    比如:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,怎么防止给用户创建资金账户多个,那么给资金账户表中的用户ID加唯一索引,所以一个用户新增成功一个资金账户记录。

    要点:唯一索引或唯一组合索引来防止新增数据存在脏数据 (当表存在唯一索引,并发时新增报错时,再查询一次就可以了,数据应该已经存在了,返回结果即可)。

    相关文章

      网友评论

          本文标题:编程思想之幂等性

          本文链接:https://www.haomeiwen.com/subject/rztovqtx.html