全局事务服务 GTS 与 Seata 融合的开始

本文涉及的产品
云原生网关 MSE Higress,422元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介:

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 的支持

接下来,我们全面解读 GTS 是如何实现对 Seata 的支持的。

Seata 定义的分布式事务框架

首先,看一下 Seata 定义的分布式事务框架。

核心组件定义

2

Seata 明确定义分布式事务的 3 个核心组件:

  • Transaction Coordinator (TC):事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
  • Transaction Manager (TM):控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
  • Resource Manager (RM):控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。

一个典型的事务过程:

  1. TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID。
  2. XID 在微服务调用链路的上下文中传播。
  3. RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖。
  4. TM 向 TC 发起针对 XID 的全局提交或回滚决议。
  5. TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。

事务框架和事务模式

基于架构上定义的 3 个角色,Seata 把分布式事务抽象成这样一个 事务框架

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

TCC 模式

TCC 模式 RM 驱动分支事务的行为:

  • 执行阶段:

    • 向 TC 注册分支。
    • 执行业务定义的 Try 方法。
    • 向 TC 上报 Try 方法执行情况:成功或失败。
  • 完成阶段:

    • 全局提交,收到 TC 的分支提交请求,执行业务定义的 Confirm 方法。
    • 全局回滚,收到 TC 的分支回滚请求,执行业务定义的 Cancel 方法。

5

Saga 模式

Saga 模式 RM 驱动分支事务的行为:

  • 执行阶段:

    • 向 TC 注册分支。
    • 执行业务方法。
    • 向 TC 上报业务方法执行情况:成功或失败。
  • 完成阶段:

    • 全局提交,RM 不需要做事情。
    • 全局回滚,收到 TC 的分支回滚请求,执行业务定义的补偿回滚方法。

6

XA 模式

XA 模式 RM 驱动分支事务的行为:

  • 执行阶段:

    • 向 TC 注册分支。
    • XA start,执行业务 SQL,XA end。
    • XA prepare,并向 TC 上报 XA 分支的执行情况:成功或失败。
  • 完成阶段:

    • 收到 TC 的分支提交请求,XA commit。
    • 收到 TC 的分支回滚请求,XA rollback。

7

TC 在 Seata 架构中的重要作用

Seata 架构中的 TM 和 RM 和应用部署在一起,应用根据业务需求,选择合适的分布式事务模式来解决数据一致性问题。

从上述 4 类已经或即将被 Seata 框架支持的分布式事务模式的工作机制可以看到:

无论使用哪处模式,都离不开一个稳定高效的 TC 提供服务。这些服务包括(但不限于):

  • 记录全局事务状态
  • 记录事务分支的注册
  • 驱动事务分支进行最终的提交或回滚
  • 事务链路监控
  • 异常事务的恢复
  • 全局事务超时检测
  • 全局事务间隔离机制

分布式事务的协调机制被 Seata 框架定义为一项标准化的服务。这项服务可以像 ZooKeeper 独立部署运维,给应用的分布式系统提供事务服务。

GTS 带给 Seata 用户的价值

GTS 的架构

Seata 定义的事务协议,如下图所示:

8

Seata 的分布式事务框架源自 GTS,二者的底层架构和事务协议是完全一致的。

  • GTS 把 TM 和 RM 的实现统一打包到 GTS SDK 中。
  • GTS 的服务端就是 TC 的一个高可用实现。

GTS 的事务协议,如下图所示:

9

依托于阿里云的基础设施,GTS Server 以多副本、高可用集群形态部署,提供高质量的事务协调服务。

GTS 作为 Seata 的 TC

架构和协议层面的一致,使得 GTS 可以很自然地提供对 Seata 应用的事务协调支持。

只要实现具体网络通信机制上的兼容适配,就可以完整支撑 Seata 应用运行在 GTS 服务之上。

Seata 应用迁移到云上使用 GTS 服务不需要做任何编程改造,仅仅是把自运维的 Seata 的 TC Server 替换为 GTS 提供的高性能、高可靠、高可用的云服务。

10

GTS 的价值

GTS 作为云原生分布式事务服务的价值

随着企业的发展,企业业务架构面临数据、服务的分布化,几乎无可避免地要遇到分布式架构带来的数据一致性问题。

GTS 开创性地把分布式事务问题从业务中剥离出来,作为一个独立的技术切面来单独管理,以服务的形式给构建在云上的应用提供简单、易用、高效的分布式事务解决方案。

GTS 给业务应用带来的价值体现在以下几个方面:

  • 架构复杂度降低:分布式事务这个 切面 的技术问题,全部 收敛 到 GTS 提供的服务来解决。
  • 设计和开发成本减轻:业务逻辑的设计和开发,完全不需要针对是否涉及分布式事务而做任何额外的事情,对业务 0 侵入
  • 项目交付、迭代速度加快:归因于上述两点,项目得以很快交付和迭代。GTS 赋予业务应用 快速试错 的能力,在这个商业机会瞬息万变的时代,显得尤为重要。

设想一个典型的云原生企业应用的成长路径:

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 构建的业务系统,可以灵活进行云上或云下部署,代码 0 修改。
  • 迁移上云,基于 GTS 提供的服务,可以完全省去运维 Seata TC Server 的成本:

    • 部署 Seata TC Server 所需的机器、网络、数据库等资源成本
    • 运维 Seata TC Server 的人力资源成本
    • 跟进 Seata 版本,升级 Seata TC Server 的研发、测试成本
  • 另外,GTS 给 Seata 应用提供更多增值服务能力:

    • 按量付费:不使用不产生任何费用
    • 自动扩容缩容:服务能力的扩容和缩容透明化
    • 监控分析:控制台提供事务数据的统计、监视、异常事务控制、链路分析等企业级功能特性

