Seata 多语言体系建设

简介: 在诸如 gRPC 等微服务体系都在进行多语言建设的当下,分布式事务也应该有多种语言支持。所以在规划 2022 年 Seata Roadmap 时,其中一个非常的关键点就是 Seata 的多语言技术体系建设。在经过半年的准备特别是完成了 Seata v1.5.2 发版后,社区在今年 (2022 年) 下半年的重点任务就是全力建设 Seata 的多语言实现。

图片

文|赵新(花名:于雨 )

蚂蚁集团可信原生部工程师阿里开源先锋人物、阿里开源大使

负责蚂蚁可信原生技术部 DB Mesh 系统开发,以及容器和分布式事务开源工作

本文 3846 字,阅读 10 分钟

|引语|

分布式事务是微服务技术体系中非常关键的的一个技术节点,当下最流行且经过大规模生产验证的高质量分布式事务实现无疑是 Seata。Seata 社区过去四年长期专注于 Java 语言实现,在 Java 领域是事实上的分布式事务技术标准平台。

在诸如 gRPC 等微服务体系都在进行多语言建设的当下,分布式事务也应该有多种语言支持。所以在规划 2022 年 Seata Roadmap 时,其中一个非常的关键点就是 Seata 的多语言技术体系建设。在经过半年的准备特别是完成了 Seata v1.5.2 发版后,社区在今年 (2022年) 下半年的重点任务就是全力建设 Seata 的多语言实现。

PART. 1--关键技术点

Seata Java 版本经过四年建设后,已经形成了一个非常庞大的技术体系。在进行多语言建设时,想要在半年内让多语言版本 Seata 的功能与 Seata Java 完全对齐,是不可能的。社区需要综合考量当下的实际迫切需求以及未来的发展方向,先找出 Seata 多语言版本的关键技术点。

1. 事务模式

Seata 提供了 TCC、SAGA、AT 和 XA 四种经典事务模式。下图是四种模式的发布时间。

图片

各种模式有其各样的特点:

AT 模式

算是阿里体系独创的事务模式,其本质属于两阶段事务,其二阶段的 commit/rollback 由框架自动生成,对业务没有侵入,用户友好度高于 TCC 模式,可完美接续 Spring 事务,开发效率也较高,也是当前用户最多的一种模式。在 v1.5.2 已经发版的当下时间节点来看,AT 模式下通过全局锁来实现数据的隔离性,对于同一个资源的事务处理只能串行操作,性能一般。

TCC 模式

需要业务层参与者实现 prepare/commit/rollback 接口,其性能在四种模式下最好,数据可见性、隔离性也不错,流行程度仅次于 AT。特别适用于对吞吐、性能、隔离性要求都比较高的金融业务。

SAGA 模式

