美文网首页
幂等性实现方案

幂等性实现方案

作者: 守住阳光 | 来源:发表于2018-11-28 19:50 被阅读0次

一、什么是幂等性

        所谓幂等性,简单地说,就是对接口的多次调用所产生的结果和调用一次是一致的。扩展一下,这里的接口,可以理解为对外发布的HTTP接口或者Thrift接口,也可以是接收消息的内部接口,甚至是一个内部方法或操作。

二、应用场景

支付业务

        如上图所示用户下单后点击支付按钮进行支付。支付系统根据单号创建支付记录,然后调用银行接口,当一行扣款成功后,支付表修改支付状态为已支付。

        但是,存在这样的情况,用户点击按钮无效,连续点击多次,是否会出现同一个订单支付多次?如何避免?这就是今天要讲的的幂等性。

        作为对比,先看没有实现幂等性,也就是用户连续点击按钮,多次调用银行接口的情况。代码如下:

public void  payForOrder(String orderId){

        Order order = orderDao.findById(orderId);

        Payment payment = paymentDao.findPaymentByOrderId(orderId);

        payment.setOrderId(orderId);

        payment.setMoney(order.getMoney());

        payment.setPayStatus("0");//正在处理中

        paymentDao.update(payment);

        String flag = tranService.invoke(url,paymentId); //调用银行接口

        payment.setPayStatus(flag);

        paymentDao.update(payment);

}

        有上面代码可知,当用户对一个单多次点击支付时,上面的代码一定会出现多次调用银行接口的情况。那么问题来了,如何保证幂等性?

介绍一个使用乐观锁实现幂等性的方案。通过新增版本号字段来实现。先看代码:

public payForOrder(String orderId){

        Order order = orderDao.findById(orderId);

        Payment payment = paymentDao.findPaymentByOrderId(orderId);

        boolean invokeInterface = false ;

        payment.setOrderId(orderId);

        payment.setMoney(order.getMoney());

        payment.setPayStatus("0");//正在处理中

        payment.setVersion(0);

        int records = paymentDao.updateByVersion(payment);

        if(records ){

                String flag = tranService.invoke(url,payment.getId()); //调用银行接口

                payment.setPayStatus(flag);   

                paymentDao.update(payment);

        }else{

                logger.error("重复调用............+orderId="+orderId);

        }

}

updateByVersion的模拟代码为:

update  t_payment  set  orderId = #{orderId} , money=#{money},  payStatus=#{payStatus}  version=#{ version } +1 

where id=#{id} and version=#{version}

        用户第一次点击时  paymentDao.updateByVersion(payment) 的返回值为1 ,此时可以调用银行接口;当第二次点击时updateByVersion的返回值为 0 ,不会调用银行接口,实现了幂等性。

相关文章

  • 幂等性实现方案

    一、什么是幂等性 所谓幂等性,简单地说,就是对接口的多次调用所产生的结果和调用一次是一致的。扩展一下,这里的接口...

  • 幂等性实现方案

    幂等性实现方案 字面理解 幂 名词:盖东西的巾大巾谓之幂。——《小尔雅·广诂》 动词:覆盖,遮盖祭祀,以疏布巾幂八...

  • 接口幂等性

    接口幂等性 什么是接口幂等性? 最简单想到的实现接口幂等性(重复提交)的操作是什么? 最简单稍靠谱的解决方案是什么?

  • SpringCloud 幂等性分布式解决方案

    幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数 研究了很久的幂等性解决方案。终于实现了...

  • SpringBoot接口幂等性实现的4种方案!

    目录 什么是幂等性 什么是接口幂等性 为什么需要实现幂等性 引入幂等性后对系统的影响 Restful API 接口...

  • Springboot后端接口幂等性实现方案

    一、什么是幂等性 本文一至五部分是关于幂等性的概念介绍,实现方案在第六部分,基于防重Token令牌方案代码在第七部...

  • 什么是接口的幂等性,如何实现接口幂等性?一文搞定

    每天一个知识点 什么是接口的幂等性,如何实现接口幂等性? (一)幂等性概念 幂等性原本是数学上的概念,用在接口上就...

  • 幂等性

    理解 HTTP 幂等性(15')系统幂等以及常用实现方式(10')分布式系统互斥性与幂等性问题的分析与解决(30')

  • 编程思想之幂等性

    前言 今天面试被问到幂等性如何实现,答的稀里糊涂,回来冷静的思考一下 什么是幂等性 既然幂等性源于数学,那我就使用...

  • 写一个通用的幂等组件,我觉得很有必要

    本文目录 背景 简单幂等实现 2.1 数据库记录判断 2.2 并发问题解决 通用幂等实现 3.1 设计方案 3.1...

网友评论

      本文标题:幂等性实现方案

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