Seata 是阿里巴巴开源的分布式事务解决方案,旨在为微服务架构、云原生应用提供高性能、易集成的分布式事务支持。它支持多种事务模式(如 AT、TCC、Saga、XA),适用于不同业务场景。
一、概述
1. 官方介绍
Seata(Simple Extensible Autonomous Transaction Architecture) 是一个开源的分布式事务中间件,致力于在分布式系统中提供高可用、高性能、易用的全局事务协调能力。
2. 主要特性
| 特性 | 描述 |
|---|---|
| 多种事务模式 | 支持 AT、TCC、Saga、XA 等模式 |
| 高性能 | 基于异步、无锁机制设计 |
| 易集成 | 支持 Spring Cloud、Dubbo、Motan 等主流框架 |
| 可扩展性强 | 支持自定义资源、适配器、事务模式等 |
| 跨语言支持 | 提供多语言客户端(Java 为主) |
二、核心组件
Seata 架构由三个核心角色组成:
| 角色 | 英文名 | 功能描述 |
|---|---|---|
| 事务协调器 | Transaction Coordinator (TC) | 统一管理全局事务生命周期,负责协调事务提交或回滚 |
| 事务管理器 | Transaction Manager ™ | 控制全局事务边界,发起事务并决定是否提交或回滚 |
| 资源管理器 | Resource Manager (RM) | 管理本地事务分支,与 TC 通信注册和汇报事务状态 |
三、事务模式
Seata 支持四种主要事务模式,每种适用于不同的使用场景。
1. AT 模式(Auto Transaction Mode)
原理:
- 利用数据库的本地事务实现“自动补偿”。
- 在本地事务执行前记录“before image”,执行后记录“after image”,形成 undo log。
- 如果事务失败,则根据 undo log 回滚到 before image。
流程:
- TM 向 TC 注册全局事务;
- RM 执行本地 SQL,并生成 undo log;
- RM 向 TC 报告事务状态;
- TM 决定提交或回滚;
- TC 协调所有 RM 提交或回滚。
优点:
- 对业务无侵入(仅需注解
@GlobalTransactional) - 实现简单,适合已有业务系统
缺点:
- 依赖数据库(目前只支持 MySQL、Oracle、PostgreSQL)
- 不支持复杂业务逻辑补偿
- undo log 存储开销
适用场景:
- 数据库操作为主的业务(如订单创建、库存扣减)
2. TCC 模式(Try - Confirm - Cancel)
原理:
- 需要开发者手动实现 Try、Confirm、Cancel 三个阶段的业务逻辑。
- 通过幂等控制保证最终一致性。
示例代码:
@TwoPhaseBusinessAction(name = "deductStock")
public boolean prepare(BusinessActionContext ctx);
@Commit
public boolean commit(BusinessActionContext ctx);
@Rollback
public boolean rollback(BusinessActionContext ctx);
优点:
- 高性能、高可用
- 可用于非数据库资源(如消息队列、外部服务)
缺点:
- 业务侵入性强
- 需要设计反向补偿逻辑
- 幂等处理复杂
适用场景:
- 订单支付、积分兑换、资金转移等需要精确控制的业务
3. Saga 模式
原理:
- 将整个事务拆分为多个本地事务,每个步骤都有对应的补偿操作。
- 若某一步失败,则依次执行前面所有步骤的逆向操作。
优点:
- 无锁、异步、快速响应
- 支持长周期任务
缺点:
- 不支持事务回滚到中间状态
- 补偿逻辑复杂
- 日志追踪困难
适用场景:
- 航班预订、物流调度、审批流程等长流程业务
4. XA 模式
原理:
- 基于标准的 XA 协议(两阶段提交),利用数据库的 XA 支持来实现分布式事务。
优点:
- 强一致性
- 标准化协议,兼容性好
缺点:
- 性能差(同步阻塞)
- 数据库支持有限
- 不推荐用于高并发场景
适用场景:
- 对一致性要求极高、并发量低的系统(如金融核心系统)
四、部署方式
Seata Server 支持以下几种部署方式:
| 部署方式 | 描述 |
|---|---|
| 单机模式 | 快速启动测试环境 |
| 集群模式 | 生产环境推荐,支持 HA 和负载均衡 |
| Kubernetes | 支持 Helm Chart 部署,适应云原生环境 |
| Docker | 提供官方镜像,方便容器化部署 |
Seata Server 启动参数配置
store.mode=file/db
server.port=8091
registry.type=file/nacos/eureka/consul/zk
五、事务日志存储
Seata 使用日志来记录事务的状态变化,主要有两种存储方式:
| 存储类型 | 描述 | 优缺点 |
|---|---|---|
| file | 存储在文件中(默认) | 简单、轻量,但不支持 HA |
| db | 存储在数据库中(MySQL、PostgreSQL) | 支持集群、持久化,适合生产 |
| redis | 使用 Redis 缓存事务日志 | 性能高,但数据可能丢失 |
六、事务生命周期
-
TM 发起全局事务
- 向 TC 注册全局事务,获取 XID(全局事务 ID)
-
RM 加入事务分支
- 每个本地事务作为一个分支,携带 XID 注册到 TC
-
执行本地事务
- RM 执行本地 SQL 或业务逻辑,记录 undo log
-
TM 提交或回滚
- TM 决定事务是提交还是回滚
-
TC 协调 RM 提交或回滚
- TC 通知所有 RM 提交或执行补偿
-
事务完成
- 清理事务日志、释放资源
七、优势与局限性
| 优势 | 局限性 |
|---|---|
| 多种事务模式可选 | AT 模式对数据库有依赖 |
| 支持主流微服务框架 | TCC 模式开发成本高 |
| 高可用、高性能 | Saga 模式补偿逻辑复杂 |
| 社区活跃、文档完善 | XA 模式性能差 |
八、典型应用场景
| 场景 | 推荐模式 |
|---|---|
| 订单创建、库存扣减 | AT |
| 支付、转账、积分兑换 | TCC |
| 航班预订、物流调度 | Saga |
| 金融交易、清算系统 | XA(慎用) |
九、实践建议
- 优先选择 AT 模式:适用于大多数基于数据库的业务,开发成本低。
- TCC 模式注意幂等性:确保 Confirm/Cancel 操作可以重复执行。
- Saga 模式设计补偿逻辑:确保失败时能够正确回退。
- 生产环境使用 DB 存储事务日志:避免因宕机导致数据丢失。
- 配合 Sentinel 实现熔断降级:提升系统健壮性。
十、相关生态整合
| 组件 | 整合情况 |
|---|---|
| Spring Cloud Alibaba | 完美集成,通过 starter 自动装配 |
| Dubbo | 支持 Dubbo 2.x / 3.x |
| Nacos | 默认注册中心和配置中心 |
| RocketMQ / Kafka | 可结合实现异步事务消息 |
| Sentinel | 支持熔断、限流、降级 |
1626

被折叠的 条评论
为什么被折叠?



