Seata Saga模式实战:Java微服务中的分布式事务管理

在分布式系统中,Saga模式是一种用于管理跨多个服务的事务的柔性事务解决方案。它通过将长事务拆分为多个本地事务(每个事务对应一个服务的操作),并通过补偿机制保证最终一致性。以下是Java中Saga模式的详细介绍,包括实现方式、代码示例和适用场景。


1. Saga模式的核心概念

1.1 核心思想
  • 长事务拆解:将一个全局事务分解为多个本地事务,每个本地事务独立执行并提交。
  • 补偿机制:如果某个本地事务失败,通过逆向操作(补偿事务)撤销之前的操作,确保数据最终一致性。
  • 最终一致性:不保证原子性(ACID),而是通过补偿操作逐步恢复一致性。
1.2 核心要素
  • 事务序列:按顺序执行的本地事务集合。
  • 补偿事务:每个本地事务的逆向操作,用于失败时回滚。
  • 协调器:负责监控事务状态并触发补偿操作(可选)。
  • 状态机:通过状态转移图定义事务流程(如基于DSL的编排)。

2. Java中Saga模式的实现方式

2.1 手动实现

通过自定义类和接口管理事务步骤及补偿逻辑。适合简单场景或对框架依赖较少的项目。

代码示例
// 定义事务步骤接口
interface TransactionStep {void execute() throws Exception;void compensate();
}// 实现具体事务步骤
class BookFlightStep implements TransactionStep {@Overridepublic void execute() throws Exception {System.out.println("Executing BookFlight");// 模拟失败throw new Exception("Flight booking failed");}@Overridepublic void compensate() {System.out.println("Compensating CancelFlight");}
}// Saga协调器
class Saga {private List<TransactionStep> steps = new ArrayList<>();private int currentStep = 0;void addStep(TransactionStep step) {steps.add(step);}void execute() throws Exception {for (currentStep = 0; currentStep < steps.size(); currentStep++) {steps.get(currentStep).execute();}}void compensate() {for (int i = currentStep - 1; i >= 0; i--) {steps.get(i).compensate();}}
}// 使用示例
public class SagaPatternDemo {public static void main(String[] args) {Saga saga = new Saga();saga.addStep(new BookFlightStep());saga.addStep(new BookHotelStep());try {saga.execute();System.out.println("Saga completed successfully.");} catch (Exception e) {saga.compensate();System.out.println("Saga failed, compensating...");}}
}
关键点
  • 逆序补偿:失败时从当前步骤倒序执行补偿操作。
  • 异常处理:捕获异常并触发补偿逻辑。
  • 幂等性:确保补偿操作可重入,避免重复执行。

2.2 使用框架实现

通过框架(如Axon Framework、Spring Cloud Saga)简化实现,适合复杂业务场景。

2.2.1 Axon Framework

Axon Framework提供了Saga管理功能,通过事件驱动协调事务。
具体参考:Axon Framework实现电商Saga模式-CSDN博客

代码示例
// 定义Saga
@Saga
public class OrderSaga {@StartSagapublic void handle(CreateOrderCommand command) {// 调用订单服务创建订单OrdersCreatedEvent event = new OrdersCreatedEvent(command.getOrderId());messageGateway.send(event);}@SagaEventHandlerpublic void on(InventoryDeductedEvent event) {// 调用库存服务扣减库存}@SagaEventHandlerpublic void on(PaymentFailedEvent event) {// 触发补偿:恢复库存compensateInventory(event.getOrderId());}@EndSagapublic void handle(OrderCompletedEvent event) {// 事务完成}
}
关键点
  • 事件驱动:通过事件(Event)触发后续事务步骤。
  • 注解支持:使用@Saga@StartSaga@EndSaga等注解定义Saga生命周期。
  • 状态管理:框架自动管理Saga的状态和补偿逻辑。
2.2.2 Spring Cloud Saga

Spring Cloud Saga通过编排式或协调式实现事务管理。

代码示例
// 定义Saga流程
@Bean
public SagaDefinition orderSaga() {return new SagaDefinitionBuilder().step("createOrder").invokeService("orderService", "createOrder").onSuccess().step("deductInventory").invokeService("inventoryService", "deductInventory").onSuccess().step("chargePayment").invokeService("paymentService", "chargePayment").build();
}
关键点
  • 编排式设计:通过配置文件或代码定义事务步骤。
  • 服务调用:通过服务名调用具体业务逻辑。
  • 补偿策略:框架自动处理失败时的补偿流程。

3. Saga模式的实现策略

3.1 协调式(Orchestration)
  • 集中式协调器:由一个服务(协调器)主动发起和管理事务步骤。
  • 优点:流程可控,适合强耦合业务。
  • 缺点:协调器可能成为单点故障。
3.2 协同式(Choreography)
  • 去中心化:每个服务通过事件/消息独立响应,无需协调器。
  • 优点:松耦合,扩展性强。
  • 缺点:流程复杂,调试困难。

4. 优势与挑战

4.1 优势
  • 低资源占用:无全局锁,适合长流程。
  • 异步支持:通过消息队列实现异步化。
  • 高扩展性:可集成任意资源类型。
4.2 挑战
  • 补偿逻辑复杂:需手动设计,可能存在遗漏。
  • 幂等性处理:需确保补偿操作可重入。
  • 状态维护成本:业务变更时需同步调整状态机。

5. 适用场景