是一种长事务解决方案,其一阶段正向服务和二阶段补偿服务都由业务开发实现,可以很方便地与微服务框架进行结合,其性能仅次于 TCC 模式。因为其方便编排的特点,它在微服务编排领域有大量应用,当然使用时需要用户写 JSON 文件对服务进行编排。但其数据隔离性不好,业务数据有被脏写的风险。社区目前正在进行 SAGA 注解化工作(https://github.com/seata/seata/pull/4577),可进一步提升其性能与易用性。

XA 模式

不同于其他三种「补偿型」事务,它提供了最严格的隔离性:可以保证全局视角的数据一致性,即保证了用户不会出现脏读。Seata XA 模式的接口与 AT 模式基本一致,算是对用户比较友好的一种事务模式,它是对 XA 协议的严格实现。XA 模式的缺点是其事务范围比较长,其性能最低。

四种模式的发版顺序如下:

图片

每种事务模式在阿里体系内都有各自的业务场景,其出现与演进都是迎合了各自业务场景现有的痛点。AT 和 XA 是不需要理解业务语义的,作用于 DB driver + DB 层面,TCC 和 SAGA 则需要业务层面自实现回滚幂等类逻辑,按照数据面和业务面来切分,依据对业务的入侵程度,四种模式归类如下图。

图片

分布式事务的基石是通信框架、SQL 解析以及数据库连接驱动实现等。得益于 Java 语言丰富的生态,Seata Java 版本可以很方便地站在这些 “巨人” 肩上展开相应的工作,这也是其他语言无法望其项背的。例如,主流数据库都提供了其 Java 版本的 DB driver。但当把工作背景放到多语言场景下时,就需要考量各个语言相关技术点的实现程度了。

四种事务模式,AT 模式本质是应用层的事务,需要把数据库层面做过的 Redo/Undo 在应用层再做一遍,其中非常关键的一个技术点是:AT 模式需要介入数据源做 SQL 拦截,对 SQL 进行解析。单单考量 SQL 解析这个单技术点,Java 和 Python 语言有 antlr,Go 语言有 TiDB 提供的可自由使用的 pingcap/parser,但目前很多其他语言在这块都是空白的。

所以社区在考量现实情况后,除了 Go 和 Python 版本,在进行多语言版本建设时,没有 SQL 解析包的语言版本先不提供 AT 模式的实现。

2. 通信协议

不论哪种事务模式,都构建在 Seata 独有的架构之上。

图片

图片来自 seata 官网

Seata 总体架构由如下角色构成:

事务协调器 Transaction Coordinator

简称 TC,维护全局事务和分支事务的状态,驱动全局事务提交或者回滚。

事务管理器 Transaction Manager

简称 TM,定义全局事务的范围,提交或者回滚全局事务。

资源管理器 Resource Manager

简称 RM,和分支事务在同一个应用,进行分支事务的注册,报告分支事务的状态,驱动分支事务的提交或者回滚。

TC 与 TM 以及各个 RM 之间使用 netty 框架进行长链接通信。具体而言,Seata Java 版本的通信协议是在四层 TCP 协议之上又定义了一套私有的二进制双向通信协议。其关键点在于 Seata Java 版本站在了 netty 这个巨人肩上。

回到多语言这个背景下,很多语言并没有提供一套成熟的 TCP 通信框架。譬如 Dubbo 在建设其 Go 版本 dubbo-go 时,为了在 TCP 之上实现与 Dubbo 的私有二进制协议通信,本人前期的工作重点是先实现 TCP 通信框架 getty(https://github.com/apache/dubbo-getty),然后再实现其序列化协议 dubbo-go-hessian2(https://github.com/apache/dubbo-go-hessian2)。如果把语言切换成 JS、PHP 或者 Python,相关通信协议建设需要耗费社区大量精力。

Seata 2019 年就在 API 层适配了 gRPC 的事务上下文传递,为了方便 Seata 多语言版本的建设,Seata Java 框架本身正在进行一项重要工作:Seata Client (包括 TM 和 RM) 基于 gRPC 与 Seata Server (TC) 集群进行通信。希望借助于 gRPC 的多语言优势,节省多语言版本在通信层面的工作量。

3. 配置和注册中心

类似于其他微服务框架,Seata 自身除了上一节提到的内部组件外,还依赖于注册中心和配置中心。微服务上层的应用通过配置中心找到注册中心,再通过注册中心发现 Seata 的各个服务组件。一个典型的完备的 Seata 服务架构如下图。

图片

Seata Java 这套架构可以很方便的嵌入注入 Dubbo、SOFARPC 以及 Spring 等 Java 微服务框架中。其中两种非常重要的外部依赖组件是:

Config Centre

依据参考文档 1 和 3,配置中心的作用是 “放置着各种配置文件”,客户端通过配置中心的配置 “去读取全局事务开关, 事务会话存储模式” 等事务配置信息。

Seata Java 支持的配置中心类型有 File、Nacos 、Apollo、Zk、Consul、Etcd3 等。

Registry Centre

依据参考文档 2,注册中心记录了服务路由和寻址映射关系。服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址进行调用。比如 Seata Client 端 (TM、RM) 对 Seata Server (TC) 集群进行服务发现就是通过注册中心进行的。

Seata Java 支持的注册中心有 File 、Nacos 、Eureka、Redis、Zk、Consul、Etcd3、SOFA 等。

先不论这套体系的复杂程度与维护成本,在进行 Seata 多语言体系建设时,遇到的关键问题是:这些组件的多语言支持情况参差不齐。Seata 其他语言版本不可能为了支持这些组件,让 Seata 社区自己去构建起这些组件的多语言客户端实现。

愚以为,解决这个问题的手段,不是去裁剪 Seata Java 的现有实现,而是扩展 Seata Java 的功能支持新的更多的配置中心与注册中心。在云原生时代的当下,大部分云平台的底座是 Kubernetes,大部分微服务体系都在基于 K8s 构建其新技术形态。所以 Seata 多语言体系可以用如下形式构建起新的 name server:

使用 K8s 的 ConfigMap 存储 Seata 的配置数据

一般地,Seata 是作为其他微服务平台如 Spring Cloud Alibaba、Dubbo、HSF、SOFARPC 等框架的组件使用的。这些框架本身就有配置中心的概念,支持了 Nacos、Apollo、SOFARegistry 等流行的配置中心,Seata 可以复用这些框架现有的配置中心,减少维护成本。

多语言版本的 Seata 的配置类型可以先实现 File 类型,使用 Seata 的微服务应用运行在 Kubernetes 平台上时,通过 ConfigMap 挂载 Seata 的配置。

使用 K8s 的 API server 或者 DNS 组件充当 Seata 的注册中心

同理于配置中心,Seata 的注册中心也可以复用其所在的微服务框架的注册中心,如 Nacos、Etcd、Zookeeper 等。运行在 Kubernetes 平台上时,把 API server 当作注册中心,多语言版本的 Seata 优先实现 File 类型,配置 API server 地址即可。

Seata server (就是 TC) 可以多 namespace 部署,每个 namespace 下可以有多个 TC 集群,Seata Client (包括 TM 和 RM) 可以通过 service 形式获取 TC 集群地址,这样既达到了 TC 高可用的目的,也方便在客户端层面对 TC 集群进行负载均衡。

PART. 2--总结

通过对事务模式、通信协议以及配置与注册中心的讨论,可以看到,在进行 Seata 多语言体系建设时,并不是让 Seata 多语言实现完全以 Seata Java 版本为参照向其靠拢,而是 Seata Java 版本作为 Seata 多语言体系的一部分共同进化。

PART. 3--整体工作进度

计算机行业有个 TIOBE 排行榜,定期更新各种主流计算机语言的流行度。参照这个排行榜中前 10 大流行语言,本人月初 (2022 年 7 月) 在 Seata 两大钉钉群发起了 Seata 多语言投票,统计结果如下:

图片

根据投票结果以及社区相关人才技术储备情况,社区决定先重点投入 Go、Python、JS 三种语言建设上。几种语言当前工作推进情况如下:

seata-go

项目地址:https://github.com/seata/seata-go

社区钉群:33069364

seata-python

项目地址:https://github.com/opentrx/seata-python

社区钉群:44788121

seata-js

项目地址:https://github.com/seata/seata-js

社区钉群:44788119

seata-php

项目地址:https://github.com/seata/seata-php

社区钉群:44788115

历史上,Seata 曾经有两个 Go 版本,分别是 2019 年由张旭贡献的 seata-go 和 2020 年由刘晓敏贡献的 seata-golang。为了统一建设,目前已经把这两个项目合并,seata-go 完成度是多语言版本中最高的,实现了 TCC 和 AT 模式。目前 XA 和 Saga 模式的实现也在推进中,预计秋季可发布第一个版本。其次完成度比较高的是 seata-python,提供了 AT 事务模式。

考虑到 Seata 目前大部分开发者和用户都在国内,Seata 社区建设了多个语言社区群,以推进语言版本的开发工作。

Seata 多语言体系建设工作目前正在如火如荼地展开中,欢迎行业同仁入群参与其中,与我们一起推动 Seata 各个语言版本的实现,提升各个语言微服务框架的事务技术水平,开创分布式技术建设新局面!

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
网络协议 JavaScript 前端开发
Java一分钟之-GraalVM Native Image:构建原生可执行文件
【6月更文挑战第13天】GraalVM Native Image是Java开发的创新技术,它将应用编译成独立的原生可执行文件,实现快速启动和低内存消耗,对微服务、桌面应用和嵌入式系统有重大影响。本文讨论了如何使用Native Image,包括常见挑战如反射与动态类加载、静态初始化问题和依赖冲突,并提供了解决方案和代码示例。通过合理规划和利用GraalVM工具,开发者可以克服这些问题,充分利用Native Image提升应用性能。
625 5
|
7月前
|
存储 运维 负载均衡
HarmonyOS Next 端云一体化(1)
HarmonyOS Next端云一体化开发简介:借助Cloud Foundation Kit,开发者可便捷使用云函数、云数据库和云存储等服务,专注于业务逻辑。本文涵盖应用场景(如应用后端、计算密集型任务等)、资源介绍、项目创建流程(AGC平台与DevEco Studio配合)、云端环境操作及本地目录结构解析。建议优先使用DevEco Studio进行开发以提升体验,为深入学习打下基础。
324 6
HarmonyOS Next 端云一体化(1)
|
存储 缓存 监控
【Linux】深入理解ls命令
【Linux】深入理解ls命令
|
10月前
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
406 11
|
11月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
888 2
|
12月前
|
数据中心
|
安全 数据安全/隐私保护 UED
|
机器学习/深度学习 存储 数据可视化
特征选择的艺术:利用Scikit-learn提升模型性能
【7月更文第22天】在机器学习的实践中,特征选择是一项至关重要的步骤,它直接影响到模型的性能、训练速度以及对新数据的泛化能力。特征选择,或称为变量选择,旨在从原始特征集中识别并保留最相关、最有影响力的特征子集,同时剔除冗余或无关紧要的特征。本文将探讨特征选择的重要性,并通过使用Python中的Scikit-learn库演示几种有效的特征选择方法,以提升模型性能。
760 4
|
Ubuntu 编译器 C++
Ubuntu系统下编译OpenCV4.8源码
本文档介绍了在Ubuntu系统下编译和安装OpenCV4.8的简单步骤:首先,通过wget命令下载源码包,然后解压;接着,安装必要的编译器和第三方库支持;最后,在源码目录创建build文件夹,执行cmake和make安装。整个过程包括下载、安装依赖和编译安装三个主要步骤。
332 6