文章目录

  • 1.背景
  • 2.分布式事务规范
    • 2.1.分布式事务相关概念
    • 2.2. 分布式事务实现规范
      • 2.2.1. XA
    • 2.2.2. 柔性事务的最终一致性
  • 3.分布式事务规范
    • 3.1. 系统组成
    • 3.2.工作模式
    • 3.2.1. AT(Auto Transaction)
    • 3.2.2. TCC
    • 3.2.3. XA模式
    • 3.3. Seata 各模式对比
  • 4.AT 模式核心实现
    • 4.1.事务协调器的启动
    • 4.2.事务管理器的启动
    • 4.3.资源管理器的启动
    • 4.4.全局事务的工作流程
    • 4.5.成功的全局事务处理流程
    • 4.6.成功的全局事务处理流程
    • 4.7.写隔离实现
    • 4.8.读隔离实现
  • 5.总结

1.背景

随着业务发展,单体系统逐渐无法满足业务的需求,分布式架构逐渐成为大型互联网平台首选。伴随而来的问题是,本地事务方案已经无法满足,分布式事务相关规范和框架应运而生。

在这种情况下,大型厂商根据分布式事务实现规范,实现了不同的分布式框架,以简化业务开发者处理分布式事务相关工作,让开发者专注于核心业务开发。

Seata就是这么一个分布式事务处理框架,Seata是由阿里开源,前身为Fescar,经过品牌升级变身Seata。

2.分布式事务规范

2.1.分布式事务相关概念

事务: 一个程序执行单元,是用户定义的一组操作序列,需要满足ACID属性。本地事务:事务由本地资源管理器管理。分布式事务:事务的操作位于不同的节点。分支事务:在分布式事务中,由资源管理器管理的本地事务。全局事务:一次性操作多个资源管理器完成的事务,由一组分支事务组成。

2.2. 分布式事务实现规范

对于本地事务,可以借助DBMS系统来实现事务的管理,但是对于分布式事务,它就无能为力了。对于分布式事务,目前主要有2种思路:XA协议的强一致规范以及柔性事务的最终一致性规范。

2.2.1. XA

XA是基于2阶段提交协议设计的接口标准,实现了XA规范的资源管理器就可以参与XA全局事务。应用承担事务管理器TM工作,数据库承担资源管理器RM工作,TM生成全局事务id,控制RM的提交和回滚。

2.2.2. 柔性事务的最终一致性

该规范主要有3种实现方式,TCC、MQ事务消息、本地消息表。(还存在其他一些不常用实现方式如Saga)。

TCC:try/confirm/cancel,在try阶段锁定资源,confirm阶段进行提交,资源锁定失败执行cancel阶段释放资源。


MQ事务消息:前提消息系统需要支持事务如RocketMQ,在本地事务执行前,发送事务消息prepare,本地事务执行成功,发送事务消息commit,实现分布式事务最终一致性。如果事务消息commit失败,RocketMQ会回查消息发送者确保消息正常提交,如果步骤5执行失败,进行重试,达到最终一致性。

本地消息表:跟MQ事务消息类似,区别在于MQ不支持事务消息,需要借助本地数据库的事务管理能力。在步骤1中将需要发送的消息和本地事务一起提交到DB,借助DB的事务管理确保消息持久化。步骤2应用通过本地消息表扫描,重试发送,确保消息可以发送成功。

3.分布式事务规范

3.1. 系统组成

Seata有三个核心组件:

Transaction Coordinator(TC,事务协调器)—— 维护全局事务和分支事务的状态,驱动全局事务提交或回滚。
Transaction Manager(TM,事务管理器) —— 定义全局事务的范围,开始事务、提交事务、回滚事务。
Resource Manager(RM,资源管理器):—— 管理分支事务上的资源,向TC注册分支事务,汇报分支事务状态,驱动分支事务的提交或回滚。

三个组件相互协作,TC 以 Server 形式独立部署,TM和RM集成在应用中启动,其整体交互如下:

3.2.工作模式

Seata 支持四种工作模式:

3.2.1. AT(Auto Transaction)

AT模式是Seata默认的工作模式。需要基于支持本地 ACID 事务的关系型数据库,Java 应用,通过 JDBC 访问数据库

整体机制

该模式是XA协议的演变,XA协议是基于资源管理器实现,而AT并不是如此。AT的2个阶段分别是:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
  • 二阶段:提交异步化,非常快速地完成;回滚通过一阶段的回滚日志进行反向补偿。

下图中,步骤1开启全局事务;步骤2注册分支事务,这里对应着一阶段;步骤3提交或者回滚分支事务,对应着二阶段。

特点

优点:对代码无侵入;并发度高,本地锁在一阶段就会释放;不需要数据库对XA协议的支持。缺点:只能用在支持ACID的关系型数据库;SQL解析还不能支持全部语法。

