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

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


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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 堆排序算法(图解详细流程)

    堆排序算法(图解详细流程)堆排序的时间复杂度O(N*logN),额外空间复杂度O(1),是一个不稳定性的排序目录一准备知识1.1大根堆和小根堆二堆排序基本步骤2.1构造堆2.2固定最大值再构造堆三总结四代码一准备知识堆的结构可以分为大根堆和小根堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序,下面先来看看什么是大根堆和小根堆1.1大根…

    2022年7月12日
  • qt tabwidget切换_标签怎么在新窗口打开

    qt tabwidget切换_标签怎么在新窗口打开QTabWidget用来分页显示重要函数:1.voidsetTabText(int,QString);//设置页面的名字.2.voidsetTabToolTip(QString);//设置页面的提示信息.3.voidsetTabEnabled(bool);//设置页面是否被激活.4.voidsetTabPosition(QTabPosition::South);//设置页面名字的位置.5.voidsetTabsClosable(bool);//设置页面关闭按钮。6.

    2022年9月13日
  • redhat安装yum源_redhat yum源

    redhat安装yum源_redhat yum源Yum是RedHat和基于RedHat的Linux发行版中的包管理器,它允许您管理RedHat系统上软件的各个方面。你不会在这里详细学习Yum命令,相反,这个Yum备忘单为您提供了所有主要Yum包管理器命令及其各自功能的快速简单的概述。安装、卸载和升级包以下是用于安装、删除和更新软件包的Yum命令。install:从yum存储库安装软件包sudoyuminstallnginxremove:删除已安装的软件包及其依赖项sudoyumre

    2022年10月29日
  • 两个栈实现一个队列

    用栈实现队列1、栈的特点栈的特点是先进后出,进出元素都是在同一端(栈顶)。入栈:出栈:2、队列的特点队列的特点是先进先出,出入元素是在不同的两端(队头和队尾)。入队:出队:3、两个栈实现队列我们拥有两个栈,可以让其中一个栈作为队列的入口,负责插入新元素;另一个栈作为队列的出口,负责移除老的元素。队列的主要操作无非有两个:入队和出队。在…

    2022年4月4日
  • 1DCNN理解

    1DCNN理解1DCNN理解其实这更像一个滑动窗口

    2022年5月3日
  • 第八章:activiti多用户任务分配

    第八章:activiti多用户任务分配第八章:activiti多用户任务分配

    2022年4月23日

发表回复

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

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