本文转自http://blog.csdn.net/jks456/article/details/71453053

在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景:

  1. 一个订单创建接口,第一次调用超时了,然后调用方重试了一次
  2. 在订单创建时,我们需要去扣减库存,这时接口发生了超时,调用方重试了一次
  3. 当这笔订单开始支付,在支付请求发出之后,在服务端发生了扣钱操作,接口响应超时了,调用方重试了一次
  4. 一个订单状态更新接口,调用方连续发送了两个消息,一个是已创建,一个是已付款。但是你先接收到已付款,然后又接收到了已创建
  5. 在支付完成订单之后,需要发送一条短信,当一台机器接收到短信发送的消息之后,处理较慢。消息中间件又把消息投递给另外一台机器处理

以上问题,就是在单体架构转成微服务架构之后,带来的问题。当然不是说单体架构下没有这些问题,在单体架构下同样要避免重复请求。但是出现的问题要比这少得多。

为了解决以上问题,就需要保证接口的幂等性,接口的幂等性实际上就是接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的。有些接口可以天然的实现幂等性,比如查询接口,对于查询来说,你查询一次和两次,对于系统来说,没有任何影响,查出的结果也是一样。

除了查询功能具有天然的幂等性之外,增加、更新、删除都要保证幂等性。那么如何来保证幂等性呢?

全局唯一ID

如果使用全局唯一ID,就是根据业务的操作和内容生成一个全局ID,在执行操作前先根据这个全局唯一ID是否存在,来判断这个操作是否已经执行。如果不存在则把全局ID,存储到存储系统中,比如数据库、redis等。如果存在则表示该方法已经执行。

从工程的角度来说,使用全局ID做幂等可以作为一个业务的基础的微服务存在,在很多的微服务中都会用到这样的服务,在每个微服务中都完成这样的功能,会存在工作量重复。另外打造一个高可靠的幂等服务还需要考虑很多问题,比如一台机器虽然把全局ID先写入了存储,但是在写入之后挂了,这就需要引入全局ID的超时机制。

使用全局唯一ID是一个通用方案,可以支持插入、更新、删除业务操作。但是这个方案看起来很美但是实现起来比较麻烦,下面的方案适用于特定的场景,但是实现起来比较简单。

去重表

这种方法适用于在业务中有唯一标的插入场景中,比如在以上的支付场景中,如果一个订单只会支付一次,所以订单ID可以作为唯一标识。这时,我们就可以建一张去重表,并且把唯一标识作为唯一索引,在我们实现时,把创建支付单据和写入去去重表,放在一个事务中,如果重复创建,数据库会抛出唯一约束异常,操作就会回滚。

插入或更新

这种方法插入并且有唯一索引的情况,比如我们要关联商品品类,其中商品的ID和品类的ID可以构成唯一索引,并且在数据表中也增加了唯一索引。这时就可以使用InsertOrUpdate操作。在mysql数据库中如下:

