首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 是什么推动了单体应用到微服务架构的演进?
02 | 微服务全家桶:走进 Spring Cloud 的世界
03 | 初窥门径:我们要搭建一个怎样的微服务实战项目?
04 | 十八般兵器:如何搭建项目所需的开发环境?
05 | 牛刀小试:如何搭建优惠券模板服务?
06 | 牛刀小试:如何搭建优惠券计算服务和用户服务?
07 | Nacos体系架构:什么是服务治理?
08 | 服务治理:Nacos集群环境搭建
09 | 集成 Nacos:如何将服务提供者注册到 Nacos 服务器?
10 | 集成 Nacos:如何通过服务发现机制向服务提供者发起调用?
11 | Loadbalancer 实战:通过自定义负载均衡策略实现金丝雀测试
12 | OpenFeign:服务间调用组件 OpenFeign 是怎么“隔空取物”的?
13 | OpenFeign 实战:如何实现服务间调用功能?
14 | OpenFeign 实战:OpenFeign 组件有哪些高级玩法?
15 | 配置中心在微服务中发挥着怎样的作用?
16 | 如何集成 Nacos Config 实现配置项动态刷新?
17 | Sentinel 体系结构:什么是服务容错(降级熔断、流量整形)?
18 | Sentinel 实战:如何实施流量整形与限流策略?
19 | Sentinel 实战:如何为项目添加异常降级方案?
20 | Sentinel 实战:如何接入 Nacos 实现规则持久化?
21 | Sleuth 体系架构:为什么微服务架构需要链路追踪?
22 | 调用链追踪:集成 Sleuth 和 Zipkin,实现链路打标
23 | 调用链追踪:如何通过 ELK 实现日志检索?
24 | 为什么微服务架构少不了微服务网关?
25 | 微服务网关:Gateway 中的路由和谓词有何应用?
26 | 微服务网关:如何设置请求转发、跨域和限流规则?
27 | 微服务网关:如何借助 Nacos 实现动态路由规则?
28 | 消息驱动:谁说消息队列只能削峰填谷?
29 | 消息驱动:如何集成 Stream 实现消息驱动?
30 | 消息驱动:如何高效处理 Stream 中的异常?
31 | 消息驱动:如何通过 RabbitMQ 插件实现延迟消息?
32 | Alibaba Seata 框架:什么是分布式事务?
33 | 分布式事务:搭建 Seata 服务器
34 | 分布式事务:使用 Nacos+Seata 实现AT模式
35 | 分布式事务:使用 Nacos+Seata 实现 TCC 补偿模式
36 | 说透微服务 | 什么是主链路规划?
当前位置:
首页>>
技术小册>>
Spring Cloud微服务项目实战
小册名称:Spring Cloud微服务项目实战
### 第35章 分布式事务:使用 Nacos+Seata 实现 TCC 补偿模式 在微服务架构中,服务间的解耦与独立部署带来了极大的灵活性和可扩展性,但同时也引入了分布式事务管理的复杂性。传统的ACID事务模型在分布式环境下难以直接应用,因为事务的原子性、一致性、隔离性和持久性在跨多个服务或数据库时难以保证。为此,业界提出了多种分布式事务解决方案,其中TCC(Try-Confirm-Cancel)模式因其灵活性和高效性而被广泛应用。本章将深入探讨如何使用Nacos作为服务注册与配置中心,结合Seata(Simple Extensible Autonomous Transaction Architecture)来实现TCC模式的分布式事务管理。 #### 35.1 引言 分布式事务是指事务的参与者、支持事务的服务器、资源管理器以及事务管理器分别位于不同的分布式系统的不同节点之上。TCC模式是一种基于最终一致性的分布式事务解决方案,它将长事务拆分成多个小事务,并引入预占资源(Try)、确认提交(Confirm)或回滚释放(Cancel)三个阶段来管理这些事务。 - **Try阶段**:尝试执行业务操作,完成所有业务检查(一致性),预留必须的业务资源(准隔离性)。 - **Confirm阶段**:确认执行业务操作,真正提交事务,不做任何业务检查,只使用Try阶段预留的资源。 - **Cancel阶段**:取消执行业务操作,释放Try阶段预留的资源。 #### 35.2 Nacos在分布式事务中的角色 Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。在分布式事务管理中,Nacos主要扮演以下角色: - **服务注册与发现**:微服务架构中,服务的动态注册与发现是基础。Nacos能够动态地管理服务的注册与发现,确保事务参与者能够互相发现并进行通信。 - **配置管理**:分布式事务的配置(如事务超时时间、重试策略等)可以存储在Nacos中,实现配置的集中管理和动态更新。 #### 35.3 Seata简介与原理 Seata是一个开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata通过事务协调者(TC)、事务管理器(TM)和资源管理器(RM)三个组件来管理分布式事务。 - **TC(Transaction Coordinator)**:事务协调者,维护全局和分支事务的状态,驱动全局事务提交或回滚。 - **TM(Transaction Manager)**:事务管理器,定义全局事务的范围、开始全局事务、提交或回滚全局事务。 - **RM(Resource Manager)**:资源管理器,管理分支事务处理的资源,与TC进行通信以注册分支事务和报告分支事务的状态,驱动分支事务的提交或回滚。 在TCC模式下,Seata通过TM管理全局事务,RM在Try阶段预留资源,在Confirm阶段提交资源,或在Cancel阶段释放资源。 #### 35.4 实现TCC补偿模式的步骤 ##### 35.4.1 环境准备 1. **安装Nacos**:部署Nacos服务作为服务注册与配置中心。 2. **引入Seata**:在微服务项目中引入Seata依赖,并配置Seata Server。 3. **配置服务**:将微服务注册到Nacos,并在Nacos中配置Seata相关的服务地址和参数。 ##### 35.4.2 编写TCC业务逻辑 1. **Try阶段**: - 在服务A中,编写Try方法,执行必要的业务逻辑检查,并预留资源(如数据库锁定、库存预扣等)。 - 调用Seata的RM客户端API,注册分支事务,并标记Try阶段成功或失败。 2. **Confirm/Cancel阶段**: - 当全局事务提交时,TM会通知所有RM进行Confirm操作。 - 在Confirm方法中,执行Try阶段预留资源的正式提交操作(如数据库提交、库存扣减等)。 - 如果全局事务回滚,则执行Cancel操作,释放Try阶段预留的资源。 ##### 35.4.3 异常处理与重试机制 - **异常处理**:在Try、Confirm、Cancel阶段中,均需妥善处理异常,确保资源的一致性和完整性。 - **重试机制**:对于网络抖动或短暂的服务不可用导致的失败,可配置Seata的重试策略,自动重试Confirm或Cancel操作。 ##### 35.4.4 日志与监控 - **日志记录**:在TCC的各个阶段,详细记录日志,以便于问题追踪和性能分析。 - **监控集成**:集成监控系统,实时监控事务的执行状态、性能瓶颈和异常情况。 #### 35.5 实战案例分析 假设有一个电商系统,包含订单服务和库存服务。用户下单时,订单服务需要生成订单,并调用库存服务进行库存扣减。在这个场景下,我们可以使用Nacos+Seata来实现TCC模式的分布式事务。 1. **订单服务Try阶段**: - 检查用户余额、优惠券等是否足够。 - 调用库存服务的Try方法预留库存。 - 在本地数据库生成订单信息,并标记为待确认状态。 2. **全局事务提交**: - 订单服务调用Seata的Confirm方法,提交本地数据库中的订单信息为已确认状态。 - 库存服务收到Confirm请求,扣减库存。 3. **全局事务回滚**: - 若任一环节失败,订单服务调用Cancel方法,回滚本地数据库中的订单信息为已取消状态。 - 库存服务收到Cancel请求,释放预留的库存。 #### 35.6 总结 通过Nacos+Seata实现TCC补偿模式的分布式事务管理,可以有效解决微服务架构下的事务一致性问题。TCC模式以其灵活性和高效性,在需要高并发、低延迟的业务场景中尤为适用。然而,TCC模式也需要开发者在业务逻辑层面进行更多的考虑和编码工作,以确保Try、Confirm、Cancel阶段逻辑的正确性和一致性。此外,合理配置Nacos和Seata的参数,以及建立完善的监控和日志系统,对于保障分布式事务的稳定性和可维护性也至关重要。
上一篇:
34 | 分布式事务:使用 Nacos+Seata 实现AT模式
下一篇:
36 | 说透微服务 | 什么是主链路规划?
该分类下的相关小册推荐:
Java语言基础4-数组详解
java源码学习笔记
Java必知必会-JDBC
SpringBoot零基础到实战
SpringBoot合辑-高级篇
SpringBoot合辑-初级篇
深入拆解 Java 虚拟机
Java语言基础16-JDK8 新特性
Java语言基础1-基础知识
Java语言基础12-网络编程
Java语言基础15-单元测试和日志技术
Java语言基础3-流程控制