分布式架构:并发重复请求和幂等场景技术实现总结
原文:分布式架构:并发重复请求和幂等场景技术实现总结

概念
重复请求是指一个请求因为某些原因被多次提交,场景简述如下:
1)用户快速多次点击按钮
2)Nginx失败重试机制
3)服务框架失败重试机制
4)MQ消息重复消费
5)第三方支付支付成功后,因为异常原因导致的多次异步回调;

幂等性是指同样的请求参数,多次请求返回的结果相同。一般是因为重复请求导致的重复操作等,但重复请求不只包含并发时的重复请求还包括并并发情况下的业务重试。

基本原理
实现幂等需要两个条件1、同一请求参数(并发请求或非并发请求);2、多次请求返回的结果一致。一般大家讲的都是并发情况下的,使用并发控制解决,但还有一点是要满足返回的结果一致,这个一般根据场景来定,是返回相同结果还是返回失败。

发生原因
1)分布式系统中网络的三态性:成功,失败,未知,未知时一般三方系统会定期重试。
2)用户重复提交或系统重试机制导致的多次请求;

常见解决方案
解决思路:并发控制+返回相同结果
分类:按是否更改数据可以把接口分为查询类接口和更新类接口,查询类接口天然支持幂等,因此幂等性主要是解决更新类接口幂等。
1)唯一索引
描述:比如订单号做唯一索引,同一订单号只能插入一条记录;
应用场景:适用于单库单表的新增场景。
2)Select+[Insert/Update]
描述:先进行查询,根据查询结果判断是否符合更新条件,符合则更新;
应用场景:因为两条Sql非原子操作,适合并发量不高的新增或修改场景。
3)数据库乐观锁
描述:根据某一字段做为更新条件,如何不满足,则更新失败,比如状态字段或增加自增版本号字段。【版本号字段可以解决ABA问题】
应用场景:适合非高并发的更新,且有版本控制字段的场景。如果高并发更新,评估利弊后可使用悲观锁。
4)防重Token
描述:页面加载时,先请求服务端返回防重Token,用户提交时将token一起提交到服务端,服务端判断token是否存在,存在则执行,不存在则异常处理。【可根据业务规则是更新token的状态值还是直接删除token来标识已处理过】
应用场景:适用于没有唯一性字段的添加或修改类场景。
5)防重表
描述:基于数据库的方式进行并发控制,此表通过唯一字段+唯一索引来保障不重复处理数据。
应用场景:简单分布式情况下对添加或修改类场景,进行并发或防重控制(也适用于老系统不想新增并发控制字段,统一进行并发字段存储的场景)。【复杂分布式因为请求量或数据量太大,超过了单表的限制,此时防重表可能存在出错的情况】
6)分布式锁
描述:以唯一字段作为key进行加锁,请求处理时先判断是否有锁,无锁则先加锁再处理逻辑,重复请求因为已经加锁,则说明重复,则不处理。
场景:适合分布式高并发场景或不适用其它方式的场景,比如发验证短信60秒控制,因为控制信息是记录在缓存中的,无法使用乐观锁等方式,因此只能使用分布式锁。

小结:解决方案的核心是根据资源(数据)的唯一性或唯一条件进行并发控制。

应用场景举例
以订单流程为例,介绍下幂等实现的常规解决方案。
订单流程:

1、用户提交订单->待支付
2、用户付款成功->待出库
3、商品出库->等待收货
4、买家收货->完成

其中:提交订单为添加类接口,付款成功,商品出库,等待收货,完成为修改类接口。

1)订单提交->待支付
单机环境:订单号唯一索引或Select+Insert
分布式环境:Redis分布式锁或防重token或防重表
2)用户付款成功->待出库,商品出库-等待收货,买家收货->完成
单机环境:乐观锁
分布式环境:Redis锁或防重token或防重表或Select+Update或乐观锁

降级方案
分布式锁+唯一索引或乐观锁
分布式环境下,1)如果只加分布式锁可能会存在锁失效的情况,2)业务层锁控制后,数据操作服务可能会超时重试;因此,依旧需要有唯一索引或数据库乐观锁来进行并发控制,保障最后一道防线。

文章小结
本文对重复请求和需要幂等控制的场景进行了介绍,并讲解了常见的解决方案,最后以订单流程为例介绍了方案的具体应用。希望对大家在防重和幂等控制设计上有帮助,不足之处,请批评指正,欢迎一起交流讨论。

posted on 2019-04-03 13:39 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10648290.html

