面试题:分布式事务有哪些方案及运用场景

news2024/11/25 2:29:58

一、分布式事务概述

分布式事务是指涉及多个不同资源或数据库的事务处理,这些资源或数据库分布在不同的网络节点上,通过协调器将多个事务组合成一个分布式事务。分布式事务的目的是确保多个事务操作要么全部成功,要么全部失败,保持事务的一致性和完整性。在分布式事务中,涉及到的节点可能位于不同的计算机、不同的进程或者不同的数据库系统中。

二、分布式事务的实现的方案

主要有以下 5 种:

  1. XA 方案:两阶段提交(X/Open XA),是分布式事务的标准。事务管理器(Transaction Manager)通过协调者(Coordinator)向所有参与者(Participant)发送请求,参与者接收到请求后进行准备操作,如果全部准备成功则向协调者发送响应,协调者收到所有参与者的响应后向事务管理器发送事务完成通知。
  2. TCC 方案:把业务流程拆分成多个原子操作,通过事务管理器来协调每个参与者的事务。每个参与者创建一个本地事务,事务管理器监控每个本地事务的状态,如果发现某个本地事务失败,则回滚该本地事务,如果所有本地事务都成功,则提交所有本地事务。
  3. 本地消息表:将需要分布式处理的操作以消息的形式存储在消息队列中,消息的接收方是各个业务节点,业务节点处理完消息后将状态更新到本地数据库。如果消息发送失败或业务节点执行失败,则需要重试。
  4. 可靠消息最终一致性方案:通过使用消息队列和确认机制实现分布式事务。当一个节点发送消息给其他节点时,其他节点收到消息后需要回复确认消息,如果发送失败则需要重试。
  5. 最大努力通知方案:当一个节点需要通知其他节点时,它需要尽最大努力将通知发送给所有节点,即使有节点无法接收到通知,也需要继续执行本地事务。

三、XA 方案

1. XA协议概述

XA协议是一个基于数据库的分布式事务协议,其分为两部分:

  1. 事务管理器。
  2. 本地资源管理器。

事务管理器:作为一个全局的调度者,负责对各个本地资源管理器统一号令提交或者回滚。二阶提交协议(2PC)和三阶提交协议(3PC)就是根据此协议衍生出来而来。如今Oracle、Mysql等数据库均已实现了XA接口。

2. XA协议目前状况

  • XA 协议比较简单,而且一旦商业数据库实现了 XA 协议,使用分布式事务的成本也比较低。
  • XA 性能不理想,特别是在交易下单链路,往往并发量很高,XA 无法满足高并发场景。
  • XA目前在商业- 数据库支持的比较理想,在mysql数据库中支持的不太理想,mysql的XA 实现,没有记录 prepare 阶段日志,主备切换回导致主库与备库数据不一致。
  • 许多 nosql也没有支持 XA,这让 XA的应用场景变得非常狭隘。
  • 也有3PC,引入了超时机制(无论协调者还是参与者,在向对方发送请求后,若长时间未收到回应则做出相应处理)

3. 2PC协议

两个阶段:

第一阶段提交:
协调者收到客户端请求,协调者给每一个参与者发送prepare指令,参与者接收指令执行本地数据但不提交事务,并返回ready

第二阶段提交:
1)当第一阶段所有参与者返回接收prepare指令并返回ready时,协调者发送commit指令给参与者,所有参与者提交事务
2)当第一阶段返回超时或者参与者执行失败,协调者在第二阶段告诉所有参与者回滚

如图:
在这里插入图片描述

4. 案例1:订单管理和支付管理

假设有一个电商系统,包含了订单管理和支付管理两个模块。订单管理模块负责生成订单,并将订单状态更新到数据库中;支付管理模块负责处理用户的支付操作,并将支付结果更新到数据库中。这两个模块需要在一个事务中执行,确保订单和支付状态的一致性。