1
2
3
4
insert into goods_category (goods_id,category_id,create_time,update_time)
values(#{goodsId},#{categoryId},now(),now())
on DUPLICATE KEY UPDATE
update_time=now()

多版本控制

这种方法适合在更新的场景中,比如我们要更新商品的名字,这时我们就可以在更新的接口中增加一个版本号,来做幂等

1
boolean updateGoodsName(int id,String newName,int version);

在实现时可以如下

1
update goods set name=#{newName},version=#{version} where id=#{id} and version<${version}

状态机控制

这种方法适合在有状态机流转的情况下,比如就会订单的创建和付款,订单的付款肯定是在之前,这时我们可以通过在设计状态字段时,使用int类型,并且通过值类型的大小来做幂等,比如订单的创建为0,付款成功为100。付款失败为99

在做状态机更新时,我们就这可以这样控制

1
update `order` set status=#{status} where id=#{id} and status<#{status}

以上就是保证接口幂等性的一些方法。

转载于:https://www.cnblogs.com/panxuejun/p/8577391.html

后端接口的幂等性(转)相关推荐

  1. 如何保证接口的幂等性?

    什么是幂等性?所谓幂等,就是任意多次执行所产生的影响均与一次执行的影响相同. 为什么会产生接口幂等性问题 在计算机应用中,可能遇到网络抖动,临时故障,或者服务调用失败,尤其是分布式系统中,接口调用失败 ...

  2. 阿里面试官:接口的幂等性怎么设计?

    自己最近负责的几个接口,都涉及到了幂等性的操作,抽空总结了一下,这也是面试官比较爱问的问题. 一.什么是幂等? 看一下维基百科怎么说的: 幂等性:多次调用方法或者接口不会改变业务状态,可以保证重复调用 ...

  3. 幂等校验是什么意思_阿里面试官:接口的幂等性怎么设计?

    一.什么是幂等? 看一下维基百科怎么说的: 幂等性:多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致. 二.使用幂等的场景 1.前端重复提交 用户注册,用户创建商品等操 ...

  4. Java接口的幂等性

    投资理财的案例,用户可以充值.投资.提现,使用第三方支付进行充值,过程如下: step1:用户网站中输入充值金额 step2:后端创建充值订单入库,此时订单是待支付状态 step3:跳转到第三方支付页 ...

  5. 前端如何调用后端接口_后端开发:如何写出可靠的接口

    毕业进入现在的公司已近一年,完整参与了部门新项目两期的开发上线过程,作为一名后端开发,觉得最痛苦的是上线前和上线后的改 bug 阶段,面对各种突如其来.莫名其妙的bug,头昏脑涨.手忙脚乱.越改越懵, ...

  6. Mysql实现幂等_阿里面试官:接口的幂等性怎么设计?

    大家好,我是狂聊. 自己最近负责的几个接口,都涉及到了幂等性的操作,抽空总结了一下,这也是面试官比较爱问的问题. 一.什么是幂等? 看一下维基百科怎么说的: 幂等性:多次调用方法或者接口不会改变业务状 ...

  7. Java后端接口幂等的方案

    原文网址:Java后端接口幂等的方案_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java后端接口幂等的方案. 接口幂等也是Java后端面试中常见的问题. 幂等的含义 对同一个系统,使用同样的条件 ...

  8. 分布式系统中接口的幂等性(转)

    业务场景 公司有个借贷的项目,具体业务类似于阿里的蚂蚁借呗,用户在平台上借款,然后规定一个到期时间,在该时间内用户需将借款还清并收取一定的手续费,如果规定时间逾期未还上,则会产生滞纳金. 用户发起借款 ...

  9. 【通用设计】分布式系统中接口的幂等性

    阅读目录 业务场景 接口幂等性 幂等性实现方式 Token机制 数据库去重表 Redis实现 状态机 总结 业务场景 公司有个借贷的项目,具体业务类似于阿里的蚂蚁借呗,用户在平台上借款,然后规定一个到 ...

最新文章

  1. 找出口和BADI的ABAP程序
  2. 用互斥锁实现程序只能有一个实例
  3. Angular 小试牛刀[1]:Getting Started
  4. 性能测试脚本之SQLServer执行语句
  5. 说服力——教你做出专业出彩的演示PPT
  6. 枚举根节点、安全点、安全区域、OopMap
  7. hitool java_第三章:使用HiTool下载程序
  8. 模拟电子技术基础概念
  9. php 递归中的全局变量,PHP递归函数内的静态变量
  10. cad批量选择相同块_在CAD中如何快速选择相同或类似的图形、图块?
  11. php免费获取天气预报
  12. springboot集成Mybatis返回的值为null
  13. springboot+vue医院预约挂号系统java
  14. 2的n次方对照表,最大256次方,2021年
  15. golang中如何比较struct,slice,map是否相等以及几种对比方法的区别
  16. mysql格式化日期的函数_MySql格式化日期函数
  17. excel使用教程_汉字资料如何进行数据分析?Excel中医学汉字资料转化为数字资料视频教程——If/Iserror/Find函数的结合使用...
  18. HTTP版本之间的区别
  19. 2022年全球市场数字电位器IC总体规模、主要生产商、主要地区、产品和应用细分研究报告
  20. 从自动驾驶安全报告看谷歌百度双龙会

热门文章

  1. [原创]浅谈在创业公司对PMF的理解
  2. 20172314 2018-2019-1《程序设计与数据结构》第四周学习总结
  3. 处理大并发的30条数据库规范
  4. Java Servlet生成JSON格式数据并用jQuery显示
  5. getchar()和getch()的区别
  6. Python 工具——Anaconda+Pycharm 的安装过程
  7. Idea打Jar包的坑,工程使用ali druid 等ali组件
  8. (十)如何查找端口被那个程序占用
  9. 多线程-Thread、Runnable、Callbale、Future
  10. 30年传奇 侯为贵留下的荣耀和遗憾