阿里Seata分布式事物(1)

Mingyang.Hao Mingyang.Hao | 136 | 2022-07-08

什么是seata

img

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

Seata 实现分布式事务,设计了一个关键角色 UNDO_LOG (回滚日志记录表),我们在每个应用分布式事务的业务库中创建这张表,这个表的核心作用就是,将业务数据在更新前后的数据镜像组织成回滚日志,备份在 UNDO_LOG 表中,以便业务异常能随时回滚。

Seata分TC、TM和RM三个角色,TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成。

TmClient的初始化流程

启动ScheduledExecutorService定时执行器,每5秒尝试进行一次重连seata-server
重连时,先从file.conf中根据分组名称(service_group)找到集群名称(cluster_name)
再根据集群名称找到fescar-server集群ip端口列表
从ip列表中选择一个用netty进行连接

RmClient.init()

1、设置了资源管理器resourceManager
2、设置了消息回调监听器,rmHandler用于接收fescar-server在二阶段发出的提交或者回滚请求

RmClient初始化时用到了Java Spi拓展机制,Seata中对ResourceManager,AbstractRMHandler做了SPI适配

初始化DefaultResouceManager时会使用ClassLoader去加载对应Jar下的实现,而默认AT模式使用的实现是数据库,也就是rm-datasource包下的实现,找实现类路径需要定位到/resources/META-INF/扩展接口全路径去找

找到了对应实现类的全路径

ResourceManager对应实现类全路径 io.seata.rm.datasource.DataSourceManager,该类中指定了了提交和回滚的方法
DefaultRMHandler对应实现类全路径io.seata.rm.RMHandlerAT,该类在二阶段代码分析过程再做细讲,只需先记住是个接收server消息并做对应提交或者回滚操作的回调处理类
init()方法,和TmClient初始化过程基本一致

Seata 流程

  1. Spring启动时,初始化了2个客户端TmClient、RmClient
  2. TmClient与Server通过Netty建立连接并发送消息
  3. RmClient与Server通过Netty建立连接,负责接收二阶段提交、回滚消息并在回调器(RmHandler)中做处理

在这里插入图片描述

Seata 分布式事务的角色:

  • Transaction Coordinator(TC): 全局事务协调者,用来协调全局事务和各个分支事务(不同服务)的状态, 驱动全局事务和各个分支事务的回滚或提交。
  • Transaction Manager™: 事务管理者,业务层中用来开启/提交/回滚一个整体事务(在调用服务的方法中用注解开启事务)。
  • Resource Manager(RM): 资源管理者,一般指业务数据库代表了一个分支事务(Branch Transaction),管理分支事务与 TC 进行协调注册分支事务并且汇报分支事务的状态,驱动分支事务的提交或回滚。

img

重要机制

(1)全局事务的回滚是如何实现的呢?

Seata 有一个重要的机制:回滚日志

每个分支事务对应的数据库中都需要有一个回滚日志表 UNDO_LOG,在真正修改数据库记录之前,都会先记录修改前的记录值,以便之后回滚。

在收到回滚请求后,就会根据 UNDO_LOG 生成回滚操作的 SQL 语句来执行。

如果收到的是提交请求,就把 UNDO_LOG 中的相应记录删除掉。

(2)RM 是怎么自动和 TC 交互的?

是通过监控拦截JDBC实现的,例如监控到开启本地事务了,就会自动向 TC 注册、生成回滚日志、向 TC 汇报执行结果。

(3)二阶段回滚失败怎么办?

例如 TC 命令各个 RM 回滚的时候,有一个微服务挂掉了,那么所有正常的微服务也都不会执行回滚,当这个微服务重新正常运行后,TC 会重新执行全局回滚。

文章标签: 分布式
推荐指数:

真诚点赞 诚不我欺~

阿里Seata分布式事物(1)

点赞 收藏 评论

关于作者

Mingyang.Hao
Mingyang.Hao

这个人很懒~

等级 LV1

粉丝 0

获赞 4

经验 70