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

网友投稿 658 2022-11-22

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

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

文章目录

​​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阶段释放资源。

3.分布式事务规范

3.1. 系统组成

Seata有三个核心组件:

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

3.2.工作模式

Seata 支持四种工作模式:

3.2.1. AT(Auto Transaction)

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

整体机制

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

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

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

3.2.2. TCC

特点

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

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 各模式对比

4.AT 模式核心实现

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

4.1.事务协调器的启动

4.2.事务管理器的启动

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.成功的全局事务处理流程

4.7.写隔离实现

4.8.读隔离实现

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

5.总结

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringData专题(十三)-SpringDataJPA一对一关联
下一篇:SpringMVC专题(五)-SpringMVC响应数据和结果视图
相关文章

 发表评论

暂时没有评论,来抢沙发吧~