分布式下引发的并发问题

情景一:

客户端超时时间(CT)小于服务端超时时间(ST)。【调整时间大小】

当客户端调用服务端向数据库发起请求时,假如是个大数据量提交,

假如客户端超时时间为10s,服务端超时时间为15s

当提交等待时间为12s时,客户端已经返回错误,而服务端未超时。

最后12s后服务端提交成功。而客户端返回失败。

情景二:

1、分布式锁超时时间小于业务超时时间【调整时间大小】

2、数据库里相关字段没有唯一索引【增加唯一幂等性验证】

那么如果线程A提交的数据出现问题(如大数据提交等),处于等待状态,并获得分布式锁。

而线程B、C...也来提交,由于分布式锁,访问被拦截。

当分布式锁超时时间结束时,线程Z刚好提交。

如果数据库缺少唯一性索引,此时线程A与线程Z可能同时提交成功。

情景三:

1、分布式锁超时时间小于业务超时时间【调整时间大小】

2、业务有重试机制

3、数据库里相关字段没有唯一索引【增加唯一幂等性验证】

(1)由于数据库连接数被占满,流水 1 创建的事务处于等待提交状态。

(2)系统 A 发现交易失败,重试次数不满 8 次的,立即发起重试,触发生成流水

2 的请求。

(3)5s 以内数据均被分布式锁拦截,无法提交。

(4)经过 5s 后,系统 B 的分布式锁失效,此时事务仍在等待未提交。

(5)6s 时,流水 2 成功越过数据库查询幂等校验发起事务,此时流水 1 拿到数

据库连接,流水 1 和 2 两个事务同时提交。

(6)由于数据库未做唯一索引,且支付受理模块打穿下层幂等原则,生成 2 个

TXID,导致两事务同时提交成功。

(7)收益结转重复记账,用户多了一笔收入。

得出一个结论:分布式锁在以下条件同时满足的情况下并发控制会被打穿。

(1)上层业务系统层面有重试机制。

(2)业务请求存在一定时间之后提交成功的情况,例如本例中第一次请求在事务

等待 6s 后获得了数据库链接,提交数据库成功。

(3)下游系统缺乏其他有效的幂等控制手段

原文地址:https://www.cnblogs.com/churao/p/8494244.html

时间: 2024-11-01 14:41:55

分布式下引发的并发问题的相关文章

编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误、不要在不恰当的场合下引发异常、重新引发异常时使用inner Exception]

原文:编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误.不要在不恰当的场合下引发异常.重新引发异常时使用inner Exception] 前言 自从.NET出现后,关于CLR异常机制的讨论就几乎从未停止过.迄今为止,CLR异常机制让人关注最多的一点就是"效率"问题.其实,这里存在认识上的误区,因为正常控制流程下的代码运行并不会出现问题,只有引发异常时才会带来效率问题.基于这一点,很多开发者已经达成共识:不应将异常机制用于正常控制流中.达成的另一个共识是:CLR异常机制带来

windows下修改apache并发数

还没有尝试 修改apache的最大连接数,方法如下: 步骤一 先修改 /path/apache/conf/httpd.conf文件. # vi httpd.conf 将“#Include conf/extra/httpd-mpm.conf”前面的 “#” 去掉,保存. 步骤二 再修改 /path/apache/conf/extra/httpd-mpm.conf文件. # vi httpd-mpm.conf 找到 这一行 原: StartServers 5 MinSpareServers 5 Ma

编写高质量代码改善C#程序的157个建议——建议59:不要在不恰当的场合下引发异常

建议59:不要在不恰当的场合下引发异常 常见的不易于引发异常的情况是对在可控范围内的输入和输出引发异常. private void SaveUser3(User user) { if (user.Age < 0) { throw new ArgumentOutOfRangeException("Age不能为负数."); } // 保存用户 } 此方法起码有两个地方欠妥: 1)判读Age不能为负数.这是一个正常的业务逻辑,它不应该被处理为一个异常. 2)应采用Tester-Doer

(四)伪分布式下jdk1.6+Hadoop1.2.1+HBase0.94+Eclipse下运行wordCount例子

本篇先介绍HBase在伪分布式环境下的安装方式,然后将MapReduce编程和HBase结合起来使用,完成WordCount这个例子. HBase在伪分布环境下安装 一.   前提条件 已经成功地安装了jdk1.6和hadoop1.2.1. Jdk1.6+Hadoop1.2.1在伪分布环境下具体的安装方法见:Hadoop1.2.1安装——单节点方式和单机伪分布方式 二.   环境 VMware® Workstation 10.04 Ubuntu14.04 32位 Java JDK 1.6.0 h

14套java精品高级架构课,Dubbo分布式Restful 服务,并发原理编程,SpringBoot,SpringCloud,RocketMQ中间件视频教程

14套java精品高级架构课,缓存架构,深入Jvm虚拟机,全文检索Elasticsearch,Dubbo分布式Restful 服务,并发原理编程,SpringBoot,SpringCloud,RocketMQ中间件,Mysql分布式集群,服务架构,运 维架构视频教程 14套精品课程介绍: 1.14套精 品是最新整理的课程,都是当下最火的技术,最火的课程,也是全网课程的精品: 2.14套资 源包含:全套完整高清视频.完整源码.配套文档: 3.知识也 是需要投资的,有投入才会有产出(保证投入产出比是

分布式下Session一致性架构举例

一.问题及方案 见这篇文章:分布式下Session一致性问题 二.分布式环境搭建: 系统环境 [[email protected] ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [[email protected] ~]# 2.1 安装jdk # 下载jdk-8u141-linux-x64.tar.gz # 创建目录 mkdir -p /opt/java # 解压 tar -xzvf jdk-8u141-linu

大数据量下的高并发分布式访问控制(ACL)优化方案(一)

目前的设计方案 1.1.控制计数: 在目前的项目中,有很多接口需要对访问方进行权限访问控制.目前设计方案是:利用redis集群来存储每个访问控制点的访问计数信息.Key值为=PlatformId(接入平台方)+InterfaceId(系统接口)+dayTime(日期时间),value值为当天每个时段的访问次数统计列表. 1.2.控制规则: 通过页面配置并制定控制规则.业务系统在启动时加载控制规则,并访问redis获取控制次数,然后在业务系统中做逻辑判断完成,ACL控制做请求拦截处理. 目前的痛点

分布式下Session一致性问题

一.Session一致性问题 1.1 什么是Session 用户使用网站的服务,基本上需要浏览器和web服务器进行多次交互,web服务器如何知道哪些请求是来自哪个会话的? 具体方式为:在会话开始时,分配一个唯一的会话标识(sessionId),通过cookie把这个标识告诉浏览器,以后每次请求的时候,浏览器都会带上这个会话标识来告诉web服务器请求是属于哪个会话的.如果遇到禁用cookie的情况,一般的做法就是把这个会话标识放到url的参数中. 1.2 什么是Session一致性问题 因为会话信

C#多线程环境下调用 HttpWebRequest 并发连接限制

.net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows 7 下默认是2,在服务器操作系统上默认为10. 如果不修改这个并发连接限制,那么客户端同时可以建立的 http 连接数就只有2个或10个.对于一些诸如浏览器或网络蜘蛛的应用,2个或10个并发数量实在太少,大大影响应用的性能.之所以有这个并发连接限制,是因为 http 1.0 和 http 1.1 标准规定并发连接数最大为2. 不