发展路线图

开源项目 Seata 和商业产品 GTS 正在并行向前演进:

  • Seata 正在打造新的分布式事务模式:XA 模式,将在不久的 1.x 版本发布(预计 1.2 或 1.3)。
  • GTS 基于开源的 Seata 内核,融合既有的和新的商业特性,打造全新的 3.0 版本。3.0 版本发布后,将支持 Seata 全部事务模式:AT、TCC、Saga 和 XA,实现开源版本和商业版本的融合。
  • 版本融合后,GTS 每个版本都的发布都将实现对最新稳定开源版本的兼容支持。

12

实践

GTS 的 SDK 2.9.0 版本支持基于 Seata 的应用使用 AT 模式,运行在 GTS 服务上。

另外,基于 GTS 构建微服务分布式事务解决方案的更多实践,请参考阿里云最佳实践的推荐,以及官网

作者信息:煊檍,GitHub ID:sharajava,阿里巴巴中件间 GTS 研发团队负责人,SEATA 开源项目发起人,曾在 Oracle 北京研发中心多年,从事 WebLogic 核心研发工作。长期专注于中间件,尤其是分布式事务领域的技术实践。

相关文章
|
运维 监控 算法
稳定性保障6步走:高可用系统大促作战指南!
年年有大促,大家对于大促稳定性保障这个词都不陌生,业务场景尽管各不相同,“套路”往往殊路同归,全链路压测、容量评估、限流、紧急预案等,来来去去总少不了那么几板斧。跳出这些“套路”,回到问题的本质,我们为什么要按照这些策略来做?除了口口相传的历史经验,我们还能做些什么?又有什么理论依据?
稳定性保障6步走:高可用系统大促作战指南!
|
存储 前端开发 对象存储
一文搞懂Map与Set的用法和区别!
前言 作为前端开发人员,我们最常用的一些数据结构就是 Object、Array 之类的,毕竟它们使用起来非常的方便。往往有些刚入门的同学都会忽视 Set 和 Map 这两种数据结构的存在,因为能用 set 和 map 实现的,基本上也可以使用对象或数组实现,而且还更简单。 但是,存在必然合理,当你真正了解 Map 和 Set 之后,你就会发现它们原来时如此美好!
2888 0
一文搞懂Map与Set的用法和区别!
|
自然语言处理 前端开发 Go
5 大场景上手通义灵码企业知识库 RAG
大家好,我是通义灵码,你的智能编程助手!今天就跟大家分享下企业知识库能帮开发者做些什么。
|
12月前
|
人工智能 开发者
通义灵码一周年数据报:你的 AI 编码助手身份标签是什么?
通义灵码一周年数据报,等你来开AI编码身份标签。
336 3
|
10月前
|
移动开发 HTML5
HTML5 3D地球仪可按经纬坐标定位特效
这是一个基于HTML5的3D地球仪动画,地球仪不仅可以自动自西向东旋转,而且还可以旋转到指定经纬度坐标。另外,还有一个控制面板,可以控制地球是否自转、光晕是否显示,以及地理缩放。你也可以通过拖拽鼠标来改变地球仪的视角,可以将它移至南北极的视角,也可以移至赤道的视角,非常方便。需要的朋友可下载试试!
470 2
|
存储 关系型数据库 MySQL
深入浅出MySQL事务管理与锁机制
MySQL事务确保数据一致性,ACID特性包括原子性、一致性、隔离性和持久性。InnoDB引擎支持行锁、间隙锁和临键锁,提供四种隔离级别。通过示例展示了如何开启事务、设置隔离级别以及避免死锁。理解这些机制对优化并发性能和避免数据异常至关重要。【6月更文挑战第22天】
722 3
|
11月前
|
移动开发 前端开发 API
React 拖拽组件 Drag & Drop
本文介绍了在 React 中实现拖拽功能的方法,包括使用原生 HTML5 Drag and Drop API 和第三方库 `react-dnd`。通过代码示例详细讲解了基本的拖拽实现、常见问题及易错点,帮助开发者更好地理解和应用拖拽功能。
857 10
|
缓存 Shell API
PWA与原生应用:性能与用户体验的深度对比
【7月更文第28天】随着Web技术的进步,渐进式Web应用(Progressive Web Apps, PWA)已成为一种越来越受欢迎的选择,它结合了Web和原生应用的优点。尽管如此,原生应用仍然占据着移动应用市场的主导地位。本文将深入探讨PWA与原生应用之间的性能和用户体验方面的差异,并通过一些实际代码示例来展示如何构建高性能的PWA。
495 1
|
测试技术 程序员
W模型和瀑布模型与“V”模式开发模型有何异同?
W模型和瀑布模型与“V”模式开发模型有何异同?
430 1
|
小程序 开发者
万能的微信小程序个人主页:商城系统个人主页、外卖系统个人主页、购票系统个人主页等等【全部源代码分享+页面效果展示+直接复制粘贴编译即可】
这篇文章分享了四个不同应用场景下的微信小程序个人主页的源代码和页面效果展示,包括商城系统、外卖系统、医疗挂号和电影购票系统的个人主页。提供了完整的页面布局和样式代码,允许开发者直接复制粘贴并根据自己的项目需求进行简单的改造使用。
万能的微信小程序个人主页:商城系统个人主页、外卖系统个人主页、购票系统个人主页等等【全部源代码分享+页面效果展示+直接复制粘贴编译即可】

热门文章

最新文章