分布式事务中的Saga模式「建议收藏」

分布式事务中的Saga模式「建议收藏」微服务架构(MSA)已经变得非常流行。但是,一个常见问题是如何跨多个微服务管理分布式事务。当微服务架构将单体系统分解为自封装服务时,意味着单体系统中的本地事务现在分布到将按顺序调用的多个服务中。说到分布式事务,通常熟悉的是两阶段提交,TCC等常见模式。初次之外还有基于Saga实现的分布式事务。什么是Saga?Saga事务模型又叫做长时间运行的事务(Long-running-transact…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

微服务架构(MSA)已经变得非常流行。但是,一个常见问题是如何跨多个微服务管理分布式事务。当微服务架构将单体系统分解为自封装服务时,意味着单体系统中的本地事务现在分布到将按顺序调用的多个服务中。

说到分布式事务,通常熟悉的是两阶段提交,TCC等常见模式。 除此之外还有基于Saga实现的分布式事务。

什么是Saga?

Saga事务模型又叫做长时间运行的事务(Long-running-transaction), 它是由普林斯顿大学的H.Garcia-Molina等人提出,它描述的是另外一种在没有两阶段提交的的情况下解决分布式系统中复杂的业务事务问题。

Saga事务是一个长事务,整个事务可以由多个本地事务组成,每个本地事务有相应的执行模块和补偿模块,当Saga事务中任意一个事务出错了,可以调用相关事务进行对应的补偿恢复,达到事务的最终一致性。

它与2PC不同,2PC是同步的,而Saga模式是异步和反应性的。在Saga模式中,分布式事务由所有相关微服务上的异步本地事务完成。微服务通过事件总线相互通信。

Saga调用

下面是以客户订单为例的Saga模式图:

在这里插入图片描述

在上面的示例中,OrderMicroservice接收下订单的请求。它首先启动本地事务以创建订单,然后发出OrderCreated事件。CustomerMicroservice接收此事件后,将处理事件并更新客户资金。如果从账户成功扣除,CustomerFundUpdated则会发出一个事件,在此示例中表示交易结束。

如果有某个微服务无法完成其本地事务,则其他微服务将运行补偿事务以回滚更改。以下是补偿交易的Saga模式图:

在这里插入图片描述

在上面的例子中,UpdateCustomerFund由于某种原因失败了,然后它发出了一个CustomerFundUpdateFailed事件。在OrderMicroservice监听到该事件并启动其补偿事务恢复所创建的订单。

Saga模式的优点

Saga模式的一大优势是它支持长事务。因为每个微服务仅关注其自己的本地原子事务,所以如果微服务运行很长时间,则不会阻止其他微服务。这也允许事务继续等待用户输入。此外,由于所有本地事务都是并行发生的,因此任何对象都没有锁定。

Saga模式的缺点

Saga模式很难调试,特别是涉及许多微服务时。此外,如果系统变得复杂,事件消息可能变得难以维护。Saga模式的另一个缺点是它没有读取隔离。例如,客户可以看到正在创建的订单,但在下一秒,订单将因补偿交易而被删除。

为了解决Saga模式的复杂性问题,将流程管理器添加为协调器是很正常的。流程管理器负责监听事件和触发端点。

结论

Saga模式是解决基于微服务的体系结构的分布式事务问题的优选方式。但是,它还引入了一些新的问题,例如如何以原子方式更新数据库并发出事件。采用Saga模式需要改变开发和测试的思维方式。对于不熟悉这种模式的团队来说,这可能是一个挑战。有许多Saga模式变体可以简化其实现。因此,为项目实施选择适当的方式是很重要的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191980.html原文链接:https://javaforall.net

(0)
上一篇 2026年1月21日 下午4:43
下一篇 2026年1月21日 下午5:15


相关推荐

  • sop流程图模板_SOP模板-标准操作流程编写程序.doc「建议收藏」

    sop流程图模板_SOP模板-标准操作流程编写程序.doc「建议收藏」SOP模板-标准操作流程编写程序PAGE第PAGE7页共NUMPAGES7页标准操作流程编写程序编制部门:商务部文件审核:文件批准:批准日期:2005.05.25修改记录修改时间修改摘要批准人修改申请单号2005-5-25修改部门编码1目的指导文件编写者能够高效的编写出符合文件编写标准程序的文件来。范围此文件适合所有编写标准操作流程的文件编写人员。3职责3.1…

    2022年5月26日
    72
  • Java——流

    Java——流

    2021年5月25日
    122
  • className用法

    className用法4 className 用法例 4 1 keyIEFF html DOCTYPE tmlPUBLIC W3C DTDXHTML1 0Transitiona EN http www w3 org TR xhtml1 DTD xhtml1 transitional dtd

    2026年3月19日
    2
  • 疫情来临,车辆长期停放需注意

    汽车界有一句话,“车不是开坏的,而是放坏的。”这段时间,许多人因疫情无法外出,无奈车辆只能闲置,但车辆长期不开很是伤车怎么办?勿慌,这就为您支招,降低闲置期间汽车受损的风险。 车辆…

    2021年6月21日
    295
  • 个人对json的一些简单理解?

    个人对json的一些简单理解?json是什么?没有.json结尾的这种文件,json(JavaScriptObjectNotation)是一种简单的数据交换格式,在此之前我也不知道这个东西其实没有想象的那么抽象,看看后面的例子会更清晰json中的数据结构json中只有两种数据基本结构,一种是MAP,或者叫对象,另一种是Array1.Map类似与java中的Map,这里是以{开始,以}结束,内部object内容是键…

    2022年6月8日
    33
  • QT断点调试[通俗易懂]

    QT断点调试[通俗易懂]这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用Ma…

    2022年5月21日
    685

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号