Seata(Simple Extensible Autonomous Transaction Architecture)是一套一站式分布式事务解决方案,是阿里集团和蚂蚁金服联合打造的分布式事务框架。
发展史
- 微服务框架支持
⽬前已支持 Dubbo、Spring Cloud、Sofa-RPC、Motan 和 grpc 等RPC框架,其他框架持续集成中 - AT 模式
提供无侵入自动补偿的事务模式,目前已支持 MySQL、 Oracle 、PostgreSQL和 TiDB的AT模式,H2 开发中 - TCC 模式
支持 TCC 模式并可与 AT 混用,灵活度更高 - SAGA 模式
为长事务提供有效的解决⽅案 - XA 模式
支持已实现 XA 接口的数据库的 XA 模式 - ⾼可⽤
支持基于数据库存储的集群模式,水平扩展能力强
Seata 中有三⼤模块,分别是 TM、RM 和 TC。其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在⼀起,TC 作为 Seata 的服务端独⽴部署。
TC (Transaction Coordinator) - 事务协调者
维护全局和分⽀事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分⽀事务处理的资源,与TC交谈以注册分⽀事务和报告分⽀事务的状态,并驱动分⽀事务提交或回滚。
在 Seata 中,分布式事务的执行流程:
- TM 开启分布式事务, TM会 向 TC 注册全局事务记录;
- *** 作具体业务模块的数据库 *** 作之前, RM 会向 TC 注册分⽀事务;
- 当业务 *** 作完事后.TM会通知 TC 提交/回滚分布式事务;
- TC 汇总事务信息,决定分布式事务是提交还是回滚;
- TC 通知所有 RM 提交/回滚 资源,事务⼆阶段结束。
AT 模式是⼀种⽆侵⼊的分布式事务解决⽅案。在 AT 模式下,⽤户只需关注⾃⼰的“业务 SQL”,⽤户的 “业务 SQL” 作为⼀阶段,Seata 框架会⾃动⽣成事务的⼆阶段提交和回滚 *** 作。
在⼀阶段,Seata 会拦截“业务 SQL”,⾸先解析 SQL 语义,找到“业务 SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,然后执⾏“业务 SQL”更新业务数据,在业务数据更新之后,再将其保存成“after image”,最后⽣成⾏锁。以上 *** 作全部在⼀个数据库事务内完成,这样保证了⼀阶段 *** 作的原⼦性。
⼆阶段如果是提交的话,因为“业务 SQL”在⼀阶段已经提交⾄数据库, 所以 Seata 框架只需将
⼀阶段保存的快照数据和⾏锁删掉,完成数据清理即可。
⼆阶段如果是回滚的话,Seata 就需要回滚⼀阶段已经执⾏的“业务 SQL”,还原业务数据。回滚⽅式便是⽤“before image”还原业务数据;但在还原前要⾸先要校验脏写,对⽐“数据库当前业务数据”和 “after image”,如果两份数据完全⼀致就说明没有脏写,可以还原业务数据,如果不⼀致就说明有脏写,出现脏写就需要转⼈⼯处理。
TC全局事务协调器
- Seata Server 就是 TC,TC 则是⼀个独立服务。直接从官⽅仓库下载启动即可。
- Seata Server 要向注册中⼼进⾏注册,搭建nacos注册中⼼,配置registry.conf,修改配置中心为nacos。
- 下载配置config.txt https://github.com/seata/seata/tree/develop/script/config-center,配置事务配置信息。使⽤nacos-config.sh ⽤于向 Nacos 中添加配置下载地址:https://github.com/seata/seata/tree/develop/script/config-center/nacos。
- 可以选择修改config.txt中Server端存储的模式(store.mode),现有file,db,redis三种。主要存储全局事务会话信息,分⽀事务信息, 锁记录表信息,seata-server默认是file模式。file只能⽀持单机模式, 如果想要⾼可⽤模式的话可以切换db或者redis。如果使用db模式,还需要创建seata数据库,需要创建global_table/branch_table/lock_table三张表。
- 启动seata Server即可。
AT 模式在RM端需要 UNDO_LOG 表,来记录每个RM的事务信息,主要包含数据修改前,后的相关信息,⽤于回滚处理。
TM/RM端整合seata⼀共有五个步骤:
-
添加依赖seata-all,可以创建一个通用配置工程。将配置都放到该工程,因为这些配置都是TM/RM必须的配置。
-
复制Seata-Server 的registry.conf到工程中。
-
在yml配置文件中添加事务分组设置,spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group。如果Seata-Server的集群中的分组出现故障,可以快速重新设置分组,进行故障切换转移。
-
设置DataSourceProxy数据源,排除自动配置的数据源。
-
在事务所在服务上添加注解@GlobalTransactional,也就是配置该服务为TM。
Seata 开源了 TCC 模式,该模式由蚂蚁⾦服贡献。TCC 模式需要⽤户根据⾃⼰的业务场景实现Try、Confirm 和 Cancel 三个 *** 作;事务发起⽅在⼀阶段 执⾏ Try ⽅式,在⼆阶段提交执⾏ /confirm/i⽅法,⼆阶段回滚执⾏ Cancel ⽅法。
⽤户接⼊ TCC 模式,最重要的事情就是考虑如何将业务模型拆成 2 阶段,实现成 TCC 的 3 个⽅法,并且保证 Try 成功 Confirm ⼀定能成功。相对于 AT 模式,TCC 模式对业务代码有⼀定的侵⼊性,但是 TCC 模式⽆ AT 模式的全局⾏锁,TCC 性能会⽐ AT 模式⾼很多。
⽤户接⼊ TCC ,最重要的是考虑如何将⾃⼰的业务模型拆成两阶段来实现。
以“扣钱”场景为例,在接⼊ TCC 前,对 A 账户的扣钱,只需⼀条更新账户余额的 SQL 便能完成;但是在接⼊ TCC 之后,⽤户就需要考虑如何将原来⼀步就能完成的扣钱 *** 作,拆成两阶段,实现成三个⽅法,并且保证⼀阶段 Try 成功的话 ⼆阶段 Confirm ⼀定能成功。
针对RM端,实现起来需要完成try/commit/rollback的实现,所以步骤相对较多但是前三步骤和AT模式⼀样
- 重新设计业务,分两阶段设计,修改数据库字段。
- 相比于AT模式,将代理数据源去掉即可。
- 接口类添加@LocalTCC注解,添加相应的Commit,RollBack方法。
- TM端,在事务所在服务上添加注解@GlobalTransactional。
推荐阅读AT,XA,TCC,Saga
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)