ACID 过时?用 Sagas 搞定数据一致性

Saga 模式:分布式事务一致性解决方案 Saga模式是一种分布式事务解决方案,通过将全局事务拆分为多个本地事务,配合补偿机制实现最终一致性。其核心包括本地事务、补偿事务和全局事务ID跟踪,支持两种实现方式:协调器模式(集中控制)和编排模式(事件驱动)。适用于电商、金融等需要跨服务事务的场景。相比2PC/TCC,Saga在性能和扩展性上更优,但需注意事务幂等性和可观测性设计。典型实现包含Saga协调器、微服务和消息中间件等组件,通过持久化日志确保可靠性。 阅读详情

ACID Is So Yesterday: Maintaining Data Consistency with Sagas

Chris Richardson

Founder of Eventuate.io
Founder of the original CloudFoundry.com Author of POJOs in Action

本文素材作者  Chris Richardson ,由坐馆老G先生注解

讲义goal:

分布式数据管理在微服务架构下的挑战

Sagas 是一种事务模型

关于作者Chris

大大有名

POJO‘s in action

Microservice Patterns

微服务enable 持续部署

架构、组织和过程三角

架构:微服务架构

组织:小、敏捷、自组织功能团队

过程:持续交付/部署

services = testability  and deployability

松耦合,数据封装

如何维护数据一致性呢?

由于不在一个(本地)事务中......

2PC 不是一个好的选择

//

1、2PC事务协调器单点故障问题

2、通讯:至少有O(4n)条消息,并重试O(n^2)

3、锁导致吞吐量降低

4、许多NoSQL数据库(或消息代理)不支持

5、CAP理论 ⇒ 2PC影响可用性

Ebay的Dan Pritchett 提出:

In partitioned databases, trading some consistency for availability can lead to dramatic improvements in scalability.

并有一个著名的Base理论。

Base: An Acid Alternative

Basically Available 

Soft state

Eventually consistent

sagas 可以追溯到1987年的论文

1987年普林斯顿大学的Hector Garcia-Molina和Kenneth Salem发表了一篇Paper Sagas,讲述的是如何处理long lived transaction(长活事务)。Saga是一个长活事务可被分解成可以交错运行的子事务集合。其中每个子事务都是一个保持数据库一致性的真实事务。

Saga的组成

  • 每个Saga由一系列sub-transaction T i 组成

  • 每个T i 都有对应的补偿动作C i ,补偿动作用于撤销T i 造成的结果

可以看到,和TCC相比,Saga没有“预留”动作,它的T i 就是直接提交到库。

Saga的执行顺序有两种:

  • T 1 , T 2 , T 3 , ..., T n

  • T 1 , T 2 , ..., T j , C j ,..., C 2 , C 1 ,其中0 < j < n

Saga定义了两种恢复策略:

  • backward recovery,向后恢复,补偿所有已完成的事务,如果任一子事务失败。即上面提到的第二种执行顺序,其中j是发生错误的sub-transaction,这种做法的效果是撤销掉之前所有成功的sub-transation,使得整个Saga的执行结果撤销。

  • forward recovery,向前恢复,重试失败的事务,假设每个子事务最终都会成功。适用于必须要成功的场景,执行顺序是类似于这样的:T 1 , T 2 , ..., T j (失败), T j (重试),..., T n ,其中j是发生错误的sub-transaction。该情况下不需要C i 。

Sagas complicate API design ( Sagas 使 API 设计 复杂化  )

Synchronous API vs Asynchronous Saga
Request initiates the saga. When to send back the response? 

Option #1: Send response when saga completes:

+ Response specifies the outcome - Reduced availability

选择一:saga完成的时候发送响应

Option #2: Send response immediately after creating the saga

(recommended)

选择二:创建saga之后马上发送响应(推荐)

+ Improved availability( 提高可用性 )

- Response does not specify the outcome. Client must poll or be notified

(响应没有指定结果。必须轮询或通知Client端)

使用Sagas,可能影响用户体验。

UI界面向用户隐藏异步API

如果需要更长的时间, 用户界面显示“处理中”弹出窗口

服务器可以将通知推送到UI

Sagas 拥有 ACD 特性

原子性、一致性、持久性

缺失隔离性

Commutative updates

e.g. debit account can compensate for a credit account

Version file (版本文件)

Record history of changes (记录变化历史)

Use them to make updates commutative

e.g. record cancel reservation(记录 取消 预定) so that create/cancel = cancel/ create

Sounds suspiciously like event sourcing

Choreography (编排): distributed decision making vs.

Orchestration(协调): centralized decision making

方案1:使用事件做基于编排模式的协作

优缺点:

Benefits ( 好处 )

简单,尤其使用事件溯源时

参与者松耦合

Drawbacks (缺点)

循环依赖

