![]() |
1
61
根据我的理解(因为我认为2PC有局限性,所以不是2PC的大用户):
之后,用例很明显:
例子:
我个人认为Saga能够做到2PC所能做到的。反面不准确。 我认为传奇是通用的,而2PC涉及平台/供应商锁定。 更新/添加 (可选读取): 我的答案在这里已经有一段时间了,我看到这个话题从那以后得到了一些吸引力。 我想为那些来这里不确定该走哪条路的人澄清一下关于这个话题的几点。
@奇怪的评论中提到了一个公平的观点:2PC更喜欢一致性,而Saga将其降级为“最终一致性”如果您遇到一致性比可用性更重要的情况(请阅读 CAP ),那么您可能确实需要像2PC这样的系统事务协议。否则,我建议进行商业交易,如Saga。请阅读系统交易与业务交易,例如 PEAA . |
![]() |
2
1
您的比较在逻辑上不一致。像Sagas这样的旧解决方案需要更多的工作来实现XA/2PC
这是不正确的,如果需要,XA事务可以运行数周,不能超时。我使用过XA/2PC运行一周的系统,有些运行1ms。
不,传奇是XA更原始的解决方案。XA是较新的解决方案。在Sagas中,需要开发样板来处理事务。XA将事务管理的公共元素移动到底层平台,减少了开发人员必须管理的锅炉板膨胀。
XA规范已经被许多供应商实现,并且非常通用。30多年来,跨多个组织跨多个平台实施2PC一直都不是问题。 |
![]() |
3
1
我添加我的答案是为了解决sagas和2PC之间的主要区别,这是一个一致性模型。
有趣的描述。这面旗子到底是什么?是否每个节点都应该在全局事务完成后提交更改(并通过此标志跟踪)?在发生这种情况之前,每个节点都保持本地更改对外不可见?如果是这样的话,那么这与2PC有什么不同?如果不是这样的话,那么这个标志到底是为了什么? 一般来说,据我所知,传奇是一系列本地交易。如果序列中的任何节点出现故障,那么流将被反转,并且每个节点以相反的顺序生成一个补偿事务。 然而,在这种想法下,我们遇到了几个问题:第一个问题是您自己已经注意到的问题:如果补偿事务失败怎么办?如果任何一步的通信都失败了怎么办?但还有更多,通过这种方法,脏读是可能的。假设Node1成功,Node2失败。然后,我们在Node1上发出一个补偿事务。但如果另一个进程在Node1更新之后但在补偿事务恢复更新之前读取数据,会怎么样?潜在的不一致性(取决于您的要求)。 一般来说,传奇是:通过设计,最终是一致和高效的(没有全局资源锁定)。如果您对所有节点都有完全的控制权,那么可以使saga具有很强的一致性,但这需要大量的手动操作(并且不明显,例如通信问题),并且可能需要一些资源锁定(因此我们将失去性能)。既然如此,为什么不先用2PC呢? 另一方面,2PC在设计上具有很强的一致性,这使得它由于资源锁定而可能效率较低。 那么使用哪一个呢?这取决于您的要求。如果你需要很强的一致性,那么2份。如果不是,那么佐贺是一个有效的选择,可能更有效。 示例1。 假设您创建了一个会计系统,用户可以在帐户之间转账。假设这些帐户位于不同的系统上。此外,您有一个严格的要求,即余额应始终为非负(您不想处理隐性债务),也可能有一个严格的要求,即可以设定且不能超过最大金额(想想偿还债务的专用账户:您不能投入比全部债务更多的资金)。那么,传奇可能不是您想要的,因为由于脏读(和其他一致性现象),我们最终可能会得到超出允许范围的平衡。2件装在这里更容易选择。 示例2。 同样,你也有一个会计系统。但这一次允许平衡超出范围(无论谁拥有系统,都将手动处理)。在这种情况下,传奇故事可能更好。因为手动处理极少量的麻烦状态可能比始终保持强一致性的成本更低。 |
![]() |
Manu Batham · 雪花如何在内部执行更新? 7 年前 |
![]() |
vasanths294 · 在Azure中创建blob时面临的问题 7 年前 |
![]() |
Turar Abu · 电报聊天存储空间限制是多少? 7 年前 |
![]() |
Mrtechnicalpr · 操作系统出现故障时EC2实例终止 7 年前 |