分布式系统架构设计之分布式事务的解决方案

news2024/11/26 20:25:55

针对以上分布式事务的挑战,现在业界也是有着对应的解决方案的,至于选择哪一种或者组合策略,需要架构师根据自己的实际系统和业务场景来进行决策。

1、两段式提交(2PC)

分布式事务的两段式提交(2PC)是一种解决分布式事务一致性的解决方案。它将分布式事务的提交过程分为两个阶段:准备阶段和提交阶段:

准备阶段

在准备阶段,事务协调者向所有事务参与者发送事务内容,询问是否可以提交事务,事务参与者收到事务内容后,开始执行事务操作,并将 undo 和 redo 信息记入事务日志中,如果参与者执行成功,给协调者回复 yes,表示可以进行事务提交,如果执行失败,给协调者回复 no,表示不可提交。

提交阶段

事务协调者根据参与者的回复,决定是否进行事务提交,如果所有参与者都回复 yes,则进行事务提交,如果存在参与者回复 no,则进行事务回滚。

在两段式提交(2PC)的解决方案中,确实可以保证分布式事务的一致性,可以确保分布式系统中数据的一致性和完整性,而且这种两段式提交的实现方案简单易懂,易于实现和维护。

但是两段式提交(2PC)的开销较大,需要多次网络通信和等待时间,其次可用性相对比较低,如果协调者节点发生故障,可能会导致整个分布式系统的事务处理受到影响。再者就是细节实现的复杂度比较高,因为需要处理各种异常情况和错误恢复机制。

2、三段式提交(3PC)

三段式提交(3PC)是对两段式提交(2PC)的一种改进,目的是为了改进在两段式提交(2PC)中的一些问题。它将分布式事务分为三个阶段:准备阶段、准备提交阶段和提交阶段:

准备阶段

事务协调者向所有事务参与者发送准备阶段的请求,事务参与者收到请求后,开始执行事务操作,并将 undo 和 redo 信息记入事务日志中,如果参与者执行成功,给协调者回复准备就绪状态,如果执行失败,给协调者回复失败信息。

准备提交阶段

事务协调者向所有参与者发送准备提交阶段的请求,参与者收到请求后,检查自己的状态,如果已经准备好,则向协调者回复准备提交状态,如果参与者未准备好,则向协调者回复未准备好信息。

提交阶段

事务协调者根据参与者的回复,决定是否进行事务提交,如果所有参与者都回复准备提交状态,则进行事务提交,如果存在参与者回复未准备好信息,则进行事务回滚。

三段式提交(3PC)能够更好地处理网络故障和节点故障等问题,提高系统的可用性和容错性,也可以更好地保证分布式事务的一致性,减少数据不一致的情况。

但是同样它也需要多次网络通信和等待时间,开销很大。其次同样是需要处理各种异常情况和错误恢复机制,复杂度较高。再者三段式提交可能会引入更多的故障点,比如在准备提交阶段和回滚阶段可能会出现故障或者延迟的问题。

3、TCC 模式(Try-Confirm-Cancel)

TCC 模式是一种在应用层实现的分布式事务解决方案,它将分布式事务分为 Try、Confirm、Cancel 三个阶段:

Try 阶段

事务协调者向所有事务参与者发送 Try 阶段的请求,事务参与者收到请求后,执行业务检查和资源预留等操作,如果业务检查失败或者资源预留失败,事务参与者向事务协调者发送 Cancel 请求,否则向事务协调者发送 Try 阶段的确认请求。

Confirm 阶段

事务协调者收到所有参与者的 Try 阶段确认请求后,向所有参与者发送 Confirm 阶段的请求,事务参与者收到请求后,执行业务确认操作,如果业务确认成功,事务参与者收到请求后,执行业务确认操作,如果业务确认成功,事务参与者向事务协调者发送 Confirm 阶段的确认请求,否则向事务协调者发送 Cancel 请求。

Cancel 阶段

事务协调者收到所有参与者的 Cancel 请求后,向所有参与者发送 Cancel 阶段的请求,事务参与者收到请求后,执行撤销操作,如果撤销成功,事务参与者向事务协调者发送 Cancel 阶段的确认请求,否则向事务协调者发送 Cancel 请求。

TCC 模式能够保证分布式事务的一致性,确保在分布式系统中数据的一致性和完整性。而且简单易懂,易于实现和维护。

但是 TCC 模式需要每个分支事务实现三个操作,预处理 Try、确认 Confirm、撤销 Cancel,增加系统的复杂性。其次,TCC 模式对业务侵入较大,需要业务代码实现 Try、Confirm、Cancel 三个接口,增加了开发难度和维护成本。再者 TCC 模式在 Cancel 阶段可能会重复执行,因此需要满足幂等性要求,增加了系统的复杂性和开发难度。

