Seata 四种模式对比总结

一、前言

通过以下系列章节:

docker-compose 实现Seata Server高可用部署 | Spring Cloud 51

Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52

Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53

Seata XA 模式理论学习、使用及注意事项 | Spring Cloud54

Seata TCC 模式理论学习、生产级使用示例搭建及注意事项 | Spring Cloud55

Seata TCC 模式下解决幂等、悬挂、空回滚问题 | Spring Cloud56

Seata Saga 模式理论学习、生产级使用示例搭建及注意事项(一) | Spring Cloud57

Seata Saga 模式理论学习、生产级使用示例搭建及注意事项(二) | Spring Cloud58

我们对Seata及其ATXATCCSaga事务模式的理论、使用有了深入的了解,今天分布式基础理论和Seata 的四种模式进行对比总结。

二、事务

事务简单理解就是更新数据库中各种数据的一个程序执行单元(unit),一个事务严格上必须具备原子性、一致性、隔离性和持久性,简称 ACID

  • 原子性(Atomicity):一个事务内的所有操作要么都执行,要么都不执行。

  • 一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,即数据库处理前后结果应与根据业务规则执行后的结果保持一致。

  • 隔离性(Isolation):指的是多个事务并发执行的时候不会互相干扰。

  • 持久性(Durability):指的是一个事务完成了之后数据就被永远保存下来,之后的其他操作或故障都不会对事务的结果产生影响。

三、分布式事务

分布式事务顾名思义就是要在分布式系统中实现事务,它由多个本地事务组合而成。

使用分布式事务的根源:高并发,当一台服务器忙不过来,需要增加多服务器来帮忙响应请求。这时候就会出现一个问题,就是数据只有一份,如何保证分布式环境下,每个事物执行过后,数据都是正确的,比如库存服务,订单服务,支付服务,他们分别部署,这个时候做一次购买完成就需要这三个服务都需要完成相应的操作,要么一起失败,要么一起成功。这就引出了分布式事务的解决问题。

四、CAP理论

在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance),这三个要素最多只能同时实现两点,不可能三者兼顾。

  • 一致性(Consistency):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)

  • 可用性(Availability):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)

  • 分区容忍性(Partition tolerance):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择

在这里插入图片描述

图中重叠的部分就是在分布式环境下,必须做出的取舍:要么CP,要么AP,要么CA,但是不存在CAP

CP:牺牲可用性。复制同步的协议一般使用严格的法定数协议 (PaxosRaftZAB)或者2PC协议。CP类型的系统有MongoDBHBaseZookeeperRedisElasticSearch等。

AP:牺牲一致性。复制同步的协议一般使用非严格的法定数协议。AP类型的系统有 Couch DBCassandraAmazon Dynamo等。

CA:抛开RDBMSOracleMySQL不谈,分布式系统中宣称是CA系统的有谷歌的Spanner 和阿里的OceanBase

问:为什么分布式系统中无法同时保证一致性和可用性?

答:首先一个前提,对于分布式系统而言,分区容错性是一个最基本的要求,因此基本上我们在设计分布式系统的时候只能从一致性(C)和可用性(A)之间进行取舍。

如果保证了一致性(C):对于节点N1N2,当往N1里写数据时,N2上的操作必须被暂停,只有当N1同步数据到N2时才能对N2进行读写请求,在N2被暂停操作期间客户端提交的请求会收到失败或超时。显然,这与可用性是相悖的。

如果保证了可用性(A):那就不能暂停N2的读写操作,但同时N1在写数据的话,这就违背了一致性的要求。

CAPACID中的AC是完全不一样的:

  • C的区别:

    • ACID一致性是有关数据库规则,数据库总是从一个一致性的状态转换到另外一个一致性的状态;

    • CAP的一致性是分布式多服务器之间复制数据令这些服务器拥有同样的数据,由于网速限制,这种复制在不同的服务器上所消耗的时间是不固定的,集群通过组织客户端查看不同节点上还未同步的数据维持逻辑视图,这是一种分布式领域的一致性概念;

  • A的区别:

    • ACID中的A指的是原子性(Atomicity),是指事务被视为一个不可分割的最小工作单元,事务中的所有操作要么全部提交成功,要么全部失败回滚;

    • CAP中的A指的是可用性(Availability),是指集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求;

五、BASE理论

BASEBasically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)的缩写。