3.2.2. TCC

该模式工作分为三个阶段

上图中对于多个分支事务,省略了多次出现的 2.* 步骤。对于全局事务执行过程中业务应用宕机情况,业务应用集群中对等节点会通过从TC获取相关会话,从DB加载详细信息来恢复状态机。

特点

优点:一阶段提交本地事务,无锁,高性能;事件驱动架构,参与者可异步执行,高吞吐;补偿服务易于实现。缺点:不保证隔离性。

3.2.3. XA模式

XA是基于二阶段提交设计的接口标准。对于支持XA的资源管理器,借助Seata框架的XA模式,会使XA方案更简单易用。使用前提:需要分支数据库支持XA 事务,应用为 Java应用,且使用JDBC访问数据库。

整体机制

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

  • 执行阶段:业务sql在XA分支中执行,由分支事务的RM管理器管理,然后执行XA prepare。
  • 完成阶段:TM根据各个分支执行结果通过TC通知各个分支执行XA commit或者XA rollback。


特点

优点:继承了XA协议的优势,事务具有强一致性。
缺点:同样继承了XA协议的劣势,由于分支事务长时间开启,并发度低。

3.3. Seata 各模式对比

分布式事务方案没有银弹,根据自己的业务特性选择合适的模式。例如追求强一致性,可以选择AT和XA,存在和外部系统对接,可以选择Saga模式,不能依赖本地事务,可以采用TCC等等。结合各模式的优缺点进行选择。

4.AT 模式核心实现

鉴于Seata支持的模式较多,而其默认的模式是AT,为节省篇幅,以下围绕AT模式分析其相关的核心模块实现。

4.1.事务协调器的启动

TC(事务协调器)以独立的服务启动,作为Server,维护全局事务和分支事务的状态,驱动全局事务提交或回滚。下面是TC的启动流程:

4.2.事务管理器的启动

TM(事务管理器)集成在应用中启动,负责定义全局事务的范围,开始事务、提交事务、回滚事务。
TM所在应用中需要配置GlobalTransactionScannerbean,在应用启动时会进行如下初始化流程:

4.3.资源管理器的启动

RM(资源管理器)集成在应用中启动,负责管理分支事务上的资源,向TC注册分支事务,汇报分支事务状态,驱动分支事务的提交或回滚。
RM所在的应用中除了需要跟TM一样配置GlobalTransactionScanner以启动RMClient,还需要配置DataSourceProxy,以实现对数据源访问代理。该数据源代理实现了sql的解析 → 生成undo-log → 业务sql和undo-log一并本地提交等操作。

4.4.全局事务的工作流程

下面以一个简单的例子来说明全局事务的工作原理:

BusinessService:发起购买服务
StorageService:库存管理服务

购买操作实现在businessService.purchase中,purchase方法实现上通过GlobalTransaction注解,通过Dubbo服务,调用了库存服务deduct方法方法,样例如下:

@GlobalTransactional(timeoutMills = 300000, name = "dubbo-demo-tx")
public void purchase(String userId, String commodityCode, int orderCount) {storageService.deduct(commodityCode, orderCount);// throw new RuntimeException("xxx");
}

4.5.成功的全局事务处理流程

4.6.成功的全局事务处理流程

这里设定BusinessService在成功调用StorageService后,本地出现异常。

4.7.写隔离实现

全局事务未提交,分支事务本地已经提交的情况下(假设修改了资源A),如何避免其他事务在此时修改资源A?Seata采用全局锁来实现,其流程如下:

4.8.读隔离实现

在数据库本地隔离级别为读已提交或以上的基础上,Seata提供了读未提交,这个很好理解,全局事务提交前分支事务本地已经提交。如果想要实现读已提交,则需要在select语句上加for update。

5.总结

Seata是Java领域很强大的分布式事务框架,其支持了多种模式。其中默认支持的AT模式,相比于传统的2PC协议(基于数据库的XA协议),很好地解决了2PC长期锁资源的问题,提高了并发度。Seata支持的各个模式中,AT模式对业务零入侵实现分布式事务,对于开发者更加友好。另外Seata的Server在选择合适的存储介质时可以进行集群模式,减少单点故障影响。

