分布式事务的解决方案(欢迎讨论~)

目录

背景

CAP定理

BASE理论

 场景重现​编辑

分布式事务常见的解决分案

1.二段提交

2.三段提交

3.TCC模式 

4.分布式补偿事务(Saga) 

 5.Seata分布式框架-XA模式

6.Seata分布式框架-AT模式

XA AT TCC SAGA 的对比


背景

首先必须介绍一下分布式中至关重要的两个理论:CAP 理论和 BASE 理论

我们抽蚕拨丝一步一步来~

CAP定理

1998年, 加州大学的计算机科学家 Eric Brewer提出, 分布式系统有三个指标:

· Consistency (一致性)

· Availability (可用性)

· Partition tolerance (分区容错性)

Eric Brewer 说, 分布式系统无法同时满足这三个指标

这个结论就叫做CAP 定理。

BASE理论

BASE理论是对CAP的一种解决思路, 包含三个思想:

 1.Basically Available (基本可用) : 分布式系统在出现故障时, 允许损失部分可用性, 即保证核心可用。

 2.SoftState (软状态):在一定时间内,允许出现中间状态, 比如临时的不一致状态。

 3.Eventually Consistent (最终一致性) : 虽然无法保证强一致性, 但是在软状态结束后, 最终达到数据一致。 

而分布式事务最大的问题是各个子事务的一致性问题, 因此可以借鉴CAP定理和BASE理论:

AP模式: 各子事务分别执行和提交, 允许出现结果不一致, 然后采用弥补措施恢复数据即可, 实现最终一致。

CP模式: 各个子事务执行后互相等待, 同时提交, 同时回滚, 达成强一致。但事务等待过程中, 处于弱可用状态。

 场景重现

分布式事务常见的解决分案

分布式事务是在分布式系统中,跨越多个计算机节点或数据存储系统进行的事务,在这种环境下保证事务的ACID(原子性、一致性、隔离性、持久性)属性是一大挑战。

1.二段提交

二阶段提交协议(Two-phase commit protocol),简称 2PC。两阶段提交是一种强一致性事务协议,它分为准备阶段和提交阶段。

在准备阶段,协调者节点询问所有参与者是否准备好提交事务,如果所有参与者都答应准备好了,那么在提交阶段,协调者会通知所有参与者提交事务。

如果有任何一个参与者在准备阶段没有准备好,那么协调者会通知所有参与者回滚事务。

有熟悉 MySQL 的同学可能马上想到了,MySQL 的事务提交就是通过几种日志来实现二阶段提交的。

在准备阶段,协调者节点询问所有参与者是否准备好提交事务,如果所有参与者都答应准备好了,那么在提交阶段,协调者会通知所有参与者提交事务。

如果有任何一个参与者在准备阶段没有准备好,那么协调者会通知所有参与者回滚事务。

有熟悉 MySQL 的同学可能马上想到了,MySQL 的事务提交就是通过几种日志来实现二阶段提交的。

1.1优点

  1. 原子性保证:2PC 协议可以保证所有参与者要么全部提交成功,要么全部失败回滚,从而实现跨多个分布式节点的事务的原子性。

  2. 简单直观:2PC 的设计思路简单,逻辑清晰,容易理解,这使得它在很多传统的数据库和分布式系统中得到了广泛的应用,比如 MySQL 从 5.5 版本开始支持。

1.2缺点

  1. 同步阻塞:在 2PC 的第一阶段,所有参与者在响应协调者的准备请求后,必须等待最终的提交或回滚指令。这期间,所有参与者都处于阻塞状态,无法进行其他操作,导致资源锁定时间较长,在高并发场景下很明显不太适用。

  2. 单点故障:如果协调者在第二阶段崩溃,参与者可能会无限期地等待指令,因为它们不知道应该提交还是回滚。这使得整个系统容易受到单点故障的影响。

  3. 单点故障:如果协调者在第二阶段崩溃,参与者可能会无限期地等待指令,因为它们不知道应该提交还是回滚。这使得整个系统容易受到单点故障的影响。

  4. 单点故障:如果协调者在第二阶段崩溃,参与者可能会无限期地等待指令,因为它们不知道应该提交还是回滚。这使得整个系统容易受到单点故障的影响。

