Alibaba Spring Cloud 三 Seata 的三大核心组件:TC,TM,RM

Seata 的架构由三大核心组件构成:Transaction Coordinator(TC)Transaction Manager(TM)Resource Manager(RM)。它们协同工作,用于管理分布式事务的生命周期,确保全局数据一致性。以下是对这三个组件的详细解析及其作用:


1. Seata 的三大核心组件

1.1 Transaction Coordinator(TC)事务协调者

  • 作用
    • 负责管理全局事务的生命周期。
    • 记录全局事务状态和分支事务的状态。
    • 协调各分支事务的提交或回滚操作。
  • 位置
    • TC 通常部署为一个独立的中心化服务,例如 Seata Server。
  • 工作原理
    1. 全局事务创建
      • TM 向 TC 注册全局事务,TC 分配一个全局事务 ID(XID)。
    2. 分支事务注册
      • 每个分支事务通过 RM 向 TC 注册。
    3. 协调提交或回滚
      • 根据全局事务的状态,通知 RM 提交或回滚分支事务。

1.2 Transaction Manager(TM)事务管理器

  • 作用
    • 发起并管理全局事务的边界(开始、提交或回滚)。
  • 位置
    • TM 嵌入到业务服务中,是分布式事务的入口。
  • 主要功能
    1. 开启全局事务
      • TM 向 TC 注册全局事务,获取全局事务 ID。
    2. 标记事务边界
      • 使用 @GlobalTransactional 注解管理全局事务的开始和结束。
    3. 提交或回滚事务
      • 根据业务逻辑或异常,通知 TC 提交或回滚全局事务。
代码示例
@Service
public class OrderService {

    @Autowired
    private InventoryService inventoryService;

    @Autowired
    private PaymentService paymentService;

    @GlobalTransactional(name = "create-order", rollbackFor = Exception.class)
    public void createOrder(Order order) {
        // 保存订单
        orderRepository.save(order);

        // 扣减库存
        inventoryService.deductStock(order.getProductId(), order.getQuantity());

        // 扣款
        paymentService.processPayment(order.getUserId(), order.getTotalAmount());

        // 模拟异常
        if (order.getTotalAmount().compareTo(BigDecimal.ZERO) <= 0) {
            throw new RuntimeException("无效金额");
        }
    }
}

1.3 Resource Manager(RM)资源管理器

  • 作用
    • 管理分支事务的资源(如数据库连接)。
    • 执行分支事务的提交或回滚。
  • 位置
    • RM 嵌入到业务服务中,负责具体的资源操作(如数据库或文件系统)。
  • 主要功能
    1. 分支事务注册
      • RM 向 TC 注册分支事务,并绑定到全局事务。
    2. 回滚日志生成
      • 在分支事务执行时记录回滚日志(AT 模式)。
    3. 执行提交或回滚
      • 根据 TC 的指令,提交或回滚分支事务。
AT 模式的 RM 工作原理
  1. 在本地事务执行时,RM 生成 Undo Log(回滚日志)。
  2. TC 请求回滚时,RM 根据 Undo Log 恢复数据至原始状态。

2. 工作流程与交互

Seata 的三大组件协作完成分布式事务管理,其核心流程如下:

  1. 全局事务开始(由 TM 发起):

    • TM 向 TC 注册全局事务,TC 生成 XID
    • TM 将 XID 传递到业务逻辑的上下文中。
  2. 分支事务注册(由 RM 处理):

    • RM 在执行本地事务前,向 TC 注册分支事务。
    • TC 记录分支事务状态与全局事务关联。
  3. 分支事务执行(由 RM 处理):

    • RM 执行本地事务逻辑。
    • 在 AT 模式中,RM 会记录 Undo Log(回滚日志)。
  4. 全局事务提交或回滚(由 TM 触发):

    • TM 根据业务逻辑或异常情况通知 TC 提交或回滚事务。
    • TC 通知所有 RM 提交或回滚分支事务。
  5. 事务结束

    • TC 根据 RM 的执行结果更新全局事务状态(成功或失败)。

3. AT 模式与 TC-TM-RM 的配合

AT 模式是 Seata 的默认模式,以下是 TC-TM-RM 的交互示例:

  1. 事务开始

    • TM 调用 TC 的 begin 方法,创建全局事务。
    • TC 生成 XID 并返回。
  2. 分支事务注册

    • RM 向 TC 的 branchRegister 方法注册分支事务。
    • TC 将分支事务与 XID 绑定。
  3. 分支事务执行

    • RM 执行本地事务,并记录 Undo Log。
  4. 事务提交或回滚

    • TM 调用 TC 的 commitrollback 方法。
    • TC 通知所有 RM 执行 branchCommitbranchRollback 操作。
    • RM 在 AT 模式下读取 Undo Log,恢复数据状态(回滚时)。

4. TC、TM 和 RM 的部署与配置

4.1 TC 的部署

  • 服务端配置
    修改 Seata Server 的 registry.conf 文件,指定注册中心和配置中心。

    registry {
      type = "nacos"
      nacos {
        serverAddr = "127.0.0.1:8848"
        namespace = ""
      }
    }
    
  • 启动 Seata Server

    sh bin/seata-server.sh -p 8091
    

4.2 TM 的配置

  • 嵌入到业务服务中,通过 @GlobalTransactional 注解实现全局事务管理。
  • application.yml 中配置 Seata 服务组:
    seata:
      tx-service-group: my_tx_group
    

4.3 RM 的配置

  • 嵌入到业务服务中,管理具体资源(如数据库连接)。
  • 在数据库中创建 Undo Log 表,记录事务的回滚日志:
    CREATE TABLE undo_log (
        id BIGINT AUTO_INCREMENT PRIMARY KEY,
        branch_id BIGINT NOT NULL,
        xid VARCHAR(128) NOT NULL,
        rollback_info LONGBLOB NOT NULL,
        log_status INT NOT NULL,
        log_created TIMESTAMP NOT NULL,
        log_modified TIMESTAMP NOT NULL
    );
    

5. TC-TM-RM 的优点与局限性

优点

  1. 高效协调: 中心化的事务协调(TC)使得事务管理简单高效。
  2. 灵活性: 支持多种事务模型(AT、TCC、SAGA、XA)。
  3. 性能优化: AT 模式下本地事务性能接近原生事务。

局限性

  1. 中心化依赖: TC 作为中心化组件,需要高可用部署。
  2. 资源开销: AT 模式需要额外的 Undo Log 存储空间。
  3. 网络延迟: 跨服务的事务提交或回滚可能受网络延迟影响。

6. 总结与实践建议

  1. 选择事务模型:

    • AT 模式: 适合关系型数据库和高性能场景。
    • TCC 模式: 适合自定义资源和高并发场景。
    • SAGA 模式: 适合长事务和复杂业务流程。
  2. 部署建议:

    • TC 采用集群部署,确保高可用性。
    • 数据库优化 Undo Log 存储表的性能。
  3. 调试与监控:

    • 使用 Seata 控制台监控事务状态。
    • 配置日志级别,便于调试事务问题。

你可能感兴趣的:(Alibaba,Spring,Cloud,spring,cloud,架构,spring)