领域对象过载,例如订单和客户相互知道太多

Events =  ndirect way to make something happen to make something happen

选项2:基于编排的saga协调

saga( orchestrator  )  是一个持久性对象,跟踪 saga 的状态,以及调用参与者

这里有一个例子,开源的saga 框架

优缺点

Benefits

Centralized coordination logic is easier to understand

Reduced coupling, e.g. Customer knows less

Reduces cyclic dependencies

Drawbacks

Risk of smart sagas directing dumb services

消息必须支持事务

选择1:使用数据库表作为消息队列,ebay的案例

选择2: 使用事件溯源:以事件为中心的持久化

Apache ServiceComb 中的微服务数据最终一致性方案 本文转自 微服务开源框架 Apache ServiceComb 官方博客 http://servicecomb.incubator.apache.org/cn/docs/saga_pack_design/本文由华为微服务引擎技术团队&amp;&amp;ServiceComb社区授权发布。数据一致性是构建业务系统需要考虑的重要问题 , 以往我们是依靠数据库来保证数据的一致性。但是在微服务架构以及分布... 阅读详情

相关推荐

戏说领域驱动设计——Saga设计模型

上一节我们讲解了常用的事务,也提及了Saga,这是在分布式环境下被经常使用的一种处理复杂业务和分布式事务的设计模式。本章我们的主要目标是编写一个简单版本的Saga处理器,不同于Seata框架中那种可独立部署的事务服务,我们所编写的Saga和业务集成在一起也不支持通过手画流程的方式实现,因为我们的目标是将Saga作为一种设计模式(不是框架)来使用,类似于您经常使用的“工厂”、“策略”等,重点学习它的思想,在真实项目中使用肯定是需要根据需求做二次加工的。而且,简单版本的优势就是足够简单,投入虽然不多但能从中获取

lyl54545的博客 754

Sagas模式

Sagas属于一个错误管理模式,也同时用于控制复杂事务的执行和回滚等。同时,Compensating-Transaction模式的的实现也是也是类似于Sagas策略的,可以对比参考一下。 Sagas的最开始的出现是因为一些长时间的事务的实现(最开始的时候仅仅是因为数据内的事务),现在也包括一些跨越多个区域的分布式事务。这些长时间持续的事务无法简单地通过一些典型的ACID模型使...

weixin_30721899的博客 417

一笔订单的一致性远征:两阶段提交的困局、CAP与BASE的取舍与六种柔性事务模式的工程选型

微服务拆分后,单体里一个本地事务就能保证的原子性被服务边界切断,跨服务丢失、幽灵、重复与悬挂随之出现。本文跟随一笔订单,先剖析XA与两阶段、三阶段提交,用离散事件仿真对比二者在协调者宕机与网络分区下的锁持有和数据分叉;再借CAP、PACELC、一致性模型光谱与BASE思想划定理论边界;随后逐一拆解可靠事件、补偿、Saga、TCC、最大努力通知与人工干预六种柔性事务模式的思路、关键点、实现策略与实测数据;最后给出横向对比、选型决策路径与下单链路组合方案,说明最终一致需要幂等、可观测与对账兜底。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 170万+

如何用saga实现分布式事务?

SAGA事务模式的历史十分悠久,比分布式事务的概念提出还要更早。SAGA的意思是“长篇故事、长篇记叙、一长串事件”,它起源于1987年普林斯顿大学的赫克托 · 加西亚 · 莫利纳()和肯尼斯 · 麦克米伦()在ACM发表的一篇论文《SAGAS》。文中提出了一种如何提升“长时间事务”()运作效率的方法,大致思路是把一个大事务分解为可以交错运行的一系列子事务的集合。原本提出SAGA的目的,是为了避免大事务长时间锁定数据库的资源,后来才逐渐发展成将一个分布式环境中的大事务,分解为一系列本地事务的设计模式。

半亩方塘立身 1806

如何通过Saga事务模式保证分布式事务的最终一致性?

Saga模式是一种通过​​实现分布式系统最终一致性的设计模式,特别适用于跨微服务的​​(如电商下单、旅行预订)。其核心原理是将全局事务拆解为多个本地事务,通过正向操作链和逆向补偿链确保数据最终一致。

fsvgj23163的博客 1034

从零开始安装pytorch(包含GPU和CPU版本的安装)

Pytorch是。

qiaoxinyu1989的博客 8万+

微服务设计模式(系列)-分布式事务(Saga模式)

这里写自定义目录标题Saga Saga 每个Saga由一系列sub-transaction Ti 组成 每个Ti 都有对应的补偿动作Ci,补偿动作用于撤销Ti造成的结果 可以看到,和TCC相比,Saga没有“预留”动作,它的Ti就是直接提交到库。 Saga可能的行为 T1, T2, T3, …, Tn T1, T2, …, Tj, Cj,…, C2, C1,其中0 < j < n Saga的 恢复策略 backward recovery,向后恢复,补偿所有已完成的事务,如果任一子事务失败

