【理论指导实践】Seata-TCC模式

本文介绍了TCC(Try-Confirm-Cancel)事务模式的核心思想、角色职责及工作原理。TCC模式通过预留资源减少锁定时间,确保数据一致性,适用于订单类业务场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

伴随着高性能的分布式系统演进,我们必然会经历 通过横向扩展节点 提高非热点数据的并发性能;而横向扩展节点实际是如下2方面的扩展变化:

  1. 扩展功能节点(对应应用的微服务化改造)
  2. 扩展数据节点(对应增加数据分片)

这些变化自然就引发 原来调用一个服务的一个接口就完成的功能,现在需要协同调用多个服务的多个接口才能完成。相信我们都遇到过因网络、机器、程序等不可靠,引发的数据一致性的问题。而数据的一致性与系统的可扩展性和高可用同样重要 是【基础IT架构】支撑业务高质量转型升级的重点也是难点。从蚂蚁金服的分布事务产品十几年的Roadmap可以看出其在数据一致性方面的坚持和不易(如今能快速使用他们的积累,幸甚至哉!),如下图所示:

从官宣得知,蚂蚁金服从微服务演进开始至今,大量的应用采用了TCC事务模型,可能也是得益于:

  1. TCC模式关注功能扩展,在按照功能横向扩展资源时,解决微服务间调用的一致性问题,保证多资源访问的事务属性。

  2. 在早期没有现成成熟的分布式框架的条件下,其事务模型运转在业务层,不依赖底层数据资源的事务支持,能灵活应对服务的拆分。

  3. 也可能跟2007年TCC概念的提出有重大关联

二、起源

TCC(Try-Confirm-Cancel)的概念,最早是由 Pat Helland 于 2007 年发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文提出。

三、核心思想

其核心思想是是:通过对资源进行预留,尽量减少对资源的锁定时间;如果事务提交则完成对预留资源的确认;如果事务回滚,则释放预留的资源。

四、角色和职责

4.1、服务实现3个方法

根据自己的业务场景服务实现3个自定义的方法,把服务纳入到全局事务的管理中,3个方法概述如下:

  1. Try 方法:尝试执行;完成所有业务检查(一致性), 预留必须业务资源(准隔离性)。

  2. Confirm 方法:确认执行真正执行业务,不作任何业务检查,只使用 Try 阶段预留的业务资源,只要try成功,那么confirm就必须成功;Confirm 操作要求具备幂等设计,Confirm 失败后需要进行重试。

  3. Cancel 方法:取消执行,释放 Try 阶段预留的业务资源。Cancel 阶段的异常和 Confirm 阶段异常处理方案基本上一致,要求满足幂等设计。

4.2、角色

Seata的实现中有3个重要角色

1)TC (Transaction Coordinator) - 事务协调者

维护全局和分支事务的状态,驱动全局事务提交或回滚。

2)TM (Transaction Manager) - 事务管理器(发起方)

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

3)RM (Resource Manager) - 资源管理器(参与者) 提供TCC服务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

4.3、二阶段的职责分工

  1. 第一阶段: 要求服务提供方RM必须接受一些不确定因素,在1阶段所提供的逻辑操作是临时性的操作(try操作),调用方TM保留了后续取消这些操作的权利。

  2. 第二阶段:

    • 如果调用方决策认为整个事务应该回滚,会要求取消之前的临时性操作,对应的是提供方的的Cancel操作。
    • 如果调用方决策认为整个事务应该提交,会放弃取消的权利,对应的是提供方的Confirm操作。

如转账作为例子,通常会在Try里面冻结金额,但不扣款,Confirm里面扣款,Cancel里面解冻金额:

五、工作原理

5.1、核心流程

Seata 框架管控整个事务,业务只需要主动调 Try 方法;TM 负责2件事情:1.发起全局事务,2.提交或回滚全局事务到 TC,然后TC 负责调用Confirm或Cancel的事(包括重试);核心流程如下:

(来自网络)

  1. TM发起全局事务
  2. TM调用分支事务RM的try方法
  3. RM在Try 执行前注册分支事务到 TC
  4. RM在Try 执行完后,上报事务状态给 TC
  5. TM通知TC进行全局事务的提交或回滚
  6. TC调度,执行分支事务RM的 Confirm 或 Cancel

5.2、注意事项

1) 空回滚

  • 场景:Try 未执行,Cancel 执行了
  • 原因:Try超时(丢包)了
  • 解决:当 TC 发现少了一个 Try,那它就会回滚整个分布式事务,于是触发了 Cancel,直接 Cancel 可能出现数据一致性问题,所以就要记录 Try 是否执行,没执行就要做空回滚(啥都不做直接返回成功)。