2.三段提交

三阶段提交协议(Three-phase commit protocol),简称 3PC。三阶段提交(3PC)是两阶段提交(2PC)的改进版本,它旨在减少在协调者和参与者之间的阻塞时间,同时增加系统在某些故障情况下的容错能力,以下是 3PC 的三个阶段:

CanCommit 阶段

  • 协调者行动: 发送 CanCommit 请求到所有参与者,并等待回应。

  • 协调者行动: 发送 CanCommit 请求到所有参与者,并等待回应。

PreCommit 阶段

  • 协调者行动: 如果所有参与者回答 Yes,协调者发送 PreCommit 请求给所有参与者,并进入 Prepared 阶段;如果有任何参与者回答 No,或者等待超时,协调者发送 abort 请求。

  • 协调者行动: 如果所有参与者回答 Yes,协调者发送 PreCommit 请求给所有参与者,并进入 Prepared 阶段;如果有任何参与者回答 No,或者等待超时,协调者发送 abort 请求。

DoCommit 阶段

协调者行动: 一旦协调者收到所有参与者的 ACK,它会进入 DoCommit 阶段,发送 commit 请求给所有参与者

协调者行动: 一旦协调者收到所有参与者的 ACK,它会进入 DoCommit 阶段,发送 commit 请求给所有参与者

与 2PC 相比,3PC 在 PreCommit 阶段引入了超时机制,允许参与者在没有接收到协调者的最终指令时自行决定中止事务,这减少了协调者成为单点故障的可能性。

1.2实际业务场景

3PC通常用于需要较高可靠性的分布式系统中,尤其是在那些不能接受长时间锁定资源的场景。例如:

1.分布式数据库系统:分布式数据库可能使用 3PC 来确保跨多个数据中心的事务一致性。例如,一个全球性的银行可能需要在不同国家的分支机构之间处理账户转账,这时3PC可以减少在网络延迟或某个分支机构失去响应时的影响。

2.电信网络:在电信运营商的计费系统中,可能会使用 3PC 来同步跨多个服务点的账单信息,这些系统通常要求高可用性和快速响应,因此不能长时间阻塞。

3.大型分布式系统:对于需要跨多个服务和组件协调工作的大型分布式系统,比如云计算平台,3PC可以在保持事务一致性的同时,减少参与者等待协调者指令的时间

3.TCC模式 

TCC(Try-Confirm-Cancel)是一种应用层的分布式事务解决方案,它将事务分为三个步骤:尝试(Try)、确认(Confirm)和取消(Cancel):

  • 在 Try 阶段,会预留必要的业务资源;

  • 在 Confirm 阶段,如果所有相关的业务操作都成功了,则正式执行业务操作;

  • 如果有操作失败,则在 Cancel 阶段执行补偿操作,回滚之前的预留资源。

 

假设我们买一张从深圳到北京的火车票,票价为 360 元,TCC 分为这三个步骤:

Try:检查钱包的钱是否大于等于 360,并锁住资源(360 元和这张车票);

Cancel:如果有一个资源锁定失败,则进行 cancel 释放资源,这个过程中无论 cancel 还是其它操作失败都进行重试 cancel,所以需要保证幂等性;

Confirm:如果资源锁定都成功,则进行 confirm,资源交换,这个过程中无论 confirm 还是其它操作失败都进行重试 confirm,都需保证幂等性。