Po Rui的专栏 1485

从AP到ADSP:高通8650 AudioReach中GSL-Passthru-GPR的数据通路剖析

本文深入剖析了高通骁龙8650平台AudioReach架构中,音频数据从应用处理器(AP)到音频数字信号处理器(ADSP)的完整传输路径。重点解析了GSL(Graph Service Layer)如何封装命令,并通过Passthru驱动与GPR(Generic Packet Router)协同工作,实现跨处理器的高效、异步数据交换,揭示了现代手机复杂音频系统背后的核心通信机制。

cherry的博客 537

ACID过时?用 Sagas搞定数据一致性

ACID Is So Yesterday: Maintaining Data Consistency with SagasChris RichardsonFounder of Eventu...

u013527895的博客 475

行人重识别(ReID)基础知识入门

行人重识别(Person re-identification)主要目的是针对出现在监控摄像头内的某个目标行人,准确快速地从监控网络其他摄像头内的大量行人中将这个目标行人标识出来。如图所示一个区域有多个摄像头拍摄视频序列,ReID的要求对一个摄像头下感兴趣的行人,检索到该行人在其他摄像头下出现的所有图片。

用于记录 1万+

使用everything出现mem_virtual_alloc(): Fatal Error: out of memory解决方案

本文主要介绍了使用everything出现mem_virtual_alloc(): Fatal Error: out of memory解决方案,希望能对使用everything的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

ACID 过时?用 Sagas 搞定数据一致性,2024年是意义非凡的一年

大大有名微服务enable 持续部署架构、组织和过程三角架构:微服务架构组织:小、敏捷、自组织功能团队过程:持续交付/部署松耦合,数据封装如何维护数据一致性呢?由于不在一个(本地)事务中…2PC 不是一个好的选择//1、2PC事务协调器单点故障问题2、通讯:至少有O(4n)条消息,并重试O(n^2)3、锁导致吞吐量降低4、许多NoSQL数据库(或消息代理)不支持5、CAP理论 ⇒ 2PC影响可用性。

m0_57541068的博客 364

点云配准3:3d-ndt算法在pcl上的实现以及参数设置

3d-ndt算法在pcl上的使用方法以及参数设置

诺有缸的高飞鸟的博客 7895

Sagas事务模型

Saga模式是一种分布式异步事务,一种最终一致性事务,是一种柔性事务,有两种不同的方式来实现saga事务,最流行的两种方式是:该实现第一个服务执行一个事务,然后发布一个事件。该事件被一个或多个服务进行监听,这些服务再执行本地事务并发布(或不发布)新的事件,当最后一个服务执行本地事务并且不发布任何事件时,意味着分布式事务结束,或者它发布的事件没有被任何Saga参与者听到都意味着事务结束。订单服务保存新订单,将状态设置为pengding挂起状态,并发布名为的事件。支付服务监听,并公布事件。

qq_63431773的博客 299

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法

Robot_PLC_HMI_Automation 1万+

YOLOv13涨点改进| CVPR 2026 |独家创新首发、主干改进篇 |利用RIS-PiDiNet主干让YOLOv13更加强大!适合遥感目标检测、小目标检测、旋转目标检测,变化检测,图像分割涨点

🔥本文提出了一种改进的RIS-PiDiNet主干网络,通过引入几何先验构建几何一致性检测器,显著提升了模型在任意方向、结构规则目标场景下的检测性能。包含两个核心模块:S-PDC利用极谐变换的谐波核建模目标结构对称性,RIS-PDC通过SO(2)群平均实现旋转不变性。网络采用基于RIS-block的主干结构并融合轻量级LBP特征,增强了细粒度结构表达能力。实验表明,该方法特别适用于遥感和复杂几何分布场景,能有效提升目标检测的鲁棒性和精度。文章还详细介绍了如何将RIS-PiDiNet集成到YOLOv13框架

Ai缝合怪、助力小伙伴高效发论文 91

一篇搞定!10分钟说透Saga分布式事务

这里对Saga进行一个总结,首先Saga是针对分布式长活事务的解决方案,针对事务长、多、复杂的情况,特别是服务由多个公司开发具有不可控性,可以使用Saga模式进行分布式事务的处理。Saga在处理事务一致性方面采取了向前恢复和向后恢复策略,前者通过不断重试的方式保证事务完成,而后者通过子事务的补偿事务,逐一回滚的方式让事务标记失败。在分布式协调方面,Saga采用了两种模式:编排和控制。前者让参与者(服务)之间通过消息进行沟通,根据事件出发事务的执行流程,是一种去中心化的模式。

FeelTouch Labs 6749