4、分布式事务框架 Seata

Seata(Simple Extensible Autonomous Transaction) 是一种开源的分布式事务解决方案,用于解决分布式系统中的事务一致性问题

Seata 核心组件
  1. Transaction Coordinator(TC):TC 是 Seata 的核心组件之一,负责协调全局事务的启动、提交、回滚等操作。它负责协调各个参与者的事务操作,并确保全局事务的一致性。
  2. Transaction Manager(TM):TM 是用于管理全局事务的生命周期,负责事务的开始、提交、回滚等操作。TM 和 TC 协同工作,确保全局事务的正确执行。
  3. Resource Manager(RM):RM 负责管理和控制分支事务(本地事务)的执行,每个参与全局事务的服务都有一个 RM,负责将本地事务的执行结果通知给 TC。
Seata 事务处理过程
  1. 全局事务开始(Begin):应用服务通过 TM 发起一个全局事务,TM 请求 TC 生成一个全局事务 ID,并将其分发给各个参与者(RM)。
  2. 分支事务注册(Register):每个参与者(RM)在本地事务开始时向 TC 注册分支事务,将全局事务 ID 和分支事务 ID 关联起来。
  3. 业务逻辑执行:应用服务执行本地事务(业务逻辑),在事务过程中会向 RM 报告分支事务的执行情况。
  4. 全局事务提交或回滚(Commit/Rollback):如果所有分支事务执行成功,TM 通知 TC 提交全局事务,如果有任何分支事务失败,TM 通知 TC 回滚全局事务。
  5. 分支事务提交或回滚:TC 根据 TM 的指令通知各个参与者(RM)提交或回滚本地事务。
Seata 支持的事务模型
  1. AT(ATomic Transaction): 提供类似于传统关系型数据库事务的 ACID 特性,支持本地事务的提交和回滚。
  2. TCC(Try-Confirm-Cancel): 通过三阶段提交实现,可以在不同服务间保障事务一致性。
  3. SAGA: 分布式长事务模型,通过各个阶段的补偿来保障最终一致性。
Seata 优势
  1. 易于集成: Seata 可以与各种框架和中间件(如Spring Cloud、Dubbo、gRPC等)集成,对业务逻辑的侵入性较小。
  2. 高性能: Seata 使用了优化的事务协议,减少了不必要的网络开销,提供了较高的性能。
  3. 可扩展: Seata 提供了插件机制,可以扩展新的事务协议、存储模式等,以满足不同场景的需求。
  4. 开源社区支持: Seata 是由阿里巴巴发起的开源项目,有庞大的社区支持,定期更新和维护。

5、Saga 模式

Saga 模式是一种微服务架构中常见的分布式事务处理模式。它针对分布式长事务的一种解决方案,它将长事务分解为一系列较小的事务,并且每个小事务都有对应的补偿操作。这样,即使在整个事务过程中的某个步骤失败,可以通过执行相应的补偿操作将系统状态回滚到一个合法的状态。Saga 模式通过拆分事务为多个小事务,提高了系统的可扩展性和容错性。

事务拆分
  1. 正向执行:Saga 将事务拆分成多个小事务,每个小事务都有对应的正向执行
  2. 补偿执行:如果在执行中发生错误,将执行相应的补偿操作,将事务状态回滚到之前的合法状态。
局部性和原子性
  1. 局部性:Saga 模式通过将事务拆分成多个小事务,使得每个小事务的影响范围有限,这提高了系统的局部性,降低了锁的粒度,减少了并发冲突。
  2. 原子性:每个小事务是一个原子操作,要么完全执行成功,要么完全回滚,可以确保了在整个事务过程中的原子性。
补偿机制
  1. 补偿操作:每个小事务都有对应的补偿操作,用于回滚该事务的影响。补偿操作要具备幂等性,确保多次执行产生相同的结果。
  2. 补偿事务:如果在正向执行中的某个步骤失败,Saga 模式会根据已执行的正向操作执行相应的补偿事务,将系统状态回滚到一个合法的状态。
协调和状态机
  1. 协调:Saga 模式需要一个协调者来协调各个局部事务的执行,协调者通常是一个独立的服务或组件。
  2. 状态机:使用状态机来管理事务的状态,以及每个小事务的执行情况,状态机记录事务进度,确保在失败时可以正确地执行补偿操作。