分布式架构:并发重复请求和幂等场景技术实现总结相关推荐

  1. 并发重复请求及幂等场景的实现总结

    待总结 转载于:https://www.cnblogs.com/guapiwangxi/p/10769354.html

  2. yii2 请求外部api_[PHP] 基于redis的分布式锁防止高并发重复请求

    需求: 我们先举个某系统验证的列子:(A渠道系统,业务B系统,外部厂商C系统) (1)B业务系统调用A渠道系统,验证传入的手机.身份证.姓名三要素是否一致. (2)A渠道系统再调用外部厂商C系统. ( ...

  3. 服务器高并发时请求报错_基于redis的分布式锁防止高并发重复请求

    需求: 我们先举个某系统验证的列子:(A渠道系统,业务B系统,外部厂商C系统) (1)B业务系统调用A渠道系统,验证传入的手机.身份证.姓名三要素是否一致. (2)A渠道系统再调用外部厂商C系统. ( ...

  4. 高并发重复请求的去重处理

    最近碰到一个重复提交请求,并能在数据库重复插入多条同样数据的问题.因为需求涉及到的是给用户发放购物卡,直接关系到的是金钱,所以是影响很大的一个问题,比如给一个用户发放100元一次,结果被某些居心不良之 ...

  5. 关于分布式架构的优缺点、问题、层级、技术栈等的归纳

    本篇文章主要源自本人自学左耳朵耗子的专栏中的相关分布式的文章归纳而来. https://coolshell.cn/  该专栏作者自己的博客,推荐一下 目录 什么是分布式架构 为什么要使用分布式架构 分 ...

  6. 并发编程--用SingleFlight合并重复请求

    大家好啊,今天网管想给大家介绍一下Go的singleflight包,当然它不是直译过来的单飞的意思~~!SingleFlight是Go语言sync扩展库提供的另一种并发原语,那么SingleFligh ...

  7. 分布式架构、大数据、机器学习、搜索、推荐、广告

    http://blog.csdn.net/yangbutao/article/details/12242441  [置顶] 构建高并发高可用的电商平台架构实践 标签: 架构电商高并发高可用实践 201 ...

  8. 广发证券基于分布式架构的新一代估值系统实践

    文 / 广发证券信息技术部 来源 / 金融电子化 随着信息技术应用创新试点范围不断扩大,能否胜任更多业务场景,是各行各业当前阶段选型数据库的关键.早在 2019 年,广发证券即开启对分布式架构的数据库 ...

  9. 软件架构-从0到1认知分布式架构(上)

    不管之前接触过分布式的没有,有没有分布式的经验,跟着老铁我一起看看熟悉下,绝对收获满满,里面可是有段子啊~ ####(一)分布式发展的历史和背景 场景 一家做政府系统OA系统的公司老板,发现跟竞争对手 ...

最新文章

  1. Python3 xml模块的增删改查
  2. c语言程序设计实验教学,C语言程序设计实验教学改革研究
  3. Stanford CoreNLP使用需要注意的一点
  4. SDN的转发与控制分离—Vecloud微云
  5. Matlab图像处理创新实践-实验1【图像滤波基础(1)】
  6. Java并发编程高级篇(十):分离任务的执行和结果的处理
  7. ruby scala python_解释一个基准在C,Clojure,Python,Ruby,Scala和其他
  8. [导入]ASP.NET 配置节架构
  9. CentOS基础操作指令(磁盘分区和挂载)
  10. 95-140-114-源码-transform-算子project
  11. php正则表达式 包含特殊字符,php正则表达式的特殊字符含义
  12. FreeSwitch视频会议,4路以上CPU占用暴增的原因
  13. matlab画函数微分图,【matlab】ode45求解二阶微分方程,绘制曲线图 | 使用函数句柄的方法...
  14. 读《如何阅读一本书》乱摘
  15. oracle热备是什么意思,Oracle冷备和热备脚本
  16. 2020哔哩哔哩大数据面试题整理
  17. java 数字拆分_如何在java中分割数字?
  18. 【项目10】python+flask搭建CNN在线识别手写中文网站
  19. Python Web开发技巧III
  20. Java绘制椭圆和矩形(实现自由变化大小的功能)

热门文章

  1. 用vue优雅地编写UI组件的几条指导原则
  2. Qt控制中控考勤SDK
  3. Web Essentials之样式表StyleSheets
  4. Python之数据聚合与分组运算
  5. ASP.NET2.0中的全球化与本地化UICulture,Culture
  6. [转贴]经济学人:Win7拉开新时代序幕 云计算群雄逐鹿
  7. Logstash在Linux上安装部署
  8. C++ error LNK2019: 无法解析的外部符号 错误解决方案
  9. BZOJ3670 [Noi2014]动物园 【KMP计数】
  10. viewholder