Seata 分布式事务全解(一):架构核心与设计原理
什么是 Seata?
Seata (Simple Extensible Autonomous Transaction Architecture) 是一款开源的分布式事务解决方案。与传统的 XA 协议不同,Seata 提供了一套在应用层实现的分布式事务框架,致力于在微服务架构下提供高性能和简单易用的数据一致性服务。
它最早由阿里巴巴在 2019 年开源,设计目标是解决微服务架构下,跨数据库、跨服务的数据一致性问题。
Seata 的三大核心角色
Seata 的架构设计参考了 DTP 模型(Distributed Transaction Processing),但在实现上进行了微服务化的改造。无论使用哪种事务模式(AT/TCC/Saga/XA),其运行时架构都由以下三个角色组成:
-
TC (Transaction Coordinator) - 事务协调者
- 角色定位: 服务端 (Server)。它是独立的中间件服务器,通常以集群方式独立部署。
- 核心职责: 它负责维护全局事务和分支事务的运行状态(Status),并根据 TM 的指令,驱动全局事务进入提交或回滚阶段。
-
TM (Transaction Manager) - 事务管理器
- 角色定位: 客户端 (Client SDK)。它作为 Jar 包嵌入在业务应用中,通常存在于发起全局事务的微服务里(即标注了
@GlobalTransactional的服务)。 - **核心职责:**它控制全局事务的边界,负责向 TC 发起开启全局事务(Begin)、提交全局事务(Commit)或回滚全局事务(Rollback)的指令。
- 角色定位: 客户端 (Client SDK)。它作为 Jar 包嵌入在业务应用中,通常存在于发起全局事务的微服务里(即标注了
-
RM (Resource Manager) - 资源管理器
- 角色定位: 客户端 (Client SDK)。它也作为 Jar 包嵌入在业务应用中,通常包裹在数据库连接池(DataSource)或业务逻辑层中。
- **核心职责:**它负责管理具体的分支资源(如 Database、MQ、Service)。它与 TC 保持长连接,负责注册分支事务,并接收 TC 的指令来完成本地事务的最终提交或回滚。
架构交互拓扑图
Seata 的核心设计原理:抽象的两阶段提交
Seata 之所以能兼容 AT、TCC、Saga 等多种模式,是因为它在底层架构上进行了一次高度抽象。Seata 将所有分布式事务模型都抽象为“两阶段提交”的逻辑模型:
这正是 Seata 设计的高明之处——解耦了“协调逻辑”与“执行逻辑”。
-
第一阶段 (Phase 1):业务执行与资源预留
- 业务侧执行本地事务(或业务逻辑)。
- RM 拦截执行过程,向 TC 注册分支,并根据不同模式做不同的“资源预留”(例如 AT 模式记录 Undo Log,TCC 模式执行 Try 方法)。
- 关键点:在 AT 模式下,第一阶段结束时,本地数据库事务已经提交了!这是 Seata 高性能的核心。
-
第二阶段 (Phase 2):事务决议与最终收敛
- TC 根据 TM 的决议(Commit 或 Rollback),向所有 RM 发起二阶段指令。
- RM 收到指令后完成最终动作(例如 AT 模式删除 Undo Log 或执行回滚,TCC 模式执行 Confirm/Cancel)。
全局事务生命周期详解
理解了设计原理后,我们再看具体的生命周期,就会非常清晰:
- TM 开启事务 (Begin): TM 请求 TC 开启一个全局事务。TC 生成一个全局唯一的 XID。
- XID 传播 (Propagate): XID 通过微服务调用链路(RPC Header)传递到每一个涉及的服务节点。
- RM 注册与执行 (Register & Execute):
- 下游服务的 RM 拦截到请求,解析出 XID。
- RM 向 TC 注册一个分支事务(Branch Transaction),将其归属到该 XID 下。
- RM 执行本地业务逻辑(Phase 1)。
- TM 发起决议 (Decide):
- 如果所有微服务调用都成功,TM 向 TC 发起 Global Commit。
- 如果任一环节抛出异常,TM 向 TC 发起 Global Rollback。
- TC 驱动完成 (Drive): TC 遍历该 XID 下的所有分支事务,通知对应的 RM 执行第二阶段逻辑(Phase 2)。
核心机制:事务上下文传播
Seata 能够“穿透”微服务边界的核心机制就是 XID 的传播。
- XID 是什么? 全局事务的唯一身份证(格式通常为
ip:port:transactionId)。 - 载体: Seata 针对主流的 RPC 框架(Dubbo, Spring Cloud, gRPC, Sofa-RPC)都提供了自动适配的拦截器。
- 过程: 拦截器将 XID 注入到 RPC 请求的 Header 中(类似 HTTP Header)。下游服务的拦截器从 Header 中取出 XID,并将其绑定到当前的线程上下文(ThreadLocal)中,供 RM 使用。
Seata 的四种事务模式概览
基于上述的“通用两阶段架构”,Seata 提供了四种具体实现,以应对不同的业务权衡(Trade-off):
| 模式 | 核心设计哲学 | 锁模型 | 侵入性 | 适用场景 |
|---|---|---|---|---|
| AT 模式 | 自动化。由框架托管 2PC,一阶段直接提交本地事务。 | 全局锁 + 本地锁 | 极低 | 业务基于关系型数据库,且不想改造代码。 |
| TCC 模式 | 灵活性。把 2PC 的控制权交给业务代码实现。 | 无全局锁 | 高 | 核心链路(如下单、支付),追求极致性能。 |
| Saga 模式 | 长流程。基于状态机编排,用补偿代替回滚。 | 无锁 | 中 | 业务流程长、涉及遗留系统或跨机构调用。 |
| XA 模式 | 标准化。利用数据库原生的 XA 协议支持。 | 数据库锁 | 低 | 对数据一致性要求极高,并发要求不高的金融场景。 |
Seata Server (TC) 的存储模式
TC 是有状态的,它需要持久化记录“哪个全局事务正在进行”、“包含哪些分支事务”。Seata 支持三种存储模式:
- file (单机模式): 存放在本地文件。读写快,但无法组建集群,宕机可能丢数据。仅限测试。
- db (高可用模式): 生产环境推荐。将会话数据存放在共享数据库(如 MySQL)中。多个 TC 节点无状态,通过争抢数据库锁来协作,天然支持高可用集群。
- redis (高性能模式): 将会话数据存放在 Redis 中。性能优于 DB 模式,适合超高并发场景。
总结
Seata 的核心价值在于它提供了一个标准化的分布式事务协作平台。
- 架构上:它定义了 TM、RM、TC 的铁三角关系。
- 原理上:它抽象了通用的“两阶段提交”模型。
(下篇预告:Seata 分布式事务全解(二):浅聊 AT 模式)
Seata 分布式事务全解(二):浅聊 AT 模式
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)