使用saga管理事务

简介: 使用saga管理事务

一、事务难题

事务是每个企业级应用的基本要素,如何实现跨多个的服务的是事务一直是行业的一个炙热话题也是难题之一。
image.png

小马觉得写得很赞

二、使用saga管理事务

saga是一种在微服务架构中维护数据一致性的机制,它可以避免分布式事务所带来的问题。saga由一连串的本地事务组成,每一个本地事务负责更新它所在服务的私有数据库,这些操作仍旧依赖于我们所熟悉的ACID事务框架和函数库。saga通过使用异步消息来协调一系列本地事务,从而维护多个服务之间的数据一致性。

小马之前分析过分布式事务的集中解决方案(点这里),其中的补偿事务TCC就是和saga差不多的原理。Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。

image.png

小马理解为,tcc需要先操作锁资源如果失败回滚释放资源;而saga先用着如果失败再作补偿回去。

三、saga的协调模式

saga的实现包含协调saga步骤的逻辑。当通过系统命令启动saga时,协调逻辑必须选择并通知第一个saga参与方执行本地事务。一旦事务完成,saga协调选择并调用下一个saga参与方。这个过程一直持续到saga执行完成所有步骤。如果任何本地事务失败,则saga必须以相反的顺序执行补偿事务(已执行完的事务越长回滚的链条越长)。以下几种不同的方法可以用来构建saga的协调逻辑。

协同式:把saga的决策和执行顺序逻辑分布在saga每一个参与方中,它们通过交换事件的方式来进行沟通。

编排式:把saga的决策和执行顺序逻辑集中在一个saga编排器中。saga编排器发出命令消息给各个saga参与方,指示这些参与方服务完成具体操作(本地事务)。

以下是两个模式的图解,来自《微服务架构设计模式》,书内也有详细的步骤说明,有兴趣的可以自行翻阅,小马就不在这赘述了。
image.png

协同式

image.png

编排式


小马来以通俗的语言分享下自己的理解。从图示我们可以很容易地看出两种模式最大的区别在于,协同式是参与方之间自己协调的通信(失败/成功消息),而编排式都是编排器在统一作消息的协调,可以把编排器视为一个状态机。编排器依赖于各参与方,参与方不依赖于编排器。而协同式会存在循环依赖的问题。因此,编排式被书中作者所推荐。
# 四、没有隔离性
使用saga的挑战在于它们缺乏CAID事务的隔离属性。这是因为一旦事务提交,每个saga的本地事务所作的更新都会立即被其他sagas看到。你可以认为saga只满足了事务的三个属性。
image.png


小马理解为其中之一就是使用逻辑上的状态锁来解决隔离性问题。看起来似乎相对麻烦,但技术没有“银弹”不是么?

image.png

微微一笑

参考文献:
《微服务设计模式》
微服务场景下的数据一致性解决方案
Saga分布式事务解决方案与实践

相关文章
|
前端开发 Java 开发者
深入理解Spring Boot中的@Service注解
【4月更文挑战第22天】在 Spring Boot 应用开发中,@Service 注解扮演着特定的角色,主要用于标识服务层组件。本篇技术博客将全面探讨 @Service 注解的概念,并提供实际的应用示例,帮助开发者理解如何有效地使用这一注解来优化应用的服务层架构
3723 1
|
SQL 监控 Java
分布式任务调度之xxl-job
分布式任务调度之xxl-job
|
存储 缓存 数据可视化
SourceTree使用教程图文详解
Git分布式版本控制系统是我们日常开发中不可或缺的一部分,能够大大提高我们协同工作的效率。前面的一篇文章如何玩转Git介绍过Git的相关知识。在工作中往往我们需要使用Git的可视化管理工具进行版本控制。目前市面上比较流行的Git可视化管理工具有SourceTree、Github Desktop、TortoiseGit等等,我们公司主要使用的是SourceTree。该篇文章主要结合日常开发工作的对于sourctree的一些常用操作进行讲解和总结,帮助没有使用过的同学进行快速入门,希望能对大家有所帮助!
2633 0
SourceTree使用教程图文详解
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
26285 2
|
4月前
|
数据采集 人工智能 搜索推荐
GEO入门教程:零基础搞懂生成式引擎优化的3个关键步骤
GEO(生成式引擎优化)只需三步:①建高质量知识库(定义+数据+案例);②结构化生产(表格/FAQ/数据提升引用率80%);③多平台分发+内链,打造AI信任的内容集群。零技术门槛,7天初见成效。(239字)
|
5月前
|
存储 人工智能 JSON
AI 应用开发的流程
AI应用开发重心转向“上下文管理”与“模型调优”,涵盖五大阶段:业务定义与选型(闭源/开源模型)、提示词工程、RAG数据增强、应用编排(LangChain/Agent)、评估迭代(LLM-as-a-judge)。强调Prompt优先、成本控制与教育场景多模态适配。
|
8月前
|
数据采集 人工智能 自然语言处理
别再给AI塞提示词了:Skill正在重塑Agent的能力边界
OpenClaw 的 Skill 体系代表 Agent 工程化新范式:不堆提示词,而是将 AI 能力拆解为可描述、可按需加载、可复用的单元。通过渐进式披露与三层加载机制,提升工具调用准确率与系统稳定性,让经验沉淀为可继承、可协作的工程资产。
|
算法 Go 索引
【LeetCode 热题100】45:跳跃游戏 II(详细解析)(Go语言版)
本文详细解析了力扣第45题“跳跃游戏II”的三种解法:贪心算法、动态规划和反向贪心。贪心算法通过选择每一步能跳到的最远位置,实现O(n)时间复杂度与O(1)空间复杂度,是面试首选;动态规划以自底向上的方式构建状态转移方程,适合初学者理解但效率较低;反向贪心从终点逆向寻找最优跳点,逻辑清晰但性能欠佳。文章对比了各方法的优劣,并提供了Go语言代码实现,助你掌握最小跳跃次数问题的核心技巧。
732 15
|
程序员 数据库 微服务
长事务管理不再难:Saga模式全面解析
本文介绍了分布式事务中的Saga模式,它用于解决微服务架构下的事务管理问题。Saga通过一系列本地事务和补偿操作确保最终一致性,分为编排和协同两种模式。文章重点讲解了编排模式,其中 Saga 协调者负责事务的执行和失败后的补偿。Saga 模式适用于业务流程明确且需要严格补偿的场景,能有效管理长事务,但实现上可能增加复杂性,并存在一致性延迟。文章还讨论了其优缺点和适用场景,强调了在面对分布式事务挑战时,Saga 模式的价值和潜力。
3690 6
|
关系型数据库 MySQL Java
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克