分布式事务解决方案:Seata框架深度解析
Executive Summary
核心观点(金字塔原理)
结论先行: Seata是阿里开源的分布式事务解决方案,为微服务架构提供高性能和易用的分布式事务支持
支撑论点:
- Seata支持AT、TCC、Saga、XA四种事务模式,覆盖不同业务场景
- 提供对象池化技术优化性能,降低资源开销
- 开源社区活跃,文档和实践案例丰富
SWOT 分析
| 维度 | 分析 | |——|——| | S 优势 | 多种事务模式、对业务侵入性低(AT模式)、阿里开源背书 | | W 劣势 | TC Server单点问题、性能开销、学习成本 | | O 机会 | 微服务事务一致性、跨服务数据操作、电商/金融场景 | | T 威胁 | 网络延迟影响性能、事务回滚复杂场景处理 |
适用场景
- 微服务架构下的跨服务事务一致性
- 电商订单-库存-支付等强一致性场景
- 需要低侵入性分布式事务的业务系统
资料
- https://www.kancloud.cn/luoyoub/microservice/1890582
分布式事务方案对比
核心问题
微服务架构下,一个业务操作可能跨多个服务和数据库,传统单机事务(ACID)无法保证跨服务的数据一致性。分布式事务的本质是在多个参与者之间协调提交或回滚。
方案对比
| 方案 | 原理 | 一致性 | 性能 | 侵入性 | 适用场景 |
|---|---|---|---|---|---|
| 2PC | 协调者两阶段(Prepare→Commit)协调所有参与者 | 强一致 | 低(同步阻塞) | 低(数据库层面) | 数据库层面的跨库事务 |
| 3PC | 在 2PC 基础上增加 CanCommit 阶段 + 超时机制 | 强一致 | 低 | 低 | 理论模型,实际少用 |
| TCC | Try(预留)→ Confirm(确认)→ Cancel(取消) | 最终一致 | 高 | 高(需实现3个接口) | 金融、支付等强一致场景 |
| Saga | 每个参与者提交本地事务 + 补偿事务回滚 | 最终一致 | 高 | 中(需实现补偿逻辑) | 长事务、跨系统集成 |
| 本地消息表 | 业务表和消息表在同一事务中操作,异步投递 | 最终一致 | 高 | 中 | 异步解耦的业务场景 |
| 可靠消息 | 事务消息(RocketMQ)保证消息和业务的原子性 | 最终一致 | 高 | 低 | 异步通知类业务 |
2PC(两阶段提交)
协调者 参与者A 参与者B
|--- Prepare ---------->| |
|--- Prepare --------------------------->|
|<-- Yes/No ------------| |
|<-- Yes/No ----------------------------|
|--- Commit/Rollback -->| |
|--- Commit/Rollback ------------------>|
缺点:同步阻塞、单点故障(协调者)、数据不一致风险(网络分区时部分参与者收到 Commit 部分未收到)
TCC(Try-Confirm-Cancel)
业务服务调用:
1. Try: 冻结库存 100件、冻结余额 ¥500 → 资源预留
2. Confirm: 扣减冻结库存、扣减冻结余额 → 确认提交
3. Cancel: 释放冻结库存、释放冻结余额 → 补偿回滚
关键要求:
- Try/Confirm/Cancel 三个接口都必须保证幂等性
- Confirm 和 Cancel 操作必须能最终成功(通过重试机制)
- 需要处理空回滚(Try 未执行时收到 Cancel)和悬挂(Cancel 先于 Try 执行)
Saga 模式
Saga 将长事务拆分为多个本地事务,每个本地事务都有对应的补偿事务:
T1 → T2 → T3 → ... → Tn (正向执行)
C1 ← C2 ← C3 ← ... ← Cn (补偿回滚)
两种实现方式:
- 编排式(Choreography):各服务通过事件驱动,互相监听并触发下一步,去中心化
- 协调式(Orchestration):中央协调器统一调度各服务执行和补偿,流程清晰可控
Seata 框架
Seata 是阿里开源的分布式事务解决方案,支持四种事务模式:
| 模式 | 原理 | 侵入性 | 性能 | 适用场景 |
|---|---|---|---|---|
| AT | 自动拦截 SQL,生成 undo log 实现自动补偿 | 低(无需改业务代码) | 中 | 通用业务,关系型数据库 |
| TCC | 手动实现 Try/Confirm/Cancel 三阶段 | 高 | 高 | 高性能、强一致性场景 |
| Saga | 状态机驱动,长事务编排 | 中 | 高 | 长流程业务、遗留系统集成 |
| XA | 基于数据库 XA 协议的 2PC | 低 | 低 | 需要强一致且数据库支持 XA |
Seata AT 模式工作流程:
- TM(事务管理器)向 TC(事务协调器)申请全局事务,获得全局事务 ID(XID)
- RM(资源管理器)向 TC 注册分支事务,执行本地 SQL 并提交,同时记录 undo log
- TM 决议全局提交或回滚,通知 TC
- TC 通知所有 RM:提交则删除 undo log,回滚则根据 undo log 反向补偿
- https://seata.io/zh-cn/index.html
- http://booogu.top/2021/02/28/seata-client-start-analysis-01/
- http://booogu.top/2021/03/04/seata-client-start-analysis-02/
- https://mp.weixin.qq.com/s/PCSZ4a8cgmyZNhbUrO-BZQ
- https://github.com/seata/seata
- https://www.jianshu.com/p/ea454a710908
-
PPT:https://github.com/seata/awesome-seata
- 依赖资源
- 对象池化技术:https://github.com/Sayi/sayi.github.com/issues/64