Seata(Simple Extensible Autonomous Transaction Architecture)是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。在 GitHub 上拥有超过 1.4 万 Star,毫无疑问是开源社区分布式事务领域最火爆的项目。
GTS(Global Transaction Service 全局事务服务)是阿里云上的分布事务中间件产品,用于实现分布式环境下特别是微服务架构下的高性能事务一致性。
- 2014 年,阿里巴巴中间件团队发布分布式事务中间件产品 TXC(Taobao Transaction Constructor),为集团内部应用提供服务。
- 2016 年,TXC 经过产品化改造,以 GTS 的身份登陆阿里云,成为当时业界唯一一款云上分布式事务产品,在阿云里的公有云、专有云解决方案中,开始服务于众多外部客户。
- 2019 年,阿里巴巴中间件团队基于 TXC 和 GTS 的技术积累,发起了开源项目 Seata(曾用名 Fescar),和社区一起建设这个分布式事务解决方案。开源项目 Seata 的基础是基于 GTS 架构定义的分布式事务框架以及 GTS 独创的的 AT(Automatic Transaction)模式。
- Seata 项目经过近一年的发展,收获包括蚂蚁金服分布式事务领域核心技术合作,以及开源社区的大力投入,加入 TCC 和 Saga 模式支持,于 2019 年底发布 GA 版本。
- 2020 年 2 月,基于 Seata 项目 GA 后的版本,GTS 实现与 Seata 的协议兼容,支持使用 Seata 的应用无缝迁移到云上基于 GTS 提供的服务来高效运行。
简单来讲,Seata 项目 2019 年之初的创建是 GTS 的开源版本,经过一年的演进,GTS 商业版本开始全面提供对 Seata 的支持。
![GTS-Seata-roadmap GTS-Seata-roadmap]()
GTS 如何实现对 Seata 的支持
接下来,我们全面解读 GTS 是如何实现对 Seata 的支持的。
Seata 定义的分布式事务框架
首先,看一下 Seata 定义的分布式事务框架。
核心组件定义
![2 2]()
Seata 明确定义分布式事务的 3 个核心组件:
- Transaction Coordinator (TC):事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
- Transaction Manager (TM):控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
- Resource Manager (RM):控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
一个典型的事务过程:
- TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID。
- XID 在微服务调用链路的上下文中传播。
- RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖。
- TM 向 TC 发起针对 XID 的全局提交或回滚决议。
- TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。
事务框架和事务模式
基于架构上定义的 3 个角色,Seata 把分布式事务抽象成这样一个 事务框架。
![3 3]()
TM 定义全局事务的边界。
RM 负责定义分支事务的边界和行为。
TC 跟 TM 和 RM 交互(开启、提交、回滚全局事务;分支注册、状态上报和分支的提交、回滚),做全局的协调。
所谓 Seata 的 事务模式,是这个框架下,RM 驱动的 分支事务的不同行为模式,应该是 事务(分支)模式。
Seata 定义的事务模式
AT 模式
AT 模式 RM 驱动分支事务的行为:
-
执行阶段:
- 代理 JDBC 数据源,解析业务 SQL,生成更新前后的镜像数据,形成 UNDO LOG。
- 向 TC 注册分支。
- 分支注册成功后,把业务数据的更新和 UNDO LOG 放在同一个本地事务中提交。
-
完成阶段:
- 全局提交,收到 TC 的分支提交请求,异步删除相应分支的 UNDO LOG。
- 全局回滚,收到 TC 的分支回滚请求,查询分支对应的 UNDO LOG 记录,生成补偿回滚的 SQL 语句,执行分支回滚并返回结果给 TC。
![4 4]()
TCC 模式
TCC 模式 RM 驱动分支事务的行为:
-
执行阶段:
- 向 TC 注册分支。
- 执行业务定义的 Try 方法。
- 向 TC 上报 Try 方法执行情况:成功或失败。
-
完成阶段:
- 全局提交,收到 TC 的分支提交请求,执行业务定义的 Confirm 方法。
- 全局回滚,收到 TC 的分支回滚请求,执行业务定义的 Cancel 方法。
![5 5]()
Saga 模式
Saga 模式 RM 驱动分支事务的行为:
-
执行阶段:
- 向 TC 注册分支。
- 执行业务方法。
- 向 TC 上报业务方法执行情况:成功或失败。
-
完成阶段:
- 全局提交,RM 不需要做事情。
- 全局回滚,收到 TC 的分支回滚请求,执行业务定义的补偿回滚方法。
![6 6]()
XA 模式
XA 模式 RM 驱动分支事务的行为:
-
执行阶段:
- 向 TC 注册分支。
- XA start,执行业务 SQL,XA end。
- XA prepare,并向 TC 上报 XA 分支的执行情况:成功或失败。
-
完成阶段:
- 收到 TC 的分支提交请求,XA commit。
- 收到 TC 的分支回滚请求,XA rollback。
![7 7]()
TC 在 Seata 架构中的重要作用
Seata 架构中的 TM 和 RM 和应用部署在一起,应用根据业务需求,选择合适的分布式事务模式来解决数据一致性问题。
从上述 4 类已经或即将被 Seata 框架支持的分布式事务模式的工作机制可以看到:
无论使用哪处模式,都离不开一个稳定高效的 TC 提供服务。这些服务包括(但不限于):
- 记录全局事务状态
- 记录事务分支的注册
- 驱动事务分支进行最终的提交或回滚
- 事务链路监控
- 异常事务的恢复
- 全局事务超时检测
- 全局事务间隔离机制
分布式事务的协调机制被 Seata 框架定义为一项标准化的服务。这项服务可以像 ZooKeeper 独立部署运维,给应用的分布式系统提供事务服务。
GTS 带给 Seata 用户的价值
GTS 的架构
Seata 定义的事务协议,如下图所示:
![8 8]()
Seata 的分布式事务框架源自 GTS,二者的底层架构和事务协议是完全一致的。
- GTS 把 TM 和 RM 的实现统一打包到 GTS SDK 中。
- GTS 的服务端就是 TC 的一个高可用实现。
GTS 的事务协议,如下图所示:
![9 9]()
依托于阿里云的基础设施,GTS Server 以多副本、高可用集群形态部署,提供高质量的事务协调服务。
GTS 作为 Seata 的 TC
架构和协议层面的一致,使得 GTS 可以很自然地提供对 Seata 应用的事务协调支持。
只要实现具体网络通信机制上的兼容适配,就可以完整支撑 Seata 应用运行在 GTS 服务之上。
Seata 应用迁移到云上使用 GTS 服务不需要做任何编程改造,仅仅是把自运维的 Seata 的 TC Server 替换为 GTS 提供的高性能、高可靠、高可用的云服务。
![10 10]()
GTS 的价值
GTS 作为云原生分布式事务服务的价值
随着企业的发展,企业业务架构面临数据、服务的分布化,几乎无可避免地要遇到分布式架构带来的数据一致性问题。
GTS 开创性地把分布式事务问题从业务中剥离出来,作为一个独立的技术切面来单独管理,以服务的形式给构建在云上的应用提供简单、易用、高效的分布式事务解决方案。
GTS 给业务应用带来的价值体现在以下几个方面:
- 架构复杂度降低:分布式事务这个 切面 的技术问题,全部 收敛 到 GTS 提供的服务来解决。
- 设计和开发成本减轻:业务逻辑的设计和开发,完全不需要针对是否涉及分布式事务而做任何额外的事情,对业务 0 侵入 。
- 项目交付、迭代速度加快:归因于上述两点,项目得以很快交付和迭代。GTS 赋予业务应用 快速试错 的能力,在这个商业机会瞬息万变的时代,显得尤为重要。
设想一个典型的云原生企业应用的成长路径:
![11 11]()
- 1.0:单体应用,快速上线,这个时候完全不涉及分布式事务。
- 2.0:单个数据库无法支撑,数据分布到多个数据库,产生分布式事务问题。
- 3.0:微服务化,进一步产生跨服务的分布式事务。
- 4.0:跨应用的整合,成为 SaaS 或 FaaS 的平台,在更大的范围,产生分布式事务问题。
基于 GTS 提供的分布式事务服务,企业发展各阶段产生的不同场景下的数据一致性问题,可以得到一站式的解决。这使得业务可以平滑自然地,像搭积木一样成长起来。
从上面示例可以看到:GTS 实际上是把分布式事务(或者说分布式场景下的数据一致性)能力,作为一种 云原生 的服务,提供给生长在云上的应用,让分布式事务不再成为业务要面临的一个令人头疼的问题,而成为一种可以弹性伸缩,按需取用的服务能力。
GTS 支持 Seata 带来的价值
GTS 提供对开源解决方案 Seata 的兼容支持后,给 GTS 商业用户和 Seata 开源用户之间建立了一座桥梁,给两类用户创造更多价值。
对于既有的和潜在的 GTS 用户:
- 不必担心厂商的 Lock-in,核心技术完全符合开源的开放标准。
- 基于开源的解决方案可以在社区得到更多技术支持。
- 更容易基于开源项目进行 POC 验证,构建开发、测试环境。
对于既有的和潜在的 Seata 用户:
发展路线图
开源项目 Seata 和商业产品 GTS 正在并行向前演进:
- Seata 正在打造新的分布式事务模式:XA 模式,将在不久的 1.x 版本发布(预计 1.2 或 1.3)。
- GTS 基于开源的 Seata 内核,融合既有的和新的商业特性,打造全新的 3.0 版本。3.0 版本发布后,将支持 Seata 全部事务模式:AT、TCC、Saga 和 XA,实现开源版本和商业版本的融合。
- 版本融合后,GTS 每个版本都的发布都将实现对最新稳定开源版本的兼容支持。
![12 12]()
实践
GTS 的 SDK 2.9.0 版本支持基于 Seata 的应用使用 AT 模式,运行在 GTS 服务上。参考样例,点击这里。
另外,基于 GTS 构建微服务分布式事务解决方案的更多实践,请参考阿里云最佳实践的推荐,以及官网。
作者信息:煊檍,GitHub ID:sharajava,阿里巴巴中件间 GTS 研发团队负责人,SEATA 开源项目发起人,曾在 Oracle 北京研发中心多年,从事 WebLogic 核心研发工作。长期专注于中间件,尤其是分布式事务领域的技术实践。