在分布式系统中,CAP理论是指导思维,而BASE理论是CAP理论中AP的延伸,是对 CAP 中的一致性和可用性进行一个权衡的结果,核心思想是:即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。

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

  • 柔性状态(Soft state):指允许系统存在中间状态,并认为该中间状态不会影响系统整体可用性。比如,允许不同节点间副本同步的延时就是柔性状态的体现。

  • 最终一致性(Eventually consistent):指系统中的所有副本经过一定时间后,最终能够达到一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

六、事务的一致性

  • 强一致性:系统中的某个数据被成功更新后,后续的访问都能看到更新后的值。

  • 弱一致性:系统中的某个数据被更新后,后续的访问可能得到更新后的值,也可能是更改前的值。

  • 最终一致性:系统中的某个数据被更新,经过一段时间后,最终所有的访问都是更新的值。

刚性事务:遵循ACID原则,强一致性。

柔性事务:遵循BASE理论,最终一致性。

七、Seata

Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务,为用户打造一站式的分布式解决方案。

官网地址:http://seata.io/,其中的文档、播客中提供了大量的使用说明、源码分析。

7.1 架构

Seata事务管理中有三个重要的角色:

  • TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。

  • TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。

  • RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚

Seata基于上述架构提供了四种不同的分布式事务解决方案:

  • XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入

  • TCC模式:最终一致的分阶段事务模式,有业务侵入

  • AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式

  • SAGA模式:长事务模式,有业务侵入

7.2 XA 模式

7.2.1 整体机制

Seata 定义的分布式事务框架内,利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种 事务模式

在这里插入图片描述

RM一阶段的工作:

① 注册分支事务到TC

② 执行分支业务sql但不提交

③ 报告执行状态到TC

TC二阶段的工作:

  • TC检测各分支事务执行状态

    • a.如果都成功,通知所有RM提交事务
    • b.如果有失败,通知所有RM回滚事务

RM二阶段的工作:

  • 接收TC指令,提交或回滚事务

7.2.2 优缺点

  • XA模式的优点是什么?

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

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

  • XA模式的缺点是什么?

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

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

7.3 AT 模式

7.3.1 整体机制

AT模式是两阶段提交协议的演变(最终一致的分阶段事务模式)。弥补了XA模式中资源锁定周期过长的缺陷。

在这里插入图片描述
阶段一RM的工作:

  • 注册分支事务

  • 记录undo-log(数据快照)

  • 执行业务sql并提交

  • 报告事务状态

阶段二提交时RM的工作:

  • 删除undo-log即可

阶段二回滚时RM的工作:

  • 根据undo-log恢复数据到更新前

7.3.2 AT与XA的区别

  • XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。

  • XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。

  • XA模式强一致;AT模式最终一致。

7.4 TCC 模式

7.4.1 整体机制

整体是 两阶段提交 的模型。全局事务是由若干分支事务组成的,分支事务要满足 两阶段提交 的模型要求,即需要每个分支事务都具备自己的:

  • 一阶段 Try 行为
  • 二阶段 ConfirmCancel行为

在这里插入图片描述

上面这个流程中,一共涉及到了三个方法,TryConfirm 以及 Cancel,这三个方法都完全是用户自定义的方法,都是需要我们自己来实现的。相较于 AT 事务模式 TCC 这种模式其实是不依赖于底层数据库的事务支持的。

7.4.2 优缺点

TCC模式的每个阶段是做什么的?

  • Try:资源检查和预留

  • Confirm:业务执行和提交

  • Cancel:预留资源的释放

TCC的优点是什么?

  • 一阶段完成直接提交事务,释放数据库资源,性能好

  • 相比AT模型,无需生成快照,无需使用全局锁,性能最强

  • 不依赖数据库事务,而是依赖补偿操作,可以用于非事务型数据库

TCC的缺点是什么?

  • 有代码侵入,需要人为编写try、Confirm和Cancel接口,太麻烦

  • 软状态,事务是最终一致

  • 需要考虑ConfirmCancel的失败情况,做好幂等处理

7.5 Saga 模式

7.5.1 整体机制

Saga模式是Seata提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。

在这里插入图片描述
理论基础:Hector & Kenneth 发表论⽂ Sagas (1987)

7.5.2 优缺点

  • 适用场景:
    • 业务流程长、业务流程多
    • 参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口
  • 优势:
    • 一阶段提交本地事务,无锁,高性能
    • 事件驱动架构,参与者可异步执行,高吞吐
    • 补偿服务易于实现
  • 缺点:
    • 不保证隔离性

八、Seata 四种模式对比