在这种情况下,可以使用 XA 方案来实现分布式事务。具体实现步骤如下:

  1. 订单管理模块生成订单,并将订单状态更新到数据库中。
  2. 支付管理模块处理用户的支付操作,并将支付结果更新到数据库中。
  3. 订单管理模块向 XA 协调器发送准备提交请求。
  4. 支付管理模块向 XA 协调器发送准备提交请求。
  5. XA 协调器接收到所有参与者的准备提交请求后,开始执行两阶段提交协议。
  6. 第一阶段提交协议:XA 协调器向所有参与者发送投票请求,并等待各个参与者的响应。如果某个参与者投票成功,则向该参与者发送准备提交请求,否则向该参与者发送准备回滚请求。
  7. 第二阶段提交协议:XA 协调器根据各个参与者的响应结果,决定事务的提交或回滚。如果所有参与者都投票成功,则向所有参与者发送提交请求,否则向所有参与者发送回滚请求。
  8. 订单管理模块和支付管理模块接收到提交或回滚请求后,进行相应的操作,确保订单和支付状态的一致性。

通过以上步骤,就可以使用 XA 方案实现分布式事务,保证订单和支付状态的一致性。需要注意的是,在实际应用中,还需要考虑性能问题、并发能力受限等问题。

5. 案例2:用户下单与扣减库存

一个下单流程会用到多个服务,各个服务都无法保证调用的其他服务的成功与否,这个时候就需要一个全局的角色(协调者)对各个服务(参与者)进行协调。

一个下单请求过来通过协调者,给每一个参与者发送Prepare消息,执行本地数据脚本但不提交事务。
如果协调者收到了参与者的失败消息或者超时,直接给每个参与者发送回滚(Rollback)消息;否则,发送提交(Commit)消息;参与者根据协调者的指令执行提交或者回滚操作,释放所有事务处理过程中被占用的资源,显然2PC做到了所有操作要么全部成功、要么全部失败。

如图:
在这里插入图片描述

6. XA协议优点:

  • 简单易用:XA 方案是一种标准的事务管理协议,各个厂商都提供了相应的实现,因此使用起来非常简单易用。
  • 事务的一致性:XA 方案可以实现分布式事务的一致性,即确保多个事务操作要么全部成功,要么全部失败,从而保持事务的一致性和完整性。
  • 可扩展性:XA 方案是基于资源管理器的一种事务管理机制,因此可以很方便地扩展到多个数据库或资源管理器上,从而实现分布式事务的处理。
  • 可靠性:XA 方案通过两阶段提交协议来保证事务的可靠提交或回滚,即在进行提交操作之前,会对各个资源管理器进行预提交操作,如果预提交操作成功,则进行提交操作,否则进行回滚操作,从而确保事务的可靠性。

7. XA协议缺点:

二阶段提交看似能够提供原子性的操作,但它存在着严重的缺陷

  • 网络抖动导致的数据不一致: 第二阶段中协调者向参与者发送commit命令之后,一旦此时发生网络抖动,导致一部分参与者接收到了commit请求并执行,可其他未接到commit请求的参与者无法执行事务提交。进而导致整个分布式系统出现了数据不一致。
  • 超时导致的同步阻塞问题: 2PC中的所有的参与者节点都为事务阻塞型,当某一个参与者节点出现通信超时,其余参与者都会被动阻塞占用资源不能释放。
  • 单点故障的风险: 由于严重的依赖协调者,一旦协调者发生故障,而此时参与者还都处于锁定资源的状态,无法完成事务commit操作。虽然协调者出现故障后,会重新选举一个协调者,可无法解决因前一个协调者宕机导致的参与者处于阻塞状态的问题。

四、3PC 方案

1. 概述:

三个阶段:
1. CanCommit:

协调者向所有参与者发送CanCommit命令,询问是否可以执行事务提交操作。如果全部响应YES则进入下一个阶段。

  1. PreCommit:

协调者向所有参与者发送PreCommit命令,询问是否可以进行事务的预提交操作,参与者接收到PreCommit请求后,如参与者成功的执行了事务操作,则返回Yes响应,进入最终commit阶段。一旦参与者中有向协调者发送了No响应,或因网络造成超时,协调者没有接到参与者的响应,协调者向所有参与者发送abort请求,参与者接受abort命令执行事务的中断。

  1. DoCommit:

