我正在开发有关分布式系统以及如何在此类系统中保持数据一致性的见解,在这些系统中,业务事务涵盖多个服务,有限的上下文和网络边界。

我知道这是用于实现分布式事务的两种方法:


2阶段提交(2PC)
萨加斯


2PC是一种协议,应用程序通过该平台的支持透明地使用全局ACID事务。据我所知,它被嵌入在平台中,对业务逻辑和应用程序代码是透明的。

另一方面,Sagas是一系列本地事务,其中每个本地事务都会变异并保留实体以及一些标志,这些标志指示全局事务的阶段并提交更改。换句话说,事务状态是域模型的一部分。回滚是提交一系列“反向”事务的问题。无论哪种情况,服务发出的事件都会触发这些本地事务。

现在,何时何地在2PC上使用sagas,反之亦然?两者的用例和优点/缺点是什么?特别是Sagas的脆性让我感到紧张,因为倒置的分布式交易也可能失败。

最佳答案

以我的理解(不是2PC的大用户,因为我认为它是有限制的):


通常,2PC用于即时交易。
通常,Sagas适用于长期交易。


用例随后很明显:


2PC可以让您在一个请求中提交整个事务,从而跨系统和网络遍历此请求。假设每个参与的系统和网络都遵循该协议,则可以无缝地提交或回滚整个事务。
Saga允许您将事务分为多个步骤,跨越很长一段时间(不一定是系统和网络)。


例:


2PC:为每个收到的发票请求保存客户,两者均由2个不同的系统管理。
萨加斯(Sagas):预订由多个中转航班组成的航班行程,而每个航班均由不同的航空公司运营。


我个人认为Saga有能力做2PC可以做的事情。相反是不准确的。

我认为Sagas是通用的,而2PC涉及平台/供应商锁定。

关于transactions - 2PC vs Sagas(分布式交易),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48906817/

10-13 09:42