Seat 学习

Seat 学习,第1张

Seat 学习 一、Seata 简介

Seata(Simple Extensible Autonomous Transaction Architecture)是一套一站式分布式事务解决方案,是阿里集团和蚂蚁金服联合打造的分布式事务框架。

发展史

二、 特色功能
  1. 微服务框架支持
    ⽬前已支持 Dubbo、Spring Cloud、Sofa-RPC、Motan 和 grpc 等RPC框架,其他框架持续集成中
  2. AT 模式
    提供无侵入自动补偿的事务模式,目前已支持 MySQL、 Oracle 、PostgreSQL和 TiDB的AT模式,H2 开发中
  3. TCC 模式
    支持 TCC 模式并可与 AT 混用,灵活度更高
  4. SAGA 模式
    为长事务提供有效的解决⽅案
  5. XA 模式
    支持已实现 XA 接口的数据库的 XA 模式
  6. ⾼可⽤
    支持基于数据库存储的集群模式,水平扩展能力强
三、结构

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 提交/回滚 资源,事务⼆阶段结束。
四、Seata-AT模式 4.1 AT模式介绍

AT 模式是⼀种⽆侵⼊的分布式事务解决⽅案。在 AT 模式下,⽤户只需关注⾃⼰的“业务 SQL”,⽤户的 “业务 SQL” 作为⼀阶段,Seata 框架会⾃动⽣成事务的⼆阶段提交和回滚 *** 作。

4.2 AT模式原理 4.2.1 ⼀阶段

在⼀阶段,Seata 会拦截“业务 SQL”,⾸先解析 SQL 语义,找到“业务 SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,然后执⾏“业务 SQL”更新业务数据,在业务数据更新之后,再将其保存成“after image”,最后⽣成⾏锁。以上 *** 作全部在⼀个数据库事务内完成,这样保证了⼀阶段 *** 作的原⼦性。

4.2.2 ⼆阶段提交

⼆阶段如果是提交的话,因为“业务 SQL”在⼀阶段已经提交⾄数据库, 所以 Seata 框架只需将
⼀阶段保存的快照数据和⾏锁删掉,完成数据清理即可。

4.2.3 ⼆阶段回滚

⼆阶段如果是回滚的话,Seata 就需要回滚⼀阶段已经执⾏的“业务 SQL”,还原业务数据。回滚⽅式便是⽤“before image”还原业务数据;但在还原前要⾸先要校验脏写,对⽐“数据库当前业务数据”和 “after image”,如果两份数据完全⼀致就说明没有脏写,可以还原业务数据,如果不⼀致就说明有脏写,出现脏写就需要转⼈⼯处理。

4.3 AT模式改造 4.4.1 Seata Server

TC全局事务协调器

  1. Seata Server 就是 TC,TC 则是⼀个独立服务。直接从官⽅仓库下载启动即可。
  2. Seata Server 要向注册中⼼进⾏注册,搭建nacos注册中⼼,配置registry.conf,修改配置中心为nacos。
  3. 下载配置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。
  4. 可以选择修改config.txt中Server端存储的模式(store.mode),现有file,db,redis三种。主要存储全局事务会话信息,分⽀事务信息, 锁记录表信息,seata-server默认是file模式。file只能⽀持单机模式, 如果想要⾼可⽤模式的话可以切换db或者redis。如果使用db模式,还需要创建seata数据库,需要创建global_table/branch_table/lock_table三张表。
  5. 启动seata Server即可。
4.4.2 TM/RM端整合Seata

AT 模式在RM端需要 UNDO_LOG 表,来记录每个RM的事务信息,主要包含数据修改前,后的相关信息,⽤于回滚处理。
TM/RM端整合seata⼀共有五个步骤:

  1. 添加依赖seata-all,可以创建一个通用配置工程。将配置都放到该工程,因为这些配置都是TM/RM必须的配置。

  2. 复制Seata-Server 的registry.conf到工程中。

  3. 在yml配置文件中添加事务分组设置,spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group。如果Seata-Server的集群中的分组出现故障,可以快速重新设置分组,进行故障切换转移。

  4. 设置DataSourceProxy数据源,排除自动配置的数据源。

  5. 在事务所在服务上添加注解@GlobalTransactional,也就是配置该服务为TM。

五、Seata-TCC模式 5.1 TCC模式介绍

Seata 开源了 TCC 模式,该模式由蚂蚁⾦服贡献。TCC 模式需要⽤户根据⾃⼰的业务场景实现Try、Confirm 和 Cancel 三个 *** 作;事务发起⽅在⼀阶段 执⾏ Try ⽅式,在⼆阶段提交执⾏ /confirm/i⽅法,⼆阶段回滚执⾏ Cancel ⽅法。

⽤户接⼊ TCC 模式,最重要的事情就是考虑如何将业务模型拆成 2 阶段,实现成 TCC 的 3 个⽅法,并且保证 Try 成功 Confirm ⼀定能成功。相对于 AT 模式,TCC 模式对业务代码有⼀定的侵⼊性,但是 TCC 模式⽆ AT 模式的全局⾏锁,TCC 性能会⽐ AT 模式⾼很多。

5.2 业务模型2 阶段设计

⽤户接⼊ TCC ,最重要的是考虑如何将⾃⼰的业务模型拆成两阶段来实现。

以“扣钱”场景为例,在接⼊ TCC 前,对 A 账户的扣钱,只需⼀条更新账户余额的 SQL 便能完成;但是在接⼊ TCC 之后,⽤户就需要考虑如何将原来⼀步就能完成的扣钱 *** 作,拆成两阶段,实现成三个⽅法,并且保证⼀阶段 Try 成功的话 ⼆阶段 Confirm ⼀定能成功。

5.3 TCC模式改造

针对RM端,实现起来需要完成try/commit/rollback的实现,所以步骤相对较多但是前三步骤和AT模式⼀样

  1. 重新设计业务,分两阶段设计,修改数据库字段。
  2. 相比于AT模式,将代理数据源去掉即可。
  3. 接口类添加@LocalTCC注解,添加相应的Commit,RollBack方法。
  4. TM端,在事务所在服务上添加注解@GlobalTransactional。
六、推荐阅读

推荐阅读AT,XA,TCC,Saga

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5482815.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存