在前两个阶段中所有参与者的响应反馈均是YES后,协调者向参与者发送DoCommit命令正式提交事务,如协调者没有接收到参与者发送的ACK响应,会向所有参与者发送abort请求命令,执行事务的中断。

在这里插入图片描述

2、3PC目前状况:

  • 三段提交(3PC)是对两段提交(2PC)的一种升级优化,
  • 3PC在2PC的第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前,各参与者节点的状态都一致。
  • 同时在协调者和参与者中都引入超时机制,当参与者各种原因未收到协调者的commit请求后,会对本地事务进行commit,不会一直阻塞等待,解决了2PC的单点故障问题。
  • 但3PC还是没能从根本上解决数据一致性的问题,主要原因:网络中断,自动提交

3. 优点和缺点:

优点

  • 降低延迟:3PC将两阶段提交协议中的第二阶段提交操作分为两个阶段,即准备阶段和预提交阶段,避免了第二阶段提交时的长时间阻塞,降低了事务提交的延迟。
  • 提高并发性能:3PC在准备阶段和预提交阶段,通过只加锁部分资源,减少了资源占用,提高了系统的并发性能。
  • 容错性强:3PC在事务提交过程中,如果发生错误,可以回滚到事务的初始状态,保证系统的数据一致性。

缺点:

  • 实现复杂:3PC协议的实现相对于两阶段提交协议来说更加复杂,需要额外的逻辑和计算开销。
  • 事务并发量限制:3PC协议对事务的并发量有一定限制,如果系统中有大量并发的事务,可能会导致资源占用过量,降低系统的性能。
  • 单点问题:3PC协议中的协调者是重要的组件,如果协调者出现故障,整个系统的事务将无法进行,存在单点问题

4. 应用案例

  1. 订单管理模块生成订单,并将订单状态更新到数据库中。
  2. 支付管理模块处理用户的支付操作,并将支付结果更新到数据库中。
  3. 订单管理模块向协调者发送准备提交请求。
  4. 支付管理模块向协调者发送准备提交请求。
  5. 协调者根据所有参与者的准备情况,判断是否可以进行预提交操作。
  6. 如果所有参与者都准备成功,则进行预提交操作,向所有参与者发送预提交请求。
  7. 如果某个参与者准备失败,则进行回滚操作,向所有参与者发送回滚请求。
  8. 所有参与者接收到预提交请求后,进行提交操作,更新本地数据库。
  9. 如果某个参与者提交失败,则进行回滚操作,向协调者发送回滚请求。
  10. 协调者接收到所有参与者的提交或回滚请求后,进行最终提交或回滚操作,更新全局数据库。

五、柔性事务(BASE)— TCC模式

TCC与XA协议不同,不是数据库原生实现

1. 概述

TCC(Try-Confirm-Cancel)分布式事务模型通过对业务逻辑进行分解来实现分布式事务。顾名思义,TCC事务模型需要业务系统提供以下三种业务逻辑。

  • Try:完成业务检查,预留业务所需的资源。Try操作是整个TCC的精髓,可以灵活选择业务资源锁的粒度。
  • Confirm:执行业务逻辑,直接使用Try阶段预留的业务资源,无须再次进行业务检查。
  • Cancel:释放Try阶段预留的业务资源。

TCC模型仅提供两阶段原子提交协议,保证分布式事务的原子性。事务的隔离交给业务逻辑来实现。TCC 模型的隔离性思想是,通过对业务的改造将对数据库资源层面加锁上移至对业务层面加锁,从而释放底层数据库锁资源,拓宽分布式事务锁协议,提高系统的并发性。

2. 案例

以A账户向B账户汇款100元为例。汇款服务和收款服务需要分别实现Try、Confirm、Cancel这三个接口,并在业务初始化阶段将这三个接口的实现注入TCC事务管理器。

  • 汇款服务
    — Try:检查A账户的有效性;检查A账户的余额是否充足;从A账户中扣减100元,并将状态置为“转账中”;预留扣减资源,将“从A账户向B账户转账100元”这个事件存入消息或日志。
    — Confirm:不做任何操作。
    — Cancel:A账户增加100元;从日志或消息中释放扣减资源。
  • 收款服务
    —Try:检查B账户的有效性。
    — Confirm:读取日志或者消息,B账户增加100元;从日志或消息中释放扣减资源。
    — Cancel:不做任何操作。