TCC 的出现解决二阶段提交的几个缺点

  1. 单点故障问题:引入了多个业务活动管理器,集群下高可用;

  2. 数据不一致问题:引入超时补偿机制,由业务活动管理器来控制一致性;

  3. 同步阻塞问题:引入超时补偿机制,不会锁定同步,将资源转换为业务逻辑形式,粒度更小

TCC模式的每个阶段是做什么的?
Try: 资源检查和预留
Confirm: 业务执行和提交
Cancel: 预留资源的释放

TCC的优点是什么?
· 一阶段完成直接提交事务, 释放数据库资源, 性能好
· 相比AT模型, 无需生成快照, 无需使用全局锁, 性能最强
· 不依赖数据库事务, 而是依赖补偿操作, 可以用于非事务型数据库TCC的缺点是什么?
有代码侵入, 需要人为编写 try、 Confirm和 Cancel接口, 太麻烦
软状态, 事务是最终一致
需要考虑 Confirm和 Cancel的失败情况, 做好幂等处理。

4.分布式补偿事务(Saga) 

Saga 是一种长事务的解决方案,它将一个大的分布式事务拆分成多个较小的本地事务,这些本地事务通过异步消息传递串联起来。

每个本地事务执行成功后,会发送消息触发下一个事务的执行。如果某个本地事务失败,Saga 会执行一系列补偿操作(回滚之前的操作)来保持数据的一致性。

假设有一个旅游网站,用户可以通过它预订机票、酒店和租车服务。每个预订步骤都可以视为一个 Saga 中的小事务:

用户预订机票。

用户预订酒店。

用户预订租车服务。

如果用户成功完成了所有预订步骤,那么整个旅行预订就完成了。但如果在预订租车服务时失败了,那么 Saga 会开始执行补偿操作:

取消酒店预订。

取消机票预订。

通过这种方式,Saga 确保了用户不会因为部分服务预订失败而损失金钱或留下未处理的预订。

1.4优点
灵活性:Saga 允许每个小事务独立管理,提高了系统的灵活性。

减少资源锁定:由于 Saga 不需要在事务执行过程中持续占用资源,因此可以减少长时间的资源锁定,提高系统的并发能力。

容错性:Saga 通过定义补偿操作来处理失败,增强了系统的容错能力。

适用于微服务架构:在微服务架构中,Saga 可以跨服务边界管理事务,每个服务独立处理自己的事务和补偿逻辑。

1.4.2.缺点
复杂性:实现 Saga 需要定义每个小事务的补偿操作,这可能会增加系统的复杂性。

数据一致性:Saga 不能提供 2PC 那样的即时一致性保证,它只能保证最终一致性,这在某些业务场景中可能是不够的。

补偿操作的难度:在某些情况下,补偿操作可能很难实现,尤其是当事务有副作用时(比如发送了一个不可撤销的通知)。

测试和调试:由于 Saga 涉及多个服务和补偿逻辑,测试和调试可能会更加困难。

在选择使用 Saga 模式时,需要仔细考虑业务场景是否适合最终一致性,以及是否能够有效地实现和管理补偿逻辑。对于那些需要高度一致性保证的场景,可能需要考虑其他事务管理机制。、

 5.Seata分布式框架-XA模式

 

XA模式的优点是什么?

· 事务的强一致性, 满足ACID原则。

·  常用数据库都支持, 实现简单, 并且没有代码侵入

XA模式的缺点是什么?

因为一阶段需要锁定数据库资源, 等待二阶段结束才释放, 性能较差

依赖关系型数据库实现事务

6.Seata分布式框架-AT模式

简述AT模式与XA模式最大的区别是什么?
·  XA模式一阶段不提交事务, 锁定资源; AT模式一阶段直接提交, 不锁定资源。
 · XA模式依赖数据库机制实现回滚; AT模式利用数据快照实现数据回滚。
·  XA模式强一致; AT模式最终一致