  • 电商场景:下单、扣库存、支付等流程。
  • 金融场景:跨行转账、优惠券发放。
  • 物联网:设备注册、配置失败后的重试。
不适用场景
  • 强一致性要求:如银行实时转账。
  • 简单原子操作:单个数据库更新无需Saga。

6. 监控与测试

  • 监控:通过日志或APM工具跟踪Saga状态(如Axon的Event Store)。
  • 测试:端到端测试验证补偿逻辑,模拟失败场景(如服务宕机)。

7. 总结

Saga模式是分布式系统中处理长事务的常用方案,尤其适合微服务架构。在Java中,可通过手动实现或框架(如Axon、Spring Cloud Saga)快速集成。选择协调式或协同式策略需根据业务复杂度和耦合度决定。尽管补偿逻辑设计复杂,但通过合理的设计和测试,可以有效保障系统的最终一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913210.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若依学习笔记1-validated

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 保证 Spring AOP 相关的依赖包 --><dependency><groupId>org.springframework.boot<…

Excel 如何处理更复杂的嵌套逻辑判断?

处理复杂的嵌套逻辑判断&#xff0c;是Excel进阶路上必然会遇到的一道坎。当简单的IF函数“套娃”变得冗长、难以阅读和维护时&#xff0c;我们就需要更高级、更清晰的工具。 这里介绍三种从基础到高级的处理方法&#xff1a; 传统的 IF 函数嵌套 (经典&#xff0c;但容易混乱)…

使用Claude和MCP增强Selenium

1.配置MCP服务器打开Claude Desktop—>Settings—>Developer—>Edit Config{"mcpServers": {"selenium": {"command": "npx","args": ["-y", "angiejones/mcp-selenium"]}} }配置完成后重启Cl…

数据仓库锚点建模方法的前世今生

数据仓库锚点建模方法&#xff08;Anchor Modeling&#xff09;作为一种面向复杂数据环境的创新方法论&#xff0c;其发展历程与技术演进深刻反映了数据管理从结构化到动态化的转型需求。以下从起源、发展、核心思想、技术演进及未来趋势五个维度&#xff0c;系统梳理锚点建模的…

<三>Sping-AI alibaba 文生图

环境和配置请看&#xff1c;二&#xff1e;Sping-AI alibaba 入门-记忆聊天及持久化 源代码&#xff1a;https://github.com/springaialibaba/spring-ai-alibaba-examples/blob/main/spring-ai-alibaba-image-example/dashscope-image/src/main/java/com/alibaba/cloud/ai/exam…

vue组件和模板

好的&#xff0c;我们来详细解释一下在 Vue&#xff08;以及现代前端开发&#xff09;中两个最核心的概念&#xff1a;组件 (Component) 和 模板 (Template)。 理解了它们&#xff0c;就等于掌握了现代 Web 应用开发的基石。 一个核心比喻&#xff1a;乐高积木 在开始前&…

python学习打卡:DAY 18 推断聚类后簇的类型

浙大疏锦行 聚类后的分析&#xff1a;推断簇的类型 知识点回顾&#xff1a; 推断簇含义的2个思路&#xff1a;先选特征和后选特征通过可视化图形借助ai定义簇的含义科研逻辑闭环:通过精度判断特征工程价值 作业&#xff1a;参考示例代码对心脏病数据集采取类似操作&#xff0c;…

Ubuntu for ARM 更换为阿里云镜像源

1. 简介 该镜像适用于配置 ARM, PowerPC 等其他架构的 ubuntu系统&#xff0c;不适用 x86 &#xff01;&#xff01;&#xff01; 各种版本的Ubuntu for ARM下载地址&#xff1a;https://cdimage.ubuntu.com/releases 2. 配置方法 打开 sources.list 文件。 vim /etc/apt/s…

HTML与JavaScript:构建动态交互式Web页面的基石

HTML与JavaScript&#xff1a;构建动态交互式Web页面的基石 在现代Web开发中&#xff0c;HTML和JavaScript是不可或缺的两位主角。HTML负责页面的结构和内容&#xff0c;而JavaScript则赋予页面生命&#xff0c;使其能够响应用户交互、动态更新内容&#xff0c;并与后端服务进…

Python数据分析基础03:探索性数据分析

相关文章&#xff1a; 《python数据分析基础02&#xff1a;数据可视化分析》 《Python数据分析基础01&#xff1a;描述性统计分析》 探索性数据分析&#xff08;Exploratory Data Analysis, EDA&#xff09; 的深度解析&#xff0c;涵盖核心目标、方法论框架、关键技术及可视…

D3 面试题100道之(41-60)

这里是D3的面试题,我们从第 41~60题 开始逐条解答。一共100道,陆续发布中。 🟩 面试题(第 41~60 题) 41. D3 中如何添加图例? 图例可以通过手动创建 SVG 元素或使用 D3 的辅助函数来实现。常见做法是结合 d3.scaleOrdinal() 和 .range() 创建颜色映射图例。 示例: c…

Spring Boot事件驱动模型深度解析

目录 一、什么是Spring事件机制&#xff1f; 与传统方法调用的对比&#xff1a; 二、四大核心组件解析 1. ApplicationEvent&#xff1a;事件对象 2. ApplicationEventPublisher&#xff1a;事件发布器 3. ApplicationListener&#xff1a;事件监听接口 4. EventListener…

Python gmssl.SM4使用案例

Python gmssl.SM4使用案例 摘要:在异构计算系统验证中,通常会有数据加解密的要求,例如用户数据、权重参数等,本文将详细介绍在UVM验证环境中,调用Python的gmssl库,用SM4实现加解密的验证方案。 一、Python gmssl 库介绍 gmssl 是一个开源的、纯Python实现的国密算…

迅为高情性6TOPS算力的RK3576开发板NPU rknn-model-zoo例程演示

迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片&#xff0c;集成了4个Cortex-A72和4个Cortex-A53核心&#xff0c;以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。支持INT4/INT8/INT16/FP16/BF16/TF32混合运算&am…

rsync 命令详解

目录 rsync 传输备份工作原理详解一、核心算法:差异传输二、传输流程三、关键技术四、与cp/scp复制的本质区别rsync的使用基本语法常用选项常用组合案例1. **本地目录同步**2. **远程同步(SSH协议)**3. **删除目标端多余文件**4. **排除特定文件**5. **限速传输(避免占用带…

【MySQL进阶】错误日志,二进制日志,mysql系统库

目录 一.错误日志 1.1 配置错误日志 1.1.1 Windows的默认错误日志路径 1.1.2 Unix和Linux系统的默认错误日志路径 1.2 错误日志中事件的字段 1.2.1 核心错误事件字段 1.2.2.MySQL 错误消息的两种不同输出渠道 1.2.3 可选错误事件字段 1.3. 刷新错误日志文件和重命名 二…

day45-nginx复杂跳转与https

1. ✅nginx复杂跳转 客户端ip不是内网(172.16/192.168)ip时&#xff0c;维护文件存在时&#xff0c;返回503或者错误页面 1.1. &#x1f4dd;修改配置文件 server {listen 80;server_name re.linux.cn; root /app/code/re/;set $flag 0;if ( $remote_addr !~* "^172…

基于pcl点云库实现激光雷达数据采集

基于pcl点云库实现倍加福R2000激光雷达数据采集 一、项目介绍二、开发详情三、显示效果展示四、说明 一、项目介绍 最近用pcl库实现了倍加福R2000激光雷达的数据采集&#xff0c;并实时在viewer上实时更新显示。软件的开发是基于vs2019qt插件pcl库实现&#xff0c;可以完成如下…

微信小程序61~70

1.组件wxml的slot-插槽 在使用基础组件时&#xff0c;可以在组件中间写子节点&#xff0c;从而将子节点内容展示到页面中&#xff0c;自定义组件也可以接收子节点但是要在组件模板中定义节点&#xff0c;承载组件中间的子节点需要使用多个插槽时&#xff0c;要在组件.js中声明…

03_性能优化:让软件呼吸更顺畅

引言 在用户对软件响应速度近乎苛刻的今天&#xff0c;性能已成为产品竞争力的核心指标。据Google研究&#xff0c;页面加载时间每增加1秒&#xff0c;转化率就会下降20%。本文将从前端、后端、移动端三个维度&#xff0c;揭示性能优化的核心策略与实战技巧&#xff0c;帮助你打…