由此可以看出,TCC模型对业务的侵入性较强,改造的难度较大。

如图:
在这里插入图片描述

3. 优缺点:

优点:

  1. 解决跨服务的业务操作原子性问题,例如组合支付,订单减库存等场景非常实用。
  2. TCC的本质原理是把数据库的二阶段提交上升到微服务来实现,从而避免了数据库2阶段中锁冲突的长事务低性能风险。
  3. TCC异步高性能,它采用了try先检查,然后异步实现confirm,真正提交的是在confirm方法中。

缺点:

  1. 对微服务的侵入性强,微服务的每个事务都必须实现try,confirm,cancel等3个方法,开发成本高,今后维护改造的成本也高。
  2. 为了达到事务的一致性要求,try,confirm、cancel接口必须实现等幂性操作(定时器+重试)。
  3. 由于事务管理器要记录事务日志,必定会损耗一定的性能,并使得整个TCC事务时间拉长,建议采用redis的方式来记录事务日志。

六、最大努力通知型

1. 概述

最大努力通知型(Maximally Effort Notification,MEN)是一种分布式事务的实现方式,它通过在事务涉及的各个业务系统之间传递消息来实现事务的协调和提交。MEN的主要思想是在事务提交之前,尽力将所有消息发送给接收方,但是不保证接收方是否能够成功处理这些消息。

2. MEN的实现方式通常包括以下步骤:

  1. 在事务开始时,业务系统A向消息队列发送一条消息,通知其他业务系统将要发生的事务。
  2. 业务系统B收到消息后,尝试完成事务操作,并将操作结果发送回消息队列。
  3. 业务系统A收到B的操作结果后,根据结果决定是否重试或提交事务。

3. 应用案例

场景:一个电商网站在进行订单支付时,需要完成以下操作:

  1. 在订单系统中创建订单。
  2. 在支付系统中进行支付操作。
  3. 在物流系统中更新库存。

实现方案:

  1. 订单系统创建一个订单并向消息队列发送一条消息,通知其他业务系统将要发生的事务。
  2. 支付系统收到消息后,尝试完成支付操作,并将操作结果发送回消息队列。
  3. 物流系统收到消息后,尝试更新库存,并将操作结果发送回消息队列。
  4. 订单系统收到所有业务系统的操作结果后,根据结果决定是否重试或提交事务。

4. 优缺点

MEN的优点包括:

  • 低侵入性:MEN的实现方式对业务系统的侵入性较低,不需要修改业务系统的代码。
  • 高可用性:MEN的消息传输机制通常采用至少送达一次的方式,确保消息能够被接收方收到。
  • 弹性扩展:MEN的消息传输机制通常支持多个消息消费者,能够轻松扩展到更多的业务系统。

缺点包括:

  • 数据不一致:由于MEN不能保证消息被接收方成功处理,因此可能会导致数据不一致的问题。
  • 重复消息:由于MEN不能保证消息的唯一性,可能会发送重复的消息,导致接收方处理错误。
  • 系统复杂性:MEN的实现方式需要依赖消息队列和其他中间件,增加了系统的复杂性。

七、可靠消息+最终一致性

1. 概述

消息一致性方案是通过消息中间件保证上下游应用数据操作一致性的。
基本思路是,将本地操作和发送消息放在同一个本地事务中,下游应用从消息系统订阅该消息,收到消息后执行相应的操作,本质上是依靠消息的重试机制达到最终一致性的
在这里插入图片描述
主要包括以下两个步骤:

  • 本地事务执行成功后,向消息中间件发送一条消息,通知其他业务系统将要发生的事务。
  • 业务系统接收到消息后,异步执行事务操作,并在操作完成后向消息中间件发送一条结果消息,以确保最终一致性。

2. 应用案例

场景:一个电商网站在进行订单支付时,需要完成以下操作:

  1. 在订单系统中创建订单。
  2. 在支付系统中进行支付操作。
  3. 在物流系统中更新库存。

