分布式事务优化

pull/4/head
595208882@qq.com 3 years ago
parent cbaae41a26
commit 53bc5f0150

@ -5921,119 +5921,104 @@ Saga事务模型又叫做长时间运行的事务。其核心思想是**「将
## Seate
**XA和Seata区别**
![XA和Seata的区别](images/Solution/xa-seata.png)
![XA过程](images/Solution/XA过程.png)
![seata过程](images/Solution/seata过程.png)
Seata 中有三大模块,分别是 TM、RM 和 TC。 其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起TC 作为 Seata 的服务端独立部署。
Seata 是一款开源的分布式事务解决方案致力于在微服务架构下提供高性能和简单易用的分布式事务服务。目前已支持Dubbo、Spring Cloud、Sofa-RPC、Motan和grpc等RPC框架。
![seata流程](images/Solution/seata流程.png)
在 Seata 中,分布式事务的执行流程:
- TM 开启分布式事务TM 向 TC 注册全局事务记录)
- 按业务场景编排数据库、服务等事务内资源RM 向 TC 汇报资源准备状态
- TM 结束分布式事务事务一阶段结束TM 通知 TC 提交/回滚分布式事务)
- TC 汇总事务信息,决定分布式事务是提交还是回滚
- TC 通知所有 RM 提交/回滚 资源,事务二阶段结束
Seata主要分为以下三大模块
![seata](images/Solution/seata.png)
- **TC (Transaction Coordinator) - 事务协调者**
- Transaction Coordinator(TC)
维护全局和分支事务的状态,驱动全局事务提交或回滚。
事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
- **TM (Transaction Manager) - 事务管理器**
- Transaction Manager(TM)
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
- **RM (Resource Manager) - 资源管理器**
- Resource Manager(RM)
管理分支事务处理的资源与TC交谈以注册分支事务和报告分支事务的状态并驱动分支事务提交或回滚。
控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
Seata 会有 4 种分布式事务解决方案分别是AT 模式、TCC 模式、Saga 模式和 XA 模式。
![seata发展历程](images/Solution/seata发展历程.png)
> 注意:其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起TC 作为 Seata 的服务端独立部署。
### AT模式
2019年1月Seata 开源了 AT 模式。AT 模式是一种无侵入的分布式事务解决方案。在 AT 模式下,用户只需关注自己的“业务 SQL”用户的 “业务 SQL” 作为一阶段Seata 框架会自动生成事务的二阶段提交和回滚操作
AT模式提供了无侵入自动补偿的事务模式目前已支持MySQL、Oracle、PostgreSQL、TiDB和MariaDB的AT模式H2、DB2、SQLServer等。
![AT 模式](images/Solution/AT模式.png)
**AT模式如何做到对业务的无侵入 **
**AT模式的前提**
- **一阶段**
- **基于支持本地 ACID事务的关系型数据库**
- **Java应用通过JDBC访问数据库**
在一阶段Seata 会拦截“业务 SQL”首先解析 SQL 语义,找到“业务 SQL”要更新的业务数据在业务数据被更新前将其保存成“before image”然后执行“业务 SQL”更新业务数据在业务数据更新之后再将其保存成“after image”最后生成行锁。以上操作全部在一个数据库事务内完成这样保证了一阶段操作的原子性。
![AT模式一阶段](images/Solution/AT模式一阶段.png)
- **二阶段提交**
二阶段如果是提交的话,因为“业务 SQL”在一阶段已经提交至数据库 所以 Seata 框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理即可。
**整体机制**
![AT模式二阶段提交](images/Solution/AT模式二阶段提交.png)
- 第一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源
- 第二阶段
- 提交异步化,非常快速地完成
- 回滚通过一阶段的回滚日志进行反向补偿
- **二阶段回滚**
二阶段如果是回滚的话Seata 就需要回滚一阶段已经执行的“业务 SQL”还原业务数据。回滚方式便是用“before image”还原业务数据但在还原前要首先要校验脏写对比“数据库当前业务数据”和 “after image”如果两份数据完全一致就说明没有脏写可以还原业务数据如果不一致就说明有脏写出现脏写就需要转人工处理。
![AT模式二阶段回滚](images/Solution/AT模式二阶段回滚.png)
### TCC模式
AT 模式的一阶段、二阶段提交和回滚均由 Seata 框架自动生成,用户只需编写“业务 SQL”便能轻松接入分布式事务AT 模式是一种对业务无任何侵入的分布式事务解决方案。
一个分布式的全局事务,整体是 **两阶段提交** 的模型。全局事务是由若干分支事务组成的,分支事务要满足 **两阶段提交** 的模型要求,即需要每个分支事务都具备自己的:
- 一阶段 prepare 行为
- 二阶段 commit 或 rollback 行为
![Seate-TCC](images/Solution/Seate-TCC.png)
### TCC模式
根据两阶段行为模式的不同,我们将分支事务划分为:
2019 年 3 月份Seata 开源了 TCC 模式该模式由蚂蚁金服贡献。TCC 模式需要用户根据自己的业务场景实现 Try、Confirm 和 Cancel 三个操作;事务发起方在一阶段 执行 Try 方式,在二阶段提交执行 Confirm 方法,二阶段回滚执行 Cancel 方法。
- **Automatic (Branch) Transaction Mode**
- **Manual (Branch) Transaction Mode**
![TCC模式](images/Solution/TCC模式.png)
AT 模式基于 **支持本地 ACID 事务** 的 **关系型数据库**
TCC 三个方法描述:
- 一阶段 prepare 行为:在本地事务中,一并提交业务数据更新和相应回滚日志记录
- 二阶段 commit 行为:马上成功结束,**自动** 异步批量清理回滚日志
- 二阶段 rollback 行为:通过回滚日志,**自动** 生成补偿操作,完成数据回滚
- Try资源的检测和预留
- Confirm执行的业务操作提交要求 Try 成功 Confirm 一定要能成功
- Cancel预留资源释放
TCC 模式,不依赖于底层数据资源的事务支持:
- 一阶段 prepare 行为:调用 **自定义** 的 prepare 逻辑
- 二阶段 commit 行为:调用 **自定义** 的 commit 逻辑
- 二阶段 rollback 行为:调用 **自定义** 的 rollback 逻辑
所谓 TCC 模式,是指支持把 **自定义** 的分支事务纳入到全局事务的管理中。
**业务模型分 2 阶段设计:**
用户接入 TCC ,最重要的是考虑如何将自己的业务模型拆成两阶段来实现。
以“扣钱”场景为例,在接入 TCC 前,对 A 账户的扣钱,只需一条更新账户余额的 SQL 便能完成;但是在接入 TCC 之后,用户就需要考虑如何将原来一步就能完成的扣钱操作,拆成两阶段,实现成三个方法,并且保证一阶段 Try 成功的话 二阶段 Confirm 一定能成功。
### Saga模式
![kqcq](images/Solution/kqcq.png)
Saga模式是SEATA提供的长事务解决方案在Saga模式中业务流程中每个参与者都提交本地事务当出现某一个参与者失败则补偿前面已经成功的参与者一阶段正向服务和二阶段补偿服务都由业务开发实现。
如上图所示Try 方法作为一阶段准备方法需要做资源的检查和预留。在扣钱场景下Try 要做的事情是就是检查账户余额是否充足,预留转账资金,预留的方式就是冻结 A 账户的 转账资金。Try 方法执行之后,账号 A 余额虽然还是 100但是其中 30 元已经被冻结了,不能被其他事务使用。
![Saga模式](images/Solution/Saga模式.png)
二阶段 Confirm 方法执行真正的扣钱操作。Confirm 会使用 Try 阶段冻结的资金执行账号扣款。Confirm 方法执行之后,账号 A 在一阶段中冻结的 30 元已经被扣除,账号 A 余额变成 70 元 。
**适用场景:**
如果二阶段是回滚的话,就需要在 Cancel 方法内释放一阶段 Try 冻结的 30 元,使账号 A 的回到初始状态100 元全部可用。
- **业务流程长、业务流程多**
- **参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口**
用户接入 TCC 模式,最重要的事情就是考虑如何将业务模型拆成 2 阶段,实现成 TCC 的 3 个方法,并且保证 Try 成功 Confirm 一定能成功。相对于 AT 模式TCC 模式对业务代码有一定的侵入性,但是 TCC 模式无 AT 模式的全局行锁TCC 性能会比 AT 模式高很多。
**优势:**
### Saga模式
- **一阶段提交本地事务,无锁,高性能**
- **事件驱动架构,参与者可异步执行,高吞吐**
- **补偿服务易于实现**
Saga 模式是 Seata 即将开源的长事务解决方案,将由蚂蚁金服主要贡献。在 Saga 模式下,分布式事务内有多个参与者,每一个参与者都是一个冲正补偿服务,需要用户根据业务场景实现其正向操作和逆向回滚操作。
分布式事务执行过程中,依次执行各参与者的正向操作,如果所有正向操作均执行成功,那么分布式事务提交。如果任何一个正向操作执行失败,那么分布式事务会去退回去执行前面各参与者的逆向回滚操作,回滚已提交的参与者,使分布式事务回到初始状态。
![Saga模式](images/Solution/Saga模式.png)
**缺点:**
Saga 模式下分布式事务通常是由事件驱动的各个参与者之间是异步执行的Saga 模式是一种长事务解决方案。
- **不保证隔离性**

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Loading…
Cancel
Save