可靠消息机制
  1. 消息通知:在每个小事务的正向执行和补偿执行中,使用可靠消息机制通知其他服务或者组件。
  2. 异步执行:通过异步执行正向和补偿操作,提高了系统的性能和并发能力。
容错和重试
  1. 容错机制:对于在执行中发生的错误,Saga 模式提供了容错机制,使得在发生错误时能够执行相应的补偿操作。
  2. 重试策略:通过设计合理的重试策略,可以在发生错误时通过重试来达到一致性。

Saga 模式在微服务架构中被广泛应用,它通过将事务拆分为多个独立的步骤,降低了系统的复杂性,提高了系统的可扩展性。但是,Saga 模式也需要谨慎射击,确保每个步骤的幂等性和补偿操作的正确性,保证系统的一致性。

分布式事务处理是构建可靠、稳定分布式系统的关键组成部分。架构师需要综合考虑数据一致性、事务隔离性、原子性以及性能和可伸缩性等方面的问题。选择合适的分布式事务处理模式取决于具体应用场景和系统需求。在众多的设计选择中,深入理解每种模式的优缺点,并结合实际场景做出明智的选择,将有助于构建高效、可靠的分布式系统。

当然,虽然现在存在多种分布式事务处理方案,但每种方案都有其优缺点。架构师在实际应用中,需要根据具体的场景来选择合适的方案。未来,随着技术的不断发展,分布式事务处理将会更加成熟和高效。同时,随着云计算、大数据等技术的普及,分布式事务处理将会面临更多的挑战和机遇。

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

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

相关文章

机器学习(四) -- 模型评估(1)

系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理(1-3) 机器学习(三) -- 特征工程(1-2) 机器学习(四) -- 模型评估…

阿里云PolarDB数据库不同配置租用价格表

阿里云数据库PolarDB租用价格表,云数据库PolarDB MySQL版2核4GB(通用)、2个节点、60 GB存储空间55元5天,云数据库 PolarDB 分布式版标准版2核16G(通用)57.6元3天,阿里云百科aliyunbaike.com分享…

全国计算机等级考试| 二级Python | 真题及解析(12)