-XAATTCCSAGA
一致性强一致弱一致弱一致最终一致
隔离性完全隔离基于全局锁隔离基于资源预留隔离无隔离
代码侵入有,要编写三个接口有,要编写状态机和补偿业务
性能非常好非常好
场景对一致性、隔离性有高要求的业务基于关系型数据库的大多数分布式事务场景都可以对性能要求较高的事务、对非关系型数据参与的事务业务流程长、业务流程多,参与者包含其他公司或遗留系统服务,无法提供TCC模式要求的三个接口

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day_56-57kMeans 聚类

目录 Day_56-57 k-Means 聚类 一. 基本概念介绍 二. 具体过程 三. 代码实现与解释 1. 导入数据与数据初始化 2. 核心代码 3. 后续信息的补充 4. 距离计算和随机排列 四. 后续的数据分析 五. 运行结果 Day_56-57 k-Means 聚类 一. 基本概念介绍 同我上一篇博客的介绍&…

【Linux】打开Linux大门,踏入Linux世界(环境搭建再加一群Linux基本指令就OK啦~)

🧑‍🎓个人主页:简 料 🏆所属专栏:Linux系统编程与网络编程 🏆个人社区:越努力越幸运社区 🏆简 介:简料简料,简单有料~在校大学生一枚&#x…

MySQL表的约束

目录 前言 1.什么是约束 2.空属性 3.默认值 4.列描述 5.zerofill 6.主键 7.自增长 8.唯一键 9.外键 总结 前言 hello,各位小伙伴大家好,本章内容为大家介绍关于MySQL约束的相关内容,关于约束这个概念,如果是第一次接触可…

redis---基础(部署及常用命令)

目录 前言一、关系型数据库与非关系型数据库1. 关系型数据库2. 非关系型数据库3. 关系型数据库和非关系型数据库区别4. 非关系型数据库产生背景小结: 二、Redis简介1. 单进程快速的原因:2.epoll 机制优势: 三、Redis 具有以下几个优点四、red…

机器学习之LDA算法

目录 LDA算法 LDA目标 LDA原理推导 LDA除法模型 LDA减法模型 LDA除法正则模型 LDA减法正则模型 证明:StSwSb LDA算法流程 LDA优点 LDA缺点 基于LDA的人脸识别 LDA算法 线性判别分析(linear discriminant analysis,LDA&#xff0…

计算机网络——物理层

物理层 物理层是计算机网络体系结构中的底层层级,负责处理计算机与物理传输媒介之间的接口和通信细节。它主要关注如何在物理媒介上传输原始比特流,并确保数据能够可靠地从发送方传输到接收方。 物理层的主要任务包括: 传输介质&#xff1a…

2023年第三届陕西省大学生网络安全技能大赛--本科高校组 Reverse题解

文章目录 一. 我的upx -d怎么坏了1. 查看节区信息2. 动态调试脱壳3.输出迷宫图4.走迷宫 二. babypython1.字节码简单分析2. gpt分析3. 程序逻辑4.解题脚本 三. BadCoffee1. 相关文章2.解混淆3.解题脚本 四. Web&Assembly(暂时没复现出来,提供一些相关文章)总结 这次比赛做出…

Qt的基本知识与应用

一、C梳理 1. 面向对象的三大特性 1.1 封装 把类的一些属性和细节隐藏(private、protected),根据读写需要重新开放外部调用接口(public、protected)。 1.2 继承 在已有的类的基础上创建一个新的类,新的类拥…

【网络原理】数据链路层 和 应用层 重点协议

✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 目 录 🍀一. 以太网协议(数据链路层)🌻二. DNS (应用层)🌿三. 网络原理知识面试总结 &#x1f34…

40 # npm 的使用

npm 3n: nrm:node 中源管理工具nvm:node 中的版本管理工具npm:node 的包管理器,管理的都是 node 的模块 第三方模块 分两种: 全局模块:只能在命令行中使用,任何路径都可以本地模…

Vue Router activated deactivated 路由守卫

6.12.activated deactivated activated和deactivated是路由组件所独有的两个钩子&#xff0c;用于捕获路由组件的激活状态具体使用 activated路由组件被激活时触发deactivated路由组件失活时触发 src/pages/News.vue <template><ul><li :style"{opacity}…

Spring Boot定时任务

目录 1.概述 2.Spring Boot定时任务 2.1.快速使用 2.2.cron表达式 3.业务示例 3.1.业务描述 3.2.业务实现 4.实现原理 5.自定义线程池 1.概述 在某些业务场景中&#xff0c;需要定时执行一些任务&#xff0c;有可能是定时统计然后生成报表&#xff0c;有可能是定时发…