0前言
以前,我们已经解释了四个分布式交易中的前两个:在模式和TCC模式下。如果您对这两种模式感到怀疑,可以在列之前阅读文章
今天我们将谈论传奇模式
传奇的定义是“长期活动交易”,是普林斯顿大学教授Hector&Kenneth发表的论文中提出的概念。
实际上,我看到了萨加这个名字的第一印象,我想到了圣塞伊亚(Saint Sainth,Saint Seiya),他以其强大的力量而闻名。和Saga模型也致力于解决长期交易资源职业的问题
SO称为长期交易是长期执行。此类事务通常需要访问大量数据对象,其执行周期甚至可以达到数周或几个月。但是,传统交易在实施过程中需要锁定占用资源。如果在这种情况下,资源很长时间锁定,并且可以想象出绩效消费。因此,我们引入了传奇模型来解决漫长的问题。
传奇的工作原理最好理解:
传奇模型由一系列当地事务组成,每个地方事务都有自己的补偿事务,可以自己退缩数据。交易之间的字符串执行,当执行的某些交易中发生错误时,则此类赔偿事务将实施交易,并将在逆行执行中进行以前的交易的薪酬事务。
传奇也有两个阶段。第一阶段是正交易。第二阶段是薪酬交易模型仍然要求我们实现积极的服务和薪酬服务。但是在TCC模式下IT之间的差异是:
同时,传奇模型不需要全局锁定。它只需要与当地事务以及本地锁相结合,因此仍然可以保证性能。
SO称为可补偿的交易,即可以使用的交易,需要来回数据的薪酬交易
例如,如果下订单,则需要删除订单的补偿交易,因此该订单是可补偿的交易
关键交易是传奇执行的关键点。如果关键交易成功,传奇将运行直到完成。关键交易不一定是可补偿或重复的交易,但他可以是最后一次可补偿的交易或首次重复交易 - “微服务架构设计模式”
通过书中的描述,我们知道,钥匙扣交易的定义位于结构理解的中间,这是在可补偿的交易和重复交易的中间。
哪种交易被定义为关键交易,但也取决于特定的业务状况。我们可以判断以下标准
关键交易后,交易是重复交易,无需向后回滚,并确保可以完成交易。因此,我们将确保可以通过某些机制(例如重试机制)成功实施此类交易。
如上所述,通过正面服务和薪酬服务之间的积极串起和逆变性来实现传奇模型。这些服务之间的呼叫链很长。我们如何实现呼叫?
我们让每项服务都通知后续的操作服务,这是我们串行服务的最常考虑,但是一个非常明显的问题是很难做到这一点。
想象一下,如果我们想召集活动,我们不仅必须考虑积极的服务呼叫,还必须考虑反向赔偿电话,尤其是考虑反向赔偿电话。一些简单的字符串业务简单设计。设计非常简单。但是一些复杂且复杂的企业非常麻烦。同时,服务之间的耦合已得到增强。
因此,我们制作了一个增强版本,即,该消息是在实现先前服务后发送的,后者的服务通过订阅消息的方式实现了服务协调。我们介绍了MQ的概念以解决耦合问题。
1.2.1.1好处很简单:实现此模型相对清楚。当然,只能说对于某些企业,难以实现一些更复杂的情况。订阅很复杂。
DEALDATION:在增强版本中引入消息订阅,从而减少耦合
1.2.1.2新闻的缺点:该服务是通过订阅消息来触发呼叫,处理不当的消息而触发的,并且很容易引起相互订阅,从而触发了循环依赖或消息死周期。
面对复杂业务的局限性:以上还说,当业务呼叫复杂时,我们可以通过订阅消息的形式获得调用交易的时间,但还确定每笔交易必须订阅会影响其其事件新闻事件新闻复杂的场景,我们需要考虑很多事情,我们需要非常强大的逻辑能力来支持它,并且存在局限性。
很难开始:想象一下,当您接管同事设计的稍微复杂的协作模式时,您需要花多长时间清除消息中消息的逻辑线。它的演示文稿并不直观且难以理解。
如果与工作流设计接触的学生可能更熟悉这件事,那只是第三部分组成部分。通过它,可以将其拖入过程设计中,如下图所示。我不会对此驱动程序说更多。那些有兴趣的人可以接受官方理解。Seata官员还提供在线模块设计工具:SAGA活动驱动程序在线设计
1.2.2.1收益不会产生死亡周期:呼叫是一条路,驱动器将调用交易,但交易不会拨打驱动器。所以
理解很简单:尽管设计师的设计使用的使用成本很高,但更容易理解对其设计的理解。
商业逻辑更简单明了:事务协调已完全移交给驾驶员。商业代码不需要关心它。它可以专注于业务需求并减少代码的难度。
1.2.2.2缺点学习成本:有一定的设计师和相关API的学习成本
在谈论这个问题之前,我们必须首先理解,交易的隔离是什么?
交易的独立执行是交易的隔离,而无需其他并发操作。
但是,如上所述,彼此实施后提交了传奇的当地事务,因此,可以通过其他业务运营或影响SAGA事务中某些交易的执行结果。但是,一旦其他业务修改了中间数据,它看起来很脏,无法回来时回滚。
那么,在传奇模式下分布式交易中是否没有隔离?仍然可以称为交易?如果我有肮脏的写作,该怎么办?
传奇模型还提供了实现隔离的最终想法。SEATA的官方文件中的介绍是“最好长时间而不是短”的原则。
这是什么意思?交叉探索官方解释如下
在设计业务流程设计时,请遵循“最好长时间,而不是短”的原则。不回来。因此,必须首先扣除业务流程设计。
某些业务方案可以使业务最终成功。回滚时,您可以在审查后继续该过程,因此除了提供“回滚”的能力外,状态引擎发动机还需要提供恢复上下文以继续执行上下文的能力。是成功的,并实现了最终的一致性。
通常,不必根据原始道路返回。它只需要通过某些措施即可在恢复之前制作数据,即确保最终的一致性。
那么,具体方法是什么?我们列出了“微服务架构设计模型”中解释的处理计划。以下处理方案来自第4、3、3和兴趣的学生。
直接的语义锁是标记状态。该标记表明记录尚未提交并且可能会更改,正面交易将为每个操作记录添加此状态。
例如,扣除清单时,将状态添加到相应的产品中。当其他交易访问其他交易时,当您发现状态已锁定时,您将无法访问此产品。实际上,这是手动锁定的过程。
如果执行成功,则将状态更新以通过重复交易或计时任务解锁。如果执行失败,则状态将通过赔偿更新。
这里的重复交易是指可以通过成功或失败执行的交易,并且其执行不影响原始数据记录。总体重复的交易将在最后进行。
设计更新操作可以按任何顺序执行,也就是说,可以交换操作。
这表明它实际上是非常抽象的。让我们以一个例子来解释。例如,在下面订单之后,货物需要扣除清单。积极交易是库存-10。
然后,补偿交易被设计为库存+10。
这样,即使其他交易被库存数据污染,因为更新的内容是纯数字,它不受其他交易的影响,并且定位信息被ID = 1无法篡改。在这里删除产品。
然后,我们说当前的积极和薪酬事务可以交换。这有点了解吗?更新中有很多限制。并非所有操作都可以设计为交流。
常见的切换操作是价值和枚举的更新。因此,不同的操作还需要与不同的解决方案结合设计隔离。
悲观的视图实际上不是100%的解决方案。他的最初目的是考虑在最悲观的情况下其他交易发生变化的可能性,然后对传奇交易的步骤进行分类以最大程度地提高较低的肮脏写作风险
因此,这是确定悲观主义是一个不太完整的解决方案,不能完全确保隔离。因此,可以应用的业务受到限制。
重新阅读该值是在更新之前重新阅读记录。您可以通过维护计数器(例如版本号)来验证它是否已更改。如果交易被暂停或重新启动。如果没有更改,则执行该交易。
实际上,知道乐观锁定的学生应该闻到味道,是的,这东西是一种乐观的锁。
解释了“微服务架构设计模型”一书:
文档对策版本之所
为了响应该计划,我们直接通过一个案例解释:
我们有下达订单的命令。我们仍然有一家取消此订单的业务
当由于网络阻塞或其他原因而首先执行取消订单的业务时,当执行订单的订单当时将创建订单,这将导致用户发起的取消操作变得无效结果,数据不一致
通过版本文件,我们将在取消订单时记录取消操作数据。收到订单的操作时,将在接收订单的订单时比较版本文件,以确保最终数据仍被取消。
最终的对策基于价值(业务风险)对策。这是一种基于业务风险选择和机制的策略。使用此对策使用每个请求的属性使用每个请求的属性来决定使用SAGA和分布式交易。- 风险请求,可以应用前面部分中描述的对策。但是它使用分布式交易来执行高风险请求(例如大量资金)。该对策使申请能够权衡业务风险,可用性和可伸缩性。
说到白话是传奇的选择,它不容易阅读或肮脏的阅读或肮脏的阅读。对其他分布式模式的肮脏读取灵敏度的高风险选择动态选择。
与TCC模式类似,传奇模式也涉及以下问题
SO称为功率等。它与操作的操作和多次操作相同。
想象一下,如果我们的库存扣除操作,如果通过错误报告该操作,导致滚动测试,则每次都会从库存中反复扣除该结果,这绝对是错误的。
因此,为了确保我们在确认中执行的重试机制,取消将不会反复消耗我们的资源,然后我们需要做好该方法的好工作:
例如,为了确定是否是通过添加状态字段来执行的。当然,我们不需要在SEATA等分布式框架中手动实施它,并且该框架帮助我们实现了它。
SO称为悬架问题是在第二阶段模式下,第二阶段比第一阶段进行
这是如何引起的?
对于扣除库存的订单扣除的情况,当我们在订单服务中使用产品服务的扣除库存方法时,通常通过RPC(feign)方法调用RedeeInventory方法。呼叫,发生错误。TM将通知TC错误。TC将通知所有RMS以撤销当地事务,即执行薪酬事务。
执行补偿事务方法完成后,连接正交易方法并执行执行,然后存在问题。在执行服务之前,此补偿交易,但已实施了额外的积极服务。
我们只需要暂停暂停问题。计划是限制第二阶段的执行,第一阶段无法执行。
SEATA中的解决方案是添加交易记录表格。执行薪酬服务执行后,交易记录表被插入记录(XID-STATUS)标记赔偿服务。这次,当服务输入服务时,发现该操作已执行,并且已执行该操作,并且积极服务的执行被放弃了。
原始:https://juejin.cn/post/7096494185699606542