Seata 是阿里巴巴开源的分布式事务解决方案,旨在为微服务架构提供高性能和易用的分布式事务支持。
以下是 Seata 实现原理的详细说明,使用中文回答:
- 总体架构
Seata 采用 客户端-服务端架构,分为三个核心组件:
-
Transaction Coordinator (TC):事务协调者,服务端,负责全局事务的协调和管理,维护事务状态。
-
Transaction Manager (TM):事务发起者,客户端,负责发起和提交/回滚全局事务。
-
Resource Manager (RM):资源管理者,客户端,负责管理分支事务(Branch Transaction),与数据库交互。
Seata 支持多种分布式事务模式,包括 AT(Automatic Transaction)、TCC(Try-Confirm-Cancel)、SAGA 和 XA,其中 AT 模式是最常用的模式。
- 核心概念
-
全局事务:一个分布式事务,包含多个分支事务,整体由 TC 协调。
-
分支事务:每个微服务中的本地事务,由 RM 管理,与全局事务关联。
-
XID:全局事务的唯一标识,用于关联 TM、RM 和 TC。
-
事务日志:Seata 使用 undo_log 表(AT 模式)或状态机(SAGA/TCC)记录事务状态。
- 实现原理
(1) 分布式事务模式
Seata 支持以下几种事务模式,核心实现原理有所不同:
AT 模式(自动事务)
AT 模式是 Seata 默认的模式,类似 XA 事务,但通过自动解析 SQL 实现无侵入性。
- 第一阶段(执行阶段):
-
SQL 解析:RM 拦截业务 SQL,解析 SQL 语义,提取操作的数据快照(before image)。
-
本地事务执行:执行本地事务,生成 after image(数据变更后快照)。
-
生成 Undo Log:将 before image 和 after image 记录到数据库的 `undo_log` 表中,包含回滚信息。
-
注册分支事务:RM 向 TC 注册分支事务,报告事务状态。
-
提交本地事务:本地事务提交,但不影响全局事务。
- 第二阶段(提交/回滚阶段):
-
提交:如果全局事务提交成功,TC 通知 RM 异步删除对应的 `undo_log` 记录。
-
回滚:如果全局事务需要回滚,TC 通知 RM,RM 根据 `undo_log` 中的 before image 恢复数据。
-
关键点:
-
通过 `DataSourceProxy` 代理数据源,自动解析 SQL 和生成快照。
-
Undo Log 确保数据可回滚,降低业务侵入性。
-
性能较高,适合高并发场景。
TCC 模式
TCC 模式基于业务层面的 Try-Confirm-Cancel 逻辑,需手动实现接口。
-
Try 阶段:检查资源并预留(如冻结资金)。
-
Confirm 阶段:确认操作,完成资源变更。
-
Cancel 阶段:如果失败,执行取消逻辑,释放资源。
-
关键点:
-
由业务代码实现 Try、Confirm、Cancel 接口,侵入性较高。
-
TC 协调分支事务状态,记录事务日志到数据库。
-
适合对性能要求极高或无法使用 AT 模式的场景。
SAGA 模式
SAGA 模式基于状态机,适合长事务场景。
-
每个服务定义正向操作和补偿操作(类似 TCC 的 Cancel)。
-
Seata 使用状态机引擎协调事务,记录事务状态。
-
如果某步骤失败,执行前序步骤的补偿操作。
-
关键点:
-
支持复杂业务流程,适合跨多个服务的长事务。
-
需手动实现补偿逻辑。
XA 模式
XA 模式基于数据库的 XA 协议,Seata 作为 XA 事务协调者。
-
第一阶段:各 RM 执行本地 XA 事务,进入 Prepared 状态。
-
第二阶段:TC 通知 RM 提交或回滚 XA 事务。
-
关键点:
-
依赖数据库支持 XA 协议,性能较低。
-
适用于需要强一致性的场景。
(2) 事务协调流程
- 事务发起:
- TM 通过 `@GlobalTransactional` 注解或 API 发起全局事务,向 TC 注册全局事务,生成 XID。
- 分支事务执行:
-
每个微服务的 RM 执行本地事务,注册分支事务到 TC。
-
RM 报告分支事务状态(成功/失败)。
- 全局事务提交/回滚:
-
TM 根据业务逻辑决定提交或回滚,通知 TC。
-
TC 协调所有 RM,执行第二阶段的提交或回滚操作。
- 异常处理:
-
如果某分支事务失败,TC 触发全局回滚。
-
TC 确保所有分支事务最终一致(通过重试或补偿)。
(3) 数据存储与一致性
-
事务日志存储:
-
TC 存储全局事务和分支事务状态到数据库(如 MySQL)或文件系统。
-
AT 模式下,`undo_log` 表存储数据快照。
-
TCC/SAGA 模式下,事务日志记录操作状态。
-
一致性保证:
-
TC 使用数据库事务或分布式锁确保状态一致。
-
AT 模式通过 Undo Log 实现最终一致性。
-
TCC/SAGA 模式通过补偿机制实现最终一致性。
- 高可用与性能优化
-
TC 高可用:
-
TC 支持集群部署,事务日志存储在共享数据库(如 MySQL)或 Redis 中。
-
使用分布式锁或乐观锁避免并发冲突。
-
性能优化:
-
AT 模式通过异步删除 Undo Log 降低性能开销。
-
批量提交/回滚减少网络交互。
-
支持异步事务提交,提高吞吐量。
-
容错机制:
-
RM 支持重试机制,处理网络或数据库故障。
-
TC 提供事务状态检查,处理异常中断情况。
5.与 Nacos 的集成
Seata 可以与 Nacos 集成,实现配置管理和注册中心功能:
-
配置管理:Nacos 存储 Seata 的全局配置(如 TC 地址、事务组)。
-
服务注册:Seata 的 TC 和 RM 注册到 Nacos,支持动态发现。
-
动态规则:通过 Nacos 推送事务规则(如超时时间、回滚策略)。
- 关键技术点
-
拦截器:Seata 使用 `DataSourceProxy` 和 `ConnectionProxy` 拦截 SQL,自动解析和生成 Undo Log。
-
全局锁:AT 模式下,Seata 使用全局锁防止并发修改数据。
-
异步处理:第二阶段提交/回滚异步执行,减少阻塞。
-
扩展性:支持 SPI 机制,允许自定义存储、事务模式等。
- 第一阶段:
-
TM 向 TC 注册全局事务,生成 XID。
-
RM 拦截 `reduceStock` 和 `createOrder` 的 SQL,生成 Undo Log。
-
本地事务提交,RM 向 TC 注册分支事务。
- 第二阶段:
-
如果 `purchase` 成功,TM 通知 TC 提交全局事务,RM 删除 Undo Log。
-
如果失败,TM 通知 TC 回滚,RM 根据 Undo Log 恢复数据。
总结
Seata 的核心原理是通过 TC 协调全局事务,RM 管理分支事务,支持 AT、TCC、SAGA、XA 多种模式。AT 模式通过 SQL 解析和 Undo Log 实现无侵入性事务,TCC/SAGA 模式通过业务逻辑实现灵活性,XA 模式依赖数据库协议。Seata 结合全局锁、异步处理和高可用机制,适用于微服务场景下的分布式事务管理。