实现方案:

  1. 订单系统创建一个订单,并向消息队列发送一条消息,通知其他业务系统将要发生的事务。
  2. 支付系统和物流系统各自订阅订单创建消息,异步执行事务操作。
  3. 支付系统执行支付操作后,向消息队列发送一条支付成功消息。
  4. 物流系统执行库存更新操作后,向消息队列发送一条更新成功消息。
  5. 订单系统收到所有业务系统的操作结果后,根据结果决定是否重试或提交事务。

3. 优缺点:

优点包括:

  • 低侵入性:可靠消息+最终一致性的实现方式对业务系统的侵入性较低,不需要修改业务系统的代码。
  • 高可用性:消息中间件通常采用至少送达一次的方式,确保消息能够被接收方收到。
  • 弹性扩展:消息中间件通常支持多个消息消费者,能够轻松扩展到更多的业务系统。

缺点包括:

  • 数据不一致:由于可靠消息+最终一致性不能保证消息被接收方成功处理,因此可能会导致数据不一致的问题。
  • 重复消息:由于可靠消息+最终一致性不能保证消息的唯一性,可能会发送重复的消息,导致接收方处理错误。
  • 系统复杂性:可靠消息+最终一致性的实现方式需要依赖消息中间件和其他中间件,增加了系统的复杂性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

白嫖Tesla T4 GPU玩转Stable Diffusion Webui

想要玩stable diffusion,算力不可少,白嫖google colab Tesla T4 GPU 玩转Stable Diffusion Webui 1、google colab上安装stable diffusion webui https://colab.research.google.com/drive/1qL5eD2VESnop8mrbFcHzMmfzqzmRMMF4?uspsharing 在google col…

提高代码调试能力——IDEA debug技巧

一、文章概述 idea debug调试的一些方法 二、按键简单介绍 如上如是debug时的按钮,标上序号便于说明。 1、重新开始调试 图中是已开是debug模式,不管你此时调试到哪个地方,此时点击1就可以重新开始运行程序调试:等价于&#x…

vue配置反向代理的使用

反向代理:常用于生产环境,项目部署时服务器的配置。 反向代理:同样创建一个代理服务器,用于接收客户端发送的请求,再将请求转发给内部网络上的服务器,从服务器中获取数据并返回给客户端。也就是 代理服务端…

一文了解:计算机视觉领域下自监督学习方法原理

计算机视觉领域下自监督学习方法原理 导语为什么在计算机视觉领域中进行自我监督学习? 自监督学习方法Generative methodsBEiT 架构 Predictive methodsContrastive methodsBootstraping methodsSimply Extra Regularization methods 导语 自监督学习是一种机器学习…

【NLP】从双曲面到双曲几何庞加莱盘

一、说明 在研究双曲空间的时候,不能不遇到双曲面的问题。双曲几何在什么样的双曲面建立?其它几何元素在双曲面的表现。庞加莱盘不是双曲几何的一部分,而是一个投影平面,自然语言处理中,图网络不是卷积神经网络。本篇从双曲方程开始,展开双曲空间的探讨。 二、双曲面总论…

数据库系统概述——第四章 数据库安全性(知识点复习+练习题)

🌟博主:命运之光 🦄专栏:离散数学考前复习(知识点题) 🍓专栏:概率论期末速成(一套卷) 🐳专栏:数字电路考前复习 🦚专栏&am…

【汤4操作系统】深入掌握操作系统-输入输出系统篇

第五章 输入输出系统 I/O系统简介 设备管理对象:主要是IO设备 设备管理的基本任务:完成用户提出的IO请求,提高IO速率以及改善IO设备的利用率 主要功能有: 隐藏物理设备细节。IO系统对IO设备进行适当的抽象,以隐藏掉物…

selenium 要点击的元素被其他元素遮挡 or 无法找到非可视范围内的元素

selenium 无法找到非可视范围内的元素 org.openqa.selenium.StaleElementReferenceException: The element reference of is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed se…

Java根据word模板生成word文档并转成PDF文件

1. 处理word模板 1.1 定义word模版 1.2 定义完我们的模板之后,我们要将文档保存为xml的格式 定义完我们的模板之后,我们要将文档保存为xml的格式 1.3 xml格式化 生成的xml格式看起来比较乱,没有层次感, 所以需要格式化一下 格式化 1.4 修改xml 基础信息…

