接口幂等性

幂等性:f(f(x)) = f(x),幂等元素运行多次,还等于它原来的运算结果。在系统中,一个接口运行多次,与运行一次的效果是一致的。

什么时候需要幂等性?

并不是所有的接口都要求幂等性,要根据业务设计。重复提交、接口重试、前端操作抖动等场景,例如用户一次提交一个订单,支付时只能扣一次钱。

幂等性策略

核心思想:通过**唯一的业务单号**保证幂等性。

非并发的情况,可以查询某个业务是否操作过,没有则执行(查询券是否使用过);并发时,操作过程加锁(分布式锁)。

select操作,不对数据有影响,天然幂等。

delete操作,第一次删除的话,不存在幂等性问题。

update操作

1、有唯一业务号的update操作

直接赋值是幂等的;set数据自增,不幂等。策略是更新操作传入数据版本号,通过乐观锁实现幂等性。

2、没有唯一业务号,同下。

insert操作的幂等性

1、有唯一业务号的insert操作,例如:秒杀,商品ID+用户id

实现方式:

可通过分布式锁,保证接口幂等业务执行完成后,不进行锁释放,让其自动过期释放

2、没有唯一业务号的insert操作,如用户注册,点击多次。

实现方式:没有唯一业务号,就要创建唯一业务号。

使用Token机制,保证幂等性进入到注册页,后台统一生成Token,返回前台隐藏域中;用户提交,将token一同传入后台;使用token获取分布式锁,完成Insert操作执行成功后,不释放锁,等待过期自动释放

3、混合操作幂等性

同样使用token机制。获取分布式锁,没有获取锁的就返回失败。

利用Token实现幂等性

假设用户提交订单前没有唯一业务id,此时可以考虑使用Token做幂等校验,创建一个唯一的业务id。

思路:用户进入订单提交页面,请求后端接口,根据sessionId保存一个Token到Redis中;用户提交订单时,携带Token,后端接口中校验Redis中Token与订单携带的Token是否一致,一致则允许订单操作,并删除Redis Token。

为了防止多次请求同时获取到同一个Redis Token,因此需要加分布式锁。

简要代码

@ApiOperation(value = "获取订单Token", notes = "获取订单Token", httpMethod = "POST")
@PostMapping("/getOrderToken")
public ServerResponse getOrderToken(HttpSession session) {String token = UUID.randomUUID().toString();redis.set("ORDER_TOKEN_" + session.getId(), token, 300);return ServerResponse.createBySuccess(token);
}@ApiOperation(value = "用户提交订单", notes = "用户提交订单", httpMethod = "POST")
@PostMapping("/create")
public ServerResponse create(@RequestBody SubmitOrderBO submitOrderBO,HttpServletRequest request,HttpServletResponse response) {// 防止并发创建多个订单,加分布式锁String lockKey = "LOCK_KEY_" + request.getSession().getId();RLock lock = redissionClient.getLock(lockKey);lock.lock(5, TimeUnit.SECONDS);try {// 接口幂等性操作,校验TokenString orderTokenKey = "ORDER_TOKEN_" + request.getSession().getId();String orderToken = redis.get(orderTokenKey);if (StringUtils.isBlank(orderToken)) {throw new RuntimeException("orderToken不存在");}if (!orderToken.equals(submitOrderBO.getToken())) {throw new RuntimeException("orderToken不正确");}// 请求正确后删除Tokenredis.del(orderTokenKey);} finally {lock.unlock(); // 也要try catch一下}// 其他订单校验、提交等操作。。。
}

