Seata 是阿里开源的一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
1.1 四种事务模式
Seata 目标打造一站式的分布事务的解决方案,最 终会提供四种事务模式:
- AT 模式:参见《Seata AT 模式》文档
- TCC 模式:参见《Seata TCC 模式》文档
- Saga 模式:参见《SEATA Saga 模式》文档
- XA 模式:正在开发中...
目前使用的流行度情况是:AT > TCC > Saga。因此,我们在学习 Seata 的时候,可以花更多精力在 AT 模式上,最好搞懂背后的实现原理,毕竟分布式事务涉及到数据的正确性,出问题需要快速排查定位并解决。
友情提示:具体的流行度,朋友可以选择看看 Wanted: who's using Seata 每个公司登记的使用方式。
1.2 三种角色
在 Seata 的架构中,一共有三个角色:
- TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。
- TM (Transaction Manager) - 事务管理器:定义全局事务的范围,开始全局事务、提交或回滚全局事务。
- RM ( Resource Manager ) - 资源管理器:管理分支事务处理的资源( Resource ),与 TC 交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
其中,TC 为单独部署的 Server 服务端,TM 和 RM 为嵌入到应用中的 Client 客户端。
在 Seata 中,一个分布式事务的生命周期如下:
友情提示:看下艿艿添加的红色小勾。
-
TM 请求 TC 开启一个全局事务。TC 会生成一个 XID 作为该全局事务的编号。
XID,会在微服务的调用链路中传播,保证将多个微服务的子事务关联在一起。
-
RM 请求 TC 将本地事务注册为全局事务的分支事务,通过全局事务的 XID 进行关联。
-
TM 请求 TC 告诉 XID 对应的全局事务是进行提交还是回滚。
-
TC 驱动 RM 们将 XID 对应的自己的本地事务进行提交还是回滚。
1.3 框架支持情况
Seata 目前提供了对主流的微服务框架的支持:
-
Dubbo
通过
seata-dubbo
集成 -
SOFA-RPC
通过
seata-sofa-rpc
集成 -
Motan
通过
seata-motan
集成 -
gRPC
通过
seata-grpc
集成 -
Apache HttpClient
通过
seata-http
集成 -
Spring Cloud OpenFeign
-
Spring RestTemplate
同时方便我们集成到 Java 项目当中,Seata 也提供了相应的 Starter 库:
因为 Seata 是基于 DataSource 数据源进行代理来拓展,所以天然对主流的 ORM 框架提供了非常好的支持:
- MyBatis、MyBatis-Plus
- JPA、Hibernate
1.4 案例情况
从 Wanted: who's using Seata 的登记情况,Seata 已经在国内很多团队开始落地,其中不乏有滴滴、韵达等大型公司。可汇总如下图:
另外,在 awesome-seata 仓库中,艿艿看到了滴滴等等公司的落地时的技术分享,还是非常真实可靠的。如下图所示:
从案例的情况来说,Seata 可能给是目前已知最可靠的分布式事务解决方案,至少对它进行技术投入是非常不错的选择。
2. 部署单机 TC Server
本小节,我们来学习部署单机 Seata TC Server,常用于学习或测试使用,不建议在生产环境中部署单机。
因为 TC 需要进行全局事务和分支事 务的记录,所以需要对应的存储。目前,TC 有两种存储模式( store.mode
):
- file 模式:适合单机模式,全局事务会话信息在内存中读写,并持久化本地文件
root.data
,性能较高。 - db 模式:适合集群模式,全局事务会话信息通过 db 共享,相对性能差点。
显然,我们将采用 file 模式,最终我们部署单机 TC Server 如下图所示:
哔哔完这么多,我们开始正式部署单机 TC Server,这里艿艿使用 macOS 系统,和 Linux、Windows 是差不多的,朋友脑补翻译。
2.1 下载 Seata 软件包
打开 Seata 下载页面,选择想要的 Seata 版本。这里,我们选择 v1.1.0 最新版本。
# 创建目录
$ mkdir -p /Users/yunai/Seata
$ cd /Users/yunai/Seata
# 下载
$ wget https://github.com/apache/incubator-seata/releases/download/v1.1.0/seata-server-1.1.0.tar.gz
# 解压
$ tar -zxvf seata-server-1.1.0.tar.gz
# 查看目录
$ cd seata
$ ls -ls
24 -rw-r--r-- 1 yunai staff 11365 May 13 2019 LICENSE
0 drwxr-xr-x 4 yunai staff 128 Apr 2 07:46 bin # 执行脚本
0 drwxr-xr-x 9 yunai staff 288 Feb 19 23:49 conf # 配置文件
0 drwxr-xr-x 138 yunai staff 4416 Apr 2 07:46 lib # seata-*.jar + 依赖库