TestNG官方文档中文版

TestNG官方文档中文版(1) -介绍 T e s t NG 的 官 方 文 档 请 见 :http://testng.org/doc/documentation-main.html 1 介绍 T e s t N G 是 一 个 设 计 用 来 简 化 广 泛 的 测 试 需 求 的 测 试 框 架 , 从 单 元 测 试 (隔 离测试- 个类)到集成测试(测试由有…

Visio2013绘制任意曲线

曲线上蓝色的‘弯曲点‘,随着拉伸曲线,它自己会增减,这里要和’连接点‘区分开,连接点是用来连接别的图形的。

git通过ssh代理连接github(gitee不支持),并更改端口

文章目录 需求github使用ssh代理的方案gitee无法实现ssh代理gitee的暂时解决方案 参考 需求 git clone github/gitee远程仓库,使用ssh协议,并且走本地的http代理(端口3128)。 运行环境是Ubuntu 20.04。 github使用ssh代理的方案 修改~/.ssh/config文…

解决containerd+k8s集群搭建镜像拉取不到的问题

解决containerdk8s集群搭建镜像拉取不到的问题 下载离线镜像导入镜像初始化集群安装calico插件安装MetalLB部署一个nginx应用并暴露端口 之前我写了一篇containerdk8s搭建集群的文章,文章地址: https://blog.csdn.net/m0_51510236/article/details/1308…

系统架构设计师-系统工程与信息系统基础(3)

一、企业信息化与电子商务 1、企业资源计划(ERP) ERP是由MRP(物料需求计划)、MRPll(制造资源计划)一步步演化而来。 MARPll:核心是物流,主线是计划。 ERP:打通了供应链&a…

小白也能玩转Docker:应用部署、迁移与备份

目录 1、应用部署 1.1、Mysql 1.2、Ngixn 1.3、Redis 1.4、RabbitMQ 1.5、Elasticsearch 1.6、Zookeeper 2、迁移与备份 2.1容器保存为镜像 2.2镜像备份 2.3镜像恢复与迁移 1、应用部署 1.1、Mysql 拉取mysql的镜像: docker pull mysql:5.7 为mysql镜…

C语言深度刨析(二)——符号

文章目录 前言注释符号几个似非而是的注释问题y x/*p如何编写出出色的注释 接续符和转义符单引号、双引号逻辑运算符位运算符左移和右移0x01<<23的值为多少&#xff1f; 花括号、--操作符2/(-2)的值是多少&#xff1f;运算符的优先级运算符的优先级表一些容易出错的优先…

JavaEE课程设计(项目详细设计)

目录 项目文件组织结构 springbootschemaApplication dao controller application.yml entity annotation interceptor config 项目文件组织结构 这是后端部分的源码结构图 springbootschemaApplication springbootschemaApplication是整个项目的入口 package …

AI热门垂直领域大模型盘点(附论文)

上回分享了一些通用大模型的使用感受&#xff0c;今天咱们就来聊聊垂直领域大模型&#xff0c;照旧附上论文资料&#xff0c;同学们自取哈&#xff01; 其实照目前的趋势来看&#xff0c;垂直领域大模型的未来发展是要比通用大模型好的&#xff0c;一是通用大模型有GPT4这座难…

Java手动编码实现与k8s交互式shell

前言 要手动编码&#xff0c;和k8s做shell交互&#xff0c;我们需要弄清以下两个问题&#xff1a; 1、Java如何与k8s做shell交互 2、前端界面如何与Java后台交互 3、多个用户并发访问如何实现 问题1&#xff1a; k8s官方提供了各种语言的KubernetesAPI&#xff0c;对于Ja…

用AI修复郭德纲远古相声;小红书爆款文案Prompt模板;用AI经营一家三明治店;AI将实现80%编程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; B站UP主使用AI修复郭德纲远古相声&#xff0c;10天播放近70万 B站UP主 野老相声-风景-4K修复 使用了AI换脸技术&#xff0c;对郭德纲、…