分布式事务中的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模式变体可以简化其实现。因此,为项目实施选择适当的方式是很重要的。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • psql 列转行

    psql 列转行需求学生成绩表创建表初始化CREATETABLEpublic.test(nameVARCHAR(20),scoreFLOAT,total_availabilityFLOAT,shelf_availabilityFLOAT);INSERTINTOpublic.test(name,score,t

  • python读取txt文件中的数组

    python读取txt文件中的数组写此博客只是为做笔记defread_data(dir_str):”’此函数读取txt文件中的数据数据内容:科学计数法保存的多行两列数据输入:txt文件的路径输出:小数格式的数组,行列与txt文件中相同”’data_temp=[]withopen(dir_str)asfdata:wh

  • 基于javaweb的客户信息管理系统搭建「建议收藏」

    基于javaweb的客户信息管理系统搭建「建议收藏」在写这篇博客之前,特意写下,本人暂时学生一名,也是趁暑假时间,学习一些新的技术,正好学习完拿来练手,花了一个星期多写好了完整的基于javaweb的客户信息管理系统,之所以花了很多时间,原因当然各种了,好了不在累赘。项目:ecclipse+tomcat7+mysql项目简介:基于javaweb的在线客户信息管理,主要实现了客户信息的增删改查基本功能。切入正题,从一开始敲代码开

    2022年10月16日
  • 大数据平台的元数据管理

    大数据平台的元数据管理【概念解释】1,大数据平台——是指服务于大数据计算或存储的平台,包括大数据的计算集群(hive、spark、flink、storm等等)和存储集群(如hadoop、hbase等等)。2,大数据平台涉及的元数据——由大数据作业的业务逻辑直接读写处理的业务数据,都不是元数据,除此之外的数据都是元数据。例如数据表的schema信息、任务之间的血缘关系、任务的权限映射关系、数据的业务属性、数据占用的磁…

  • 大佬讲MBT[通俗易懂]

    大佬讲MBT[通俗易懂]大佬讲MBT网址:https://www.youtube.com/watch?v=TnuiEGS6iyc获取模型:1.手工创建(Manualcreation)2.基于事件接口(Eventbasedinference)ApplyregularlanguagelearningalgorithmstotracesMinimizeover/underapproximat…

    2022年10月23日
  • ios软件_iOS倒计时

    ios软件_iOS倒计时GitHub:https://github.com/remember17/CountdownTimer全局倒计时工具,可以维护任意多个倒计时当APP从后台进入前台的时候,倒计时不受影响,会根据时间线继续。使用方法: 把CountdownTimer.swift文件拖进项目 在CountdownTimer.swift的枚举CountDownKey中添加定时器 每个枚…

发表回复

您的电子邮箱地址不会被公开。

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