分布式接口幂等性的实现相关推荐

  1. 分布式接口幂等性、分布式限流:Guava 、nginx和lua限流

    点击关注公众号,实用技术文章及时了解 一.接口幂等性 接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用.举个最简单的例子,那就是支付,用户购买商品 ...

  2. 如何优雅的实现分布式接口幂等性、分布式限流(荣耀典藏版)

    目录 一.接口幂等性 1.Update操作的幂等性 2.使用Token机制,保证update.insert操作的幂等性 二.分布式限流 2.1.分布式限流的几种维度 2.1.1.QPS和连接数控制 2 ...

  3. 分布式接口幂等性、分布式限流(Guava 、nginx和lua限流)

    一.接口幂等性 接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用.举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时 ...

  4. 分布式接口幂等性、分布式限流总结整理

    - 1 - 文章目录 一.接口幂等性 1.Update操作的幂等性 1)根据唯一业务号去更新数据 2.使用Token机制,保证update.insert操作的幂等性 1)没有唯一业务号的update与 ...

  5. Spring Boot + Redis 实现接口幂等性 | 分布式开发必知!

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 来源:http://tinyurl.com/y5k2sx5t >>阿里云8月最新 ...

  6. 接口幂等性的设计之————redis分布式锁的应用

    接口幂等性的设计之----redis分布式锁的应用 在集群分布式机器部署的前提下,接口在相同数据高并发的情况下如果没有唯一索引的情况下,可能会有一些问题. 比如: 插入或更新商品的接口,如果没有则插入 ...

  7. 分布式专题——接口幂等性实战

    文章目录 1.接口设计与重试机制引起的问题. 2.什么是幂等性? 3.什么情况需要幂等性? 4.业务场景? 5.幂等性设计的核心思想. 6.如何实现接口幂等? 7.select,delete,inse ...

  8. Spring Boot 实现接口幂等性的 4 种方案!还有谁不会?

    点击关注公众号,Java干货及时送达 作者:超级小豆丁 链接:mydlq.club/article/94 一.什么是幂等性 幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两 ...

  9. SpringBoot 接口幂等性的实现方案

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:超级小豆丁 http://www.mydlq.clu ...

最新文章

  1. 乔布斯诞辰67周年,他的这些思想仍值得我们学习
  2. cocos2d-x游戏循环与调度
  3. 【LXC】 在 LXC 中使用 snap 包管理工具
  4. mysql sock golang_golang thrift 总结一下网络上的一些坑
  5. SAP 电商云 Spartacus UI 有状态 的 url 和 title 属性的赋值代码
  6. android安全性发展,Android未来发展 安全是重点
  7. java中double类型占几个字节_面试官:Java 中有几种基本数据类型是什么?各自占用多少字节?...
  8. 苹果中国大出血! AirPods 2免费送了
  9. 使用$.post和action或servlet交互 URL出现 http://localhost:8080/../[object%20Object] 错误的问题解决
  10. 西北大学计算机学院王郭玲,西北大学关于表彰2010-2011学年度学生先进集体
  11. atitit.薄伽梵歌overview  attilax 读后感
  12. pytorch图片数据归一化,通常传入transforms.Normalize(mean,std,inplace=False)中的mean和std是如何获取的?
  13. (转)币圈人物志 BM(EOS,BTS,Steem缔造者)
  14. java 中阶乘如何表示_Java阶乘实例
  15. bp神经网络预测案例python_详细BP神经网络预测算法及实现过程实例
  16. ARINC 429 过滤介绍
  17. 泛微OA中怎么导入html模板,如何在OA系统中设置模板标题
  18. 解决 The file will have its original line endings in your working directory
  19. c程序设计第五版谭浩强课后答案 第四章习题答案
  20. 局域网考勤python_Python3.7实现中控考勤机自动连接

热门文章

  1. 《软件开发原则》之“给中国软件工程师的寄语”
  2. 进程调度(一)——FIFO算法
  3. ECCV 2018 | 旷视科技包揽COCO+Mapillary四项世界第一,中国公司成最大赢家
  4. linux中fork函数与vfork函数的区别
  5. 网页邮箱格式怎么写?
  6. 国产手机出海:提着互联网灯笼去印度
  7. 如何用Power BI一键获取web网页数据?
  8. js日期加减一天_js日期如何进行加减计算
  9. 新手必备直播带货运营指南
  10. 唞音最新无人直播技巧系统