《SpringCloud Alibaba 微服务架构》专题(二十三)-Seat工作原理相关推荐

  1. 《SpringCloud Alibaba 微服务架构》专题(二十一)-Seat简介与安装

    文章目录 1.业务场景 2.Seata简介 3.Seata原理和设计 4.seata-server的安装与配置 Seata是Alibaba开源的一款分布式事务解决方案,致力于提供高性能和简单易用的分布 ...

  2. SpringCloud Alibaba 微服务架构(十五)- 一文详解 Nacos 高可用特性

    前言 服务注册发现是一个经久不衰的话题,Dubbo 早期开源时默认的注册中心 Zookeeper 最早进入人们的视线,并且在很长一段时间里,人们将注册中心和 Zookeeper 划上了等号,可能 Zo ...

  3. SpringCloud Alibaba 微服务架构(十一)- 分布式事务解决方案及理论基础篇

    前言 在传统的单体应用架构中,例如经典的SSM,项目会采用分层架构模式:数据库访问层.业务逻辑层.控制层,从前端到后台所有的代码都是一个或者几个开发者去完成,该架构模式没有对我们业务逻辑代码实现拆分. ...

  4. SpringCloud Alibaba 微服务架构版本说明

    详情

  5. 最新版Spring Cloud Alibaba微服务架构-Openfeign服务调用篇

    文章目录 前言 一.OpenFeign配置使用 1.引入pom依赖 2.消费端开启Feign服务调用 3.消费端动态代理Service接口 3.消费端测试 二.OpenFeign日志配置 1.全局配置 ...

  6. 基于SpringCloud的微服务架构演变史?

    系统架构演变概述 在公司业务初创时期,面对的主要问题是如何将一个想法变成实际的软件实现,在这个时候整个软件系统的架构并没有搞得那么复杂,为了快速迭代,整个软件系统就是由"App+后台服务&q ...

  7. 微服务架构与SpringCloud:微服务架构的特点

    微服务架构与Spring Cloud 近几年大家都在谈论云原生和微服务,例如 © 云原生技术能够帮助公司和机构在私有云.公有云和混有云等新型动态环境中,构建和运行可弹性扩展的应用. 微服务架构是一项在 ...

  8. 防止内卷和被潜规则,Spring Cloud Alibaba微服务架构实战派(上下册)|35岁程序员那些事

    目录 1 写书缘由 2 本书上册核心内容 2.1 Spring Cloud Alibaba基础实战 2.1.1 主要内容 2.1.2 MyBatis-Plus实现多租户架构的核心原理 2.2 分布式服 ...

  9. 微服务架构的核心要点和实现原理解析

    摘要:本文中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务在读者正在工作的项目中起到积极的作用. 微服务架构中职能团队的划分 传统单体架构将系统分成具 ...

  10. (二)SpringCloud,Alibaba微服务架构之——核心模块及相应技术

    一.微服务架构中核心模块及其使用技术总览 二.各模块详细说明 1.注册中心 该模块主要功能为 自动提供服务的注册与发现,集中式管理服务,让 服务调用端发现服务,让服务提供端注册服务,倘若没有注册中心, ...

最新文章

  1. Python爬虫应用实战-网站数据爬取及数据分析
  2. js特效 在服务器显示变形,使一行文字变形产生弯曲弧度特效的jQuery插件 - Arctext.js...
  3. Go的遍历map与slice的区别:map无序slice有序
  4. CF1413C Perform Easily(two pointers)
  5. 卷积神经网络的整体结构、卷积层、池化、python实现
  6. linux中如何运行html文件路径问题,Linux中如何查询运行文件的全路径的方法
  7. 遇到 oracle 错误 25153,EXP时,出现3113的错误,不知道怎么解决?
  8. 计算机211学校四川,四川省有哪些211大学?附排名
  9. stack-based buffer overflow basic paper
  10. python开发人工智能要不要很高数学_CFA、FRM持证人的“秘密武器”—Python,连潘石屹都在学,你确定不要了解一下吗?...
  11. 今日头条技术架构分析
  12. 卸载软件时,出现解压缩支持文件时出错,灾难性故障--转载
  13. 云计算就业前景究竟怎样 如何加入云计算行列
  14. 苹果笔记本没有计算机管理员,Mac管理员账户丢失怎么办
  15. Python | 计算给定数字的平方(3种不同方式)
  16. 万亿级消息队列 Kaka 在 Bilibili 实践
  17. 前端使用 video标签 设置 autoplay 无法自动播放
  18. 学习笔记(3):海量数据的交互式分析工具-Dremel
  19. 控制系统设计专题(四)——控制分配矩阵的求解及相关问题
  20. 网站使用手机相机_手机如何修改证件照片大小和分辨率

热门文章

  1. oracle中is not null,oracle之is null和is not null的优化
  2. Java-模拟新浪微博用户注册功能实现(控制台程序)
  3. 浪潮存储助力方特动漫为《熊出没-狂野大陆》动物角色披上“动感毛发”
  4. 用javascript访问操作iframe中的dom对象
  5. html背景图片大小嵌套,div嵌套div 背景图片 不显示的问题
  6. IIS部署添加网站发布网站
  7. (三)LEA,REP,MOV,MOVS,STOS与内存的表现形式
  8. PHP Paypal支付+退款全流程
  9. 无法删除文件:无法读源文件或磁盘”
  10. 【存储专题】西瓜哥带您学习高端存储