深入解读WT软件湍流强度计算与分析

深入解读WT软件湍流强度计算与分析

weixin_46713695的博客 1027

如何解决微服务事务难题

微服务架构下的应用是由一组松耦合的相互协调的服务所组成。这些服务内部通常使用独立的数据库来维护状态,服务与服务之间是通过轻量级的通讯协议进行交互的。如何协调这些服务之间的...

微服务技术与实践专栏 1721

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring Boot 中的 SAGA 事务

SAGA(Sequentially Consistent Autonomous Global Transactions)是一种基于事件驱动的分布式事务模型,它的目标是保证在分布式系统中的多个服务之间的操作是顺序一致的,从而保证最终一致性。与传统的 ACID 事务模型不同,SAGA 事务模型并不是立即提交所有的操作,而是通过一系列的事件来驱动事务的执行。在 SAGA 事务模型中,每个服务都有一个 Saga 实例,Saga 实例包含了一系列的事件和操作。

徐师兄的博客 1765

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SSM 如何使用 Saga 机制实现分布式事务?

Saga 是一种解决分布式事务问题的机制,它通过将一个大事务分解为多个小事务并使它们顺序执行来保证分布式事务的一致性。每个小事务都是一个本地事务,Saga 将这些本地事务组合成一个全局事务。如果某个本地事务失败,Saga 会通过执行补偿操作来回滚全局事务。Saga 机制的核心思路是将分布式事务分解成多个本地事务,这些本地事务可以跨越不同的服务,但是在一个事务期间内,它们必须遵循一致性规则。

徐师兄的博客 844

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

摘要:Saga模式是分布式系统中管理跨服务事务的柔性解决方案,将长事务拆分为多个本地事务并通过补偿机制实现最终一致性。Java实现方式包括手动编写协调器(包含事务序列和逆序补偿逻辑)或使用框架(如Axon或SpringCloudSaga)以事件驱动方式管理事务。该模式分为协调式(集中管理)和协同式(事件驱动)两种策略,适用于电商、金融等长流程场景,但需处理补偿逻辑复杂性和幂等性问题。尽管不适用于强一致性要求,Saga仍是微服务架构中实现分布式事务的有效方案。

shitou的博客 831

Saga分布式事务解决方案与实践

Saga分布式事务解决方案与实践 我先介绍一下我自己,我叫姜宁,来自于华为开源研究中心,现在负责的是ServiceComb这个开源项目。ServiceComb这个项目已经进到Apache孵化,应该是去年11月份时进到Apache孵化的,这个月我们帮刚发了1.0M1版,但对于SAGA来说我们属于探索的阶段,发布了0.1.0。 我参与过Apache一些项目,我也是Apache的 Member,...

单炒饭 1万+

分布式事务

分布式事务 分布式事务理论CAP(强一致性) CAP 定理,又被叫作布鲁尔定理。对于共享数据系统,最多只能同时拥有CAP其中的两个,任意两个都有其适应的场景。 BASE(最终一致性)BASE 是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。它的核心思想是即使无法做到强一致性(CAP 就是强一致性),但应用可以采用适合的方式达到最终一致性。 BA指的是基本业务可用性,支持分区失败; S表示柔性状态,

qq_47815451的博客 352

使用 SAGA 来保证微服务的数据一致性

问题 在单体架构中所有的数据都在一个数据库中,开发者可以使用数据库的事务来保证数据的一致性。当事务执行失败时,可以回滚事务,把数据恢复到修改前的状态。 BEGIN TRAN -- 你的业务代码 END TRAN 在微服务中,每个服务都有自己的数据库,当一个业务操作需要跨多个服务时,开发者没有像单个数据库那样把业务包装到事务中的简单工具。如果使用分布式事务锁,可能会因为要协调和锁定多个服务,而导致性能急剧下降。 比如在网上购物中,消费者可以使用自己的积分来抵扣订单金额,而系统中有订单服务和积分服务,系统

surfirst的博客 530

分布式事务之SAGA案例

1. 分布式事务   在前面文章《分布式事务》中介绍了几种分布式事务,其中Saga介绍了相关的概念,接下来介绍Saga使用案例,案例来源《微服务架构设计模式》。 2. 案例需求分析 2.1 一个成功的订单创建流程   实现餐馆系统中的创建订单createOrder()操作。这个操作必须验证消费者是否满足下订单的相关条件、验证订单内容、完成消费者的信用卡授权,以及在数据库中创建Order。一个成功的订单创建流程: 创建一个待处理订单; 验证订单消费者可以下单; 创建后厨工单; 对消费者提供的信用卡进行授权操

行走 2626
上一篇: 有个码龄 10 年的程序员跟我说:“他编程从来不用鼠标”,我说:
下一篇: 记录我们迁移到 Docker 的挑战和经验教训
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值