一、选择题 1.在编写python程序时缩进的作用是()。 A.让程序更美观 B.只在for循环中使用 C.只在if语句中使用 D.用来界定代码块 2.已知列表list1=[8,22,34,9,…

【番外】【Airsim in Windows ROS in WSL2-Ubuntu20.04】环境配置大全

【番外】【Airsim in Windows &ROS in WSL2-Ubuntu20.04】环境配置大全 【前言(可省略不看)】1.在windows上面部署好UE4AirSim联合仿真环境2.在windows上面部署wsl2系统以及在wsl2上面部署ubuntu系统3.安装好ubuntu系统之后,目前只能在命…

代码随想录-刷题第四十六天

70. 爬楼梯(进阶) 题目链接:70. 爬楼梯 改为:一步一个台阶,两个台阶,三个台阶,…,直到 m 个台阶。问有多少种不同的方法可以爬到楼顶呢? 思路:本题是一个斐波…

国民技术与stm32 ADC采集

一、国民技术芯片ADC采集配置 /* PA1 ADC1_IN2 默认功能 DMA 通道1由ADC1触发 外部晶振16 系统时钟144M AHB 2分频 HCLK72M HCLK 经APB1 4分频 pclk1 18MHCLK/4 HCLK 经APB2 4分频 pclk2 18MHCLK/4ADCCLK不得超过14M*/ void DMA_ADC_Config(void) {ADC_InitType ADC_In…

Unity报错:InvalidOperationException: Insecure connection not allowed的解决方法

问题描述 在导入Steam VR 插件后报错&#xff1a; InvalidOperationException: Insecure connection not allowed UnityEngine.Networking.UnityWebRequest.SendWebRequest () (at <4139bb31c03640e7b650db6ec39d5754>:0) UnityEngine.WWW..ctor (System.String url) (…

大模型上下文长度的超强扩展:从LongLora到LongQLora

前言 本文一开始是《七月论文审稿GPT第2版&#xff1a;从Meta Nougat、GPT4审稿到Mistral、LongLora Llama》中4.3节的内容&#xff0c;但考虑到 一方面&#xff0c;LongLora的实用性较高二方面&#xff0c;为了把LongLora和LongQLora更好的写清楚&#xff0c;而不至于受篇幅…

[数据结构 C++] AVL树的模拟实现

文章目录 1、AVL树1.1 AVL树的概念 2、AVL树节点的定义3、AVL树的插入和旋转3.1 左单旋左旋代码实现 3.2 右单旋右旋代码实现 3.3 右左双旋右左双旋的代码实现 3.4 左右双旋左右双旋的代码实现 3.5 insert接口实现 4、判断是否为AVL树判断AVL树的代码实现 5、AVL树的性能 问题引…

Maven Resources Compiler: Maven project configuration required for module

Maven Resources Compiler: Maven project configuration required for module ‘cc-pdf’ isn’t available. Compilation of Maven projects is supported only if external build is started from an IDE. 报错原因是&#xff0c;我在git建立一个新空仓库&#xff0c;然后把…

C++线程池的原理(画图)及简单实现+例子(加深理解)

1.为什么线程池会出现&#xff0c;解决什么问题&#xff1f; C线程池&#xff08;ThreadPool&#xff09;的出现主要是为了解决以下几个问题&#xff1a; 1.性能&#xff1a;创建和销毁线程都是相对昂贵的操作&#xff0c;特别是在高并发场景下&#xff0c;频繁地创建和销毁线…

Linux下误删除后的恢复操作测试之extundelete工具使用

一、工具介绍 extundelete命令的功能可用于系统删除文件的恢复。在使用前&#xff0c;需要先将要恢复的分区卸载&#xff0c;以防数据被意外覆盖。 语法格式&#xff1a;extundelete [参数] 文件或目录名 常用参数&#xff1a; --after 只恢复指定时间后被删除的文件 --bef…

Linux学习(9)——RAID与服务器的常见故障

目录 一、服务器常见故障 1、系统不停重启进入不了系统 2、卡在开机界面右下角有fA B2 H8 3、系统安装不上 4、如何进入服务器的bios 5、一般进入阵列卡的快捷键 6.网络不通 7.硬盘不识别 二、RAID相关知识 1、RAID的概念 2、RAID功能实现 3、RAID实现的方式 三、…

机器学习笔记 - 偏最小二乘回归 (PLSR)

一、偏最小二乘回归:简介 PLS 方法构成了一个非常大的方法族。虽然回归方法可能是最流行的 PLS 技术,但它绝不是唯一的一种。即使在 PLSR 中,也有多种不同的算法可以获得解决方案。PLS 回归主要由斯堪的纳维亚化学计量学家 Svante Wold 和 Harald Martens 在 20 世纪 80 年代…

海外服务器2核2G/4G/8G和4核8G配置16M公网带宽优惠价格表

腾讯云海外服务器租用优惠价格表&#xff0c;2核2G10M带宽、2核4G12M、2核8G14M、4核8G16M配置可选&#xff0c;可以选择Linux操作系统或Linux系统&#xff0c;相比较Linux服务器价格要更优惠一些&#xff0c;腾讯云服务器网txyfwq.com分享腾讯云国外服务器租用配置报价&#x…

ByteTrack算法流程的简单示例

ByteTrack ByteTrack算法是将t帧检测出来的检测框集合 D t {\mathcal{D}_{t}} Dt​ 和t-1帧预测轨迹集合 T ~ t − 1 {\tilde{T}_{t-1}} T~t−1​ 进行匹配关联得到t帧的轨迹集合 T t {T_{t}} Tt​。 首先使用检测器检测t帧的图像得到检测框集合 D t {\mathcal{D}_{t}} …

手机技巧:分享10个vivo手机实用小技巧技巧,值得收藏

目录 1. 快速切换应用 2、智能助手Jovi 3. 轻按唤醒屏幕 4. 快速启动相机 5. 分屏功能 6. 手势操作 7. 一键清理 8.忘记密码 9.玩游戏耗电快 10.手机丢失后该怎么办 1. 快速切换应用 向右或向左滑动底部的虚拟按键即可。 2、智能助手Jovi vivo手机自带智能助手Jovi…

【Java EE初阶八】多线程案例(计时器模型)

1. java标准库的计时器 1.1 关于计时器 计时器类似闹钟&#xff0c;有定时的功能&#xff0c;其主要是到时间就会执行某一操作&#xff0c;即可以指定时间&#xff0c;去执行某一逻辑&#xff08;某一代码&#xff09;。 1.2 计时器的简单介绍 在java标准库中&#xff0c;提供…

CMake入门教程【核心篇】添加应用程序(add_executable)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 概述2. 使用方法2…

【计算机视觉】常用图像数据集

图像数据集 模型需要好的数据才能训练出结果&#xff0c;本文总结了机器学习图像方面常用数据集。 MNIST 机器学习入门的标准数据集&#xff08;Hello World!&#xff09;&#xff0c;10个类别&#xff0c;0-9 手写数字。包含了60,000 张 28x28 的二值训练图像&#xff0c;10…