2) 防悬挂

  • 场景:Cancel 比 Try 先执行
  • 原因:Try超时(阻塞)了
  • 解决:当 TC 发现少了一个 Try,那它就会回滚整个分布式事务,于是触发了 Cancel,然后拥堵的 Try 在 Cancel 处理完(空回滚)又来了,这时同样要记录下整个状态,要拒绝空回滚以后的 Try

3) 幂等控制

  • 现象:超时重试、补偿都会导致 TCC 服务的 Try、Confirm 或 Cancel 操作被重复执行
  • 解决:Confirm 和 Cancel 开发时要考虑幂等控制(这是必须要做的)

六、总结

概括来看,该模式有以下几个特点:

  1. 该模式对代码的嵌入性高,开发工作较多,要求每个业务需要写TCC三步骤的操作。

  2. 无论有没有本地事务控制都可以使用该模式,与底层数据库事务实现不相关,这个事务模式是抽象的基于服务层的概念,无论DB层是否有JDBC支持,即使没有JDBC的支持如redis、mongo、es等,只要将对他们的操作包装成TCC的参与者,就可以接入到TCC的事务范围内。

  3. 并发度高,无需长期资源锁定,但并发问题、数据的一致性问题,需由开发者自行根据业务场景控制,开发要求高、难度偏大。

  4. 适用于订单类业务,可以有中间状态,但对中间状态有约束的业务。

  5. 提供了更多的灵活性,因为是业务自主定义实现,用户可以借助2阶段的提交过程,容易实现在特定场景下的自定义优化和特殊功能开发。这个模式几乎能满足任何想要的事务场景,自定义补偿性,自定义资源预留型事务,消息事务等场景。