AT模式的优点:
· 一阶段完成直接提交事务, 释放数据库资源, 性能比较好
· 利用全局锁实现读写隔离
· 没有代码侵入, 框架自动完成回滚和提交
AT模式的缺点:
· 两阶段之间属于软状态, 属于最终一致
· 框架的快照功能会影响性能, 但比XA模式要好很多

XA AT TCC SAGA 的对比

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汽车IVI中控开发入门及进阶(43):NanoVG

NanoVG:基于OpenGL的轻量级抗锯齿2D矢量绘图库 NanoVG是一个跨平台、基于OpenGL的矢量图形渲染库。它非常轻量级,用C语言实现,代码不到5000行,非常精简地实现了一套HTML5 Canvas API,做为一个实用而有趣的工具集,用来构建可伸缩的用户界面和可视化效果。NanoVG-Library为…

从0到1实现一个RS蓝图系统-概念提出技术栈选型

请不要自我设限,真正好的人生态度,是现在就做,不等、不靠、不懒惰。 ——小野《改变力》 一、什么是蓝图? 蓝图(BluePrint) 是Epic Games 针对虚幻4引擎开发的可视化脚本语言。当你使用蓝图的时候,其实就是在编写代码…

【C++ 类和对象 基础篇】—— 抽象思维的巅峰舞者,演绎代码的深邃华尔兹

C学习笔记: C 进阶之路__Zwy的博客-CSDN博客 各位于晏,亦菲们,请点赞关注! 我的个人主页: _Zwy-CSDN博客 目录 1、类 1.1、类的定义 1.2、访问限定符 1.2.1、public 1.2.2、private 1.2.3、protected 1.3、…

(高可用版本)Kubeadm+Containerd+keepalived部署高可用k8s(v1.28.2)集群

KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集群 一.环境准备,二.容器运行时Containerd安装请参照前文。KubeadmContainerd部署k8s(v1.28.2)集群(非高可用版)-CSDN博客 文章目录 KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集…

联合目标检测与图像分类提升数据不平衡场景下的准确率

联合目标检测与图像分类提升数据不平衡场景下的准确率 在一些数据不平衡的场景下,使用单一的目标检测模型很难达到99%的准确率。为了优化这一问题,适当将其拆解为目标检测模型和图像分类模型的组合,可以更有效地控制最终效果,尤其…

C++之红黑树模拟实现

目录 红黑树的概念 红黑树的性质 红黑树的查找效率 红黑树的实现 红黑树的定义 红黑树节点的插入 红黑树的平衡调整 判断红黑树是否平衡 红黑树整体代码 测试代码 上期我们学习了AVL树的模拟实现,在此基础上,我们本期将学习另一个数据结构-…

机器学习常用术语

目录 概要 机器学习常用术语 1、模型 2、数据集 3、样本与特征 4、向量 5、矩阵 6、假设函数与损失函数 7、拟合、过拟合与欠拟合 8、激活函数(Activation Function) 9、反向传播(Backpropagation) 10、基线(Baseline) 11、批量(Batch) 12、批量大小(Batch Size)…

nest 学习3

学习小册(nest通关秘籍) 邮箱验证码登陆 流程图: 邮箱作为key,生成随机验证码,然后放到redis中。调用邮箱api发送邮箱。 前端获取到code后,将验证码输入传给后端,后端根据邮箱取出redis数据,比对验证码&…

原点安全再次入选信通院 2024 大数据“星河”案例

近日,中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)共同组织开展的 2024 大数据“星河(Galaxy)”案例征集活动结果正式公布。由工银瑞信基金管理有限公司、北京原点数安科技有限公司联…

RabbitMQ 的7种工作模式

RabbitMQ 共提供了7种⼯作模式,进⾏消息传递,. 官⽅⽂档:RabbitMQ Tutorials | RabbitMQ 1.Simple(简单模式) P:⽣产者,也就是要发送消息的程序 C:消费者,消息的接收者 Queue:消息队列,图中⻩⾊背景部分.类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从其中取出消息…

Restaurants WebAPI(四)——Identity

文章目录 项目地址一、Authentication(身份认证)1.1 配置环境(解决类库包无法引用)1.2 使用Authentication控制Controller的访问1.3 获取User的Context1.3.1 在Application下创建User文件夹1. 创建User.cs record类封装角色信息2. 创建UserContext.cs提供…

010 Qt_输入类控件(LineEdit、TextEdit、ComboBox、SpinBox、DateTimeEdit、Dial、Slider)

文章目录 前言一、QLineEdit1.简介2.常见属性及说明3.重要信号及说明4.示例一:用户登录界面5.示例二:验证两次输入的密码是否一致显示密码 二、TextEdit1.简介2.常见属性及说明3.重要信号及说明4.示例一:获取多行输入框的内容5.示例二&#x…

Vue3:uv-upload图片上传

效果图&#xff1a; 参考文档&#xff1a; Upload 上传 | 我的资料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生态框架 (uvui.cn) 代码&#xff1a; <view class"greenBtn_zw2" click"handleAddGroup">添加班级群</vie…

通过Docker Compose来实现项目可以指定读取不同环境的yml包

通过Docker Compose来实现项目可以指定读取不同环境的yml包 1. 配置文件2. 启动命令 切换不同环境注意挂载的文件权限要777 1. 配置文件 version: 3.8 services:docker-test:image: openjdk:8-jdk-alpineports:- "${APP_PORT}:${CONTAINER_PORT}"volumes:- "${J…

华为实训课笔记 2024 1223-1224

华为实训 12/2312/24 12/23 [Huawei]stp enable --开启STP display stp brief --查询STP MSTID Port Role STP State Protection 实例ID 端口 端口角色 端口状态 是否开启保护[Huawei]display stp vlan xxxx --查询制定vlan的生成树计算结…

GitCode 光引计划投稿 | GoIoT:开源分布式物联网开发平台

GoIoT 是基于Gin 的开源分布式物联网&#xff08;IoT&#xff09;开发平台&#xff0c;用于快速开发&#xff0c;部署物联设备接入项目&#xff0c;是一套涵盖数据生产、数据使用和数据展示的解决方案。 GoIoT 开发平台&#xff0c;它是一个企业级物联网平台解决方案&#xff…

EasyGBS国标GB28181公网平台P2P远程访问故障诊断:云端服务端排查指南

随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。EasyGBS平台&#xff0c;作为基于国标GB28181协议的视频流媒体平台&#xff0c;为用户提供了强大的视频监控直播功能。然而&#xff0c;在实际应用中&#xff0c;P2P远程访问可…

Vnlhun靶场Log4j2漏洞

相关概念 log4j2是Apache的⼀个java日志框架&#xff0c;我们借助它进行日志相关操作管理&#xff0c;然而在2021年末log4j2爆出了远程代码执行漏洞&#xff0c;属于严重等级的漏洞 漏洞原理 简单说就是当你使⽤log4j2中提供的⽅法去输出⽇志信息时&#xff0c;⽐如说最常⻅…

千兆网中的gmii与rgmii

物理链路上是千兆网。1 Gbps1000 Mb/s1000/8 MB/s125 MB/s&#xff0c;这是和你的测试设备相连的1 Gbps物理带宽下的极速。关键点是1 B&#xff08;byte&#xff09;8 b&#xff08;bit&#xff09;。实际下载速度还取决于下载源的限制、出口的物理链路和运营商的限制。

2024-12-24 NO1. XR Interaction ToolKit 环境配置

文章目录 1 软件配置2 安装 XRToolKit3 配置 OpenXR4 安装示例场景5 运行测试 1 软件配置 Unity 版本&#xff1a;Unity6000.0.26 ​ 2 安装 XRToolKit 创建新项目&#xff08;URP 3D&#xff09;&#xff0c;点击进入 Asset Store。 进入“Unity Registry”页签&#xff0…