1. fescar分布式事务(概览)
1.1. 概述
Fescar 是 阿里巴巴 开源的 分布式事务中间件,以 高效 而且对业务0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题。git
1.2. Fescar 的发展历程
- 2014 年,阿里中间件团队发布 TXC(Taobao Transaction Constructor),为集团内应用提供分布式事务服务。
- 2016 年,TXC 通过产品化改造,以 GTS(Global Transaction Service) 的身份登录阿里云,成为当时业界惟一一款云上分布式事务产品 ,在阿云里的公有云、专有云解决方案中,开始服务于众多外部客户。
- 2019 年起,基于 TXC 和 GTS 的技术积累,阿里中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback, FESCAR),和社区一块儿建设这个分布式事务解决方案。
1.3. 设计初衷
- 对业务无侵入
- 高性能
1.4. 原理和设计
1.4.1. 设计概念图

- Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
- Transaction Manager (TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
- Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
1.4.2. 与 XA 的差异在什么地方?

- XA 方案的 RM 其实是在数据库层 ,RM 本质上就是数据库自身(经过提供支持 XA 的驱动程序来供应用使用)。
- 而 Fescar 的 RM 是以二方包的形式做为中间件层部署在应用程序这一侧的,不依赖与数据库自己对协议的支持,固然也不须要数据库支持 XA 协议。这点对于微服务化的架构来讲是很是重要的:应用层不须要为本地事务和分布式事务两类不一样场景来适配两套不一样的数据库驱动。
- 这个设计,剥离了分布式事务方案对数据库在 协议支持 上的要求
1.4.3. 两阶段提交
1.4.3.1. XA 的 2PC 过程
-
XA 的 2PC 过程
github
-
不管 Phase2 的决议是 commit 仍是 rollback,事务性资源的锁都要保持到 Phase2 完成才释放。 设想一个正常运行的业务,大几率是 90% 以上的事务最终应该是成功提交的,咱们是否能够在 Phase1 就将本地事务提交呢?这样 90% 以上的状况下,能够省去 Phase2 持锁的时间,总体提升效率。数据库
1.4.3.2. fescar的 2PC 过程

- 分支事务中数据的 本地锁 由本地事务管理,在分支事务 Phase1 结束时释放。
- 同时,随着本地事务结束,链接 也得以释放。
- 分支事务中数据的 全局锁 在事务协调器侧管理,在决议 Phase2 全局提交时,全局锁立刻能够释放。只有在决议全局回滚的状况下,全局锁 才被持有至分支的 Phase2 结束。
- 这个设计,极大地减小了分支事务对资源(数据和链接)的锁定时间,给总体并发和吞吐的提高提供了基础。
1.4.4. 分支事务如何提交和回滚?(重点)
-
首先,应用须要使用 Fescar 的 JDBC 数据源代理,也就是 Fescar 的 RM
架构
-
Fescar 的 JDBC 数据源代理经过对业务 SQL 的解析,把业务数据在更新先后的数据镜像组织成回滚日志,利用 本地事务 的 ACID 特性,将业务数据的更新和回滚日志的写入在同一个 本地事务 中提交。并发
-
这样,能够保证:任何提交的业务数据的更新必定有相应的回滚日志存在
框架
-
若是决议是全局提交,此时分支事务此时已经完成提交,不须要同步协调处理(只须要异步清理回滚日志),Phase2 能够很是快速地完成。异步
-
若是决议是全局回滚,RM 收到协调器发来的回滚请求,经过 XID 和 Branch ID 找到相应的回滚日志记录,经过回滚记录生成反向的更新 SQL 并执行,以完成分支的回滚。分布式
1.4.5. 事务传播机制
- XID 是一个全局事务的惟一标识,事务传播机制要作的就是把 XID 在服务调用链路中传递下去,并绑定到服务的事务上下文中,这样,服务链路中的数据库更新操做,就都会向该 XID 表明的全局事务注册分支,归入同一个全局事务的管辖。
- 基于这个机制,Fescar 是能够支持任何微服务 RPC 框架的。只要在特定框架中找到能够透明传播 XID 的机制便可,好比,Dubbo 的 Filter + RpcContext。
1.4.6. 分支的基本行为模式
做为全局事务一部分的分支事务,除自己的业务逻辑外,都包含 4 个与协调器交互的行为:微服务
- 分支注册: 在分支事务的数据操做进行以前,须要向协调器注册,把即将进行的分支事务数据操做,归入一个已经开启的全局事务的管理中去,在分支注册成功后,才能够进行数据操做。
- 状态上报: 在分支事务的数据操做完成后,须要向事务协调器上报其执行结果。
- 分支提交:响应协调器发出的分支事务提交的请求,完成分支提交。
- 分支回滚:响应协调器发出的分支事务回滚的请求,完成分支回滚。

1.4.7. AT 模式分支的行为模式
- 业务逻辑不须要关注事务机制,分支与全局事务的交互过程自动进行

1.4.8. MT 模式分支的行为模式
- 业务逻辑须要被分解为 Prepare/Commit/Rollback 3 部分,造成一个 MT 分支,加入全局事务。

1.4.9. 混合模式
由于 AT 和 MT 模式的分支从根本上行为模式是一致的,因此能够彻底兼容,即,一个全局事务中,能够同时存在 AT 和 MT 的分支。这样就能够达到全面覆盖业务场景的目的:AT 模式能够支持的,使用 AT 模式;AT 模式暂时支持不了的,用 MT 模式来替代。另外,天然的,MT 模式管理的非事务性资源也能够和支持事务的关系型数据库资源一块儿,归入同一个分布式事务的管理中。性能
1.5. 初步的版本规划
v0.1.0
- 微服务框架支持: Dubbo
- 数据库支持: MySQL
- 基于 Spring AOP 的 Annotation
- 事务协调器: 单机版本
v0.5.x
- 微服务框架支持: Spring Cloud
- MT 模式
- 支持 TCC 模式事务的适配
- 动态配置和服务发现
- 事务协调器: 高可用集群版本
v0.8.x
- Metrics
- 控制台: 监控/部署/升级/扩缩容
v1.0.0
- General Availability: 生产环境适用
v1.5.x
- 数据库支持: Oracle/PostgreSQL/OceanBase
- 不依赖 Spring AOP 的 Annotation
- 热点数据的优化处理机制
- RocketMQ 事务消息归入全局事务管理
- NoSQL 归入全局事务管理的适配机制
- 支持 HBase
- 支持 Redis
v2.0.0
- 支持 XA 固然,项目迭代演进的过程,咱们最重视的是社区的声音,路线图会和社区充分交流及时进行调整。
1.6. 总结
看完概览,我一口鲜血喷出来,明明说好的支持任何微服务RPC框架,我如今要在适合SpringCloud的分布式事务解决方案中挑选个,你告诉我预计下下下下个版本会集成SpringCloud,路过的大神,推荐个吧
1.7. github开源地址
https://github.com/alibaba/fescar/