<think>嗯,用户之前让我介绍了微服务的面试题和答案,现在他们又让我详细解释之前提到的几个关键点:CAP定理、BASE理论、服务拆分原则,以及Spring Cloud Alibaba框架。我需要先确定用户的需求是什么。看起来他们可能在准备面试,或者在深入学习微服务架构,想要更深入地理解这些核心概念和工具。 首先,我要回顾一下之前的回答,确保这次的内容能衔接上。用户可能已经对微服务的基础有了一定的了解,现在需要更深入的知识。他们提到CAP定理和BASE理论,这两个都是分布式系统中的重要理论,对于设计微服务架构至关重要。服务拆分原则是实际应用中的指导方针,而Spring Cloud Alibaba则是具体的工具,用户可能想知道如何应用这些理论到实际框架中。 接下来,我需要考虑如何将这些概念解释清楚。CAP定理涉及到一致性、可用性和分区容忍性,需要明确三者之间的关系以及在实际中的取舍。BASE理论是对CAP的延伸,强调最终一致性和柔性状态,可能需要用例子来说明。服务拆分原则可能包括业务边界、高内聚低耦合等,需要给出具体的拆分方法和注意事项。至于Spring Cloud Alibaba,需要介绍其核心组件,比如Nacos、Sentinel、Seata等,以及它们如何帮助实现微服务架构。 用户可能还希望了解这些理论在实际项目中的应用,比如如何在Spring Cloud Alibaba中处理服务发现、配置管理、熔断限流等问题。另外,他们可能想知道学习这些内容的资源或步骤,以便进一步自学。 需要注意避免过于技术化的术语,用通俗易懂的语言解释概念,并结合实际例子帮助理解。同时,结构要清晰,分点说明每个主题,让用户能够一步步深入理解。还要检查是否有遗漏的重要点,例如CAP的具体应用场景、BASE与ACID的区别,服务拆分时的常见错误,以及框架的具体使用案例等。 最后,确保回答全面覆盖用户提到的所有内容,并且逻辑连贯,帮助用户建立起从理论到实践的知识体系。可能还需要提供一些学习建议,比如推荐文档、教程或实践项目,以帮助用户更好地掌握这些知识。</think>以下是针对 **CAP定理、BASE理论、服务拆分原则** 以及 **Spring Cloud Alibaba框架** 的详细解析,帮助您深入理解微服务架构的核心理论与实战工具: -- ### **一、CAP定理:分布式系统的基石** #### **1. 定义** - **C(Consistency,一致性)**:所有节点在同一时刻看到的数据是相同的。 - **A(Availability,可用性)**:每个请求都能得到响应(不保证数据最新)。 - **P(Partition Tolerance,分区容忍性)**:系统在遇到网络分区(节点间通信中断)时仍能继续运行。 #### **2. CAP的取舍** - **只能满足其中两项**:在分布式系统中,网络分区(P)不可避免,因此实际需在 **CP** 或 **AP** 之间权衡。 - **CP系统**(如ZooKeeper、Etcd):保证一致性,但可能牺牲可用性(如选举期间服务不可用)。 - **AP系统**(如Eureka、Cassandra):优先可用性,允许短暂数据不一致。 #### **3. 应用场景** - **支付系统**:选择CP,确保资金数据强一致。 - **社交网络**:选择AP,允许短时间数据延迟(如点赞数显示不一致)。 --- ### **二、BASE理论:最终一致性的柔性方案** #### **1. 核心思想** - **BA(Basically Available,基本可用)**:允许部分功能降级(如限流、返回缓存数据)。 - **S(Soft State,软状态)**:允许系统存在中间状态(如订单“处理中”)。 - **E(Eventually Consistent,最终一致)**:数据在一段时间后达成一致(如通过消息队列同步)。 #### **2. 与ACID的对比** - **ACID**(传统数据库事务):强一致性,但扩展性差。 - **BASE**:牺牲强一致性,换取高可用性和可扩展性。 #### **3. 实战案例** - **电商库存扣减**: - 用户下单后,库存服务预扣库存(软状态)。 - 若支付超时,通过定时任务回滚库存(最终一致)。 --- ### **三、服务拆分原则:从单体到微服务的关键** #### **1. 拆分策略** - **业务边界优先**:按领域驱动设计(DDD)的 **限界上下文** 划分服务(如订单服务、用户服务)。 - **高内聚低耦合**:服务内部功能紧密相关,对外暴露明确接口。 - **单一职责原则**:一个服务只解决一个核心问题(如支付服务仅处理支付逻辑)。 #### **2. 拆分步骤** 1. **识别核心业务域**(如电商中的商品、订单、支付)。 2. **定义服务接口**(REST API或事件)。 3. **逐步拆分**:优先拆分高频变更或性能敏感模块。 4. **数据分离**:每个服务拥有独立数据库,通过事件同步数据。 #### **3. 常见误区** - **过度拆分**:服务粒度太细,导致运维复杂度激增。 - **事务依赖**:跨服务事务未妥善处理,引发数据不一致。 --- ### **四、Spring Cloud Alibaba:微服务实战框架** #### **1. 核心组件** | 组件 | 功能 | 对标Spring Cloud原生组件 | |---------------------|---------------| | **Nacos** | 服务注册与发现、配置中心 | Eureka + Config | | **Sentinel** | 流量控制、熔断降级、系统保护 | Hystrix | | **Seata** | 分布式事务(AT、TCC、Saga模式) | 无直接对标 | | **RocketMQ** | 消息队列(异步通信、削峰填谷) | RabbitMQ/Kafka | #### **2. 典型应用场景** - **服务注册与配置管理**: ```yaml # Nacos配置示例 spring: cloud: nacos: discovery: server-addr: localhost:8848 # 服务注册地址 config: server-addr: localhost:8848 # 配置中心地址 ``` - **流量控制与熔断**(Sentinel): ```java // 注解方式实现熔断降级 @SentinelResource(value = "orderService", fallback = "fallbackMethod") public Order getOrder(String id) { ... } ``` - **分布式事务**(Seata): ```java // 使用@GlobalTransactional注解 @GlobalTransactional public void createOrder() { // 调用库存服务、支付服务等 } ``` #### **3. 优势** - **国产化支持**:中文文档丰富,社区活跃。 - **云原生友好**:与Kubernetes、Dubbo等生态无缝集成。 - **功能全面**:覆盖服务治理、配置、消息、事务全链路。 -- ### **五、学习建议** 1. **理论结合实践**: - 通过开源项目(如Spring Cloud Alibaba官方Demo)动手搭建微服务- 模拟分布式场景(如网络延迟、服务宕机),验证CAP和BASE理论。 2. **深入源码**: - 阅读Nacos服务注册、Sentinel限流算法的实现逻辑。 - 理解Seata的AT模式如何通过全局锁保证事务一致性。 3. **扩展学习**: - 服务网格(Istio):了解如何通过Sidecar代理实现流量控制。 - 云原生技术栈:Kubernetes + Docker + Prometheus(监控)。 --- 掌握这些内容后,您将能够: ✅ 设计符合业务需求的微服务架构。 ✅ 解决分布式环境下的数据一致性、高可用性问题。 ✅ 熟练使用Spring Cloud Alibaba构建生产级微服务系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值