在分布式事务系统中使用事务历史记录而不是余额



序言

CAP定理指出,我们不可能拥有严格一致和可用的分布式系统。对于交易系统(例如,一些支付系统),一致性通常比可用性更可取,因为我们不能容忍货币"不可用"的情况;创建";或";销毁";。

示例

A和B都想向C转账10美元。C的初始余额是15美元。如果A和B同时读取C的当前余额并加上10美元,那么C将是25美元,但应该是35美元(15+10+10)

问题

使用交易历史记录并计算当前余额而不是存储余额是一种好的做法吗?这种方法的利弊是什么?

我阅读了一些关于一致性和分布式系统的资料,但我没有发现任何关于这方面的信息。

思想

优点:

  1. 不可能"创建"/"销毁";钱
  2. 无需与其他节点同步即可提交事务

缺点:

  1. 透支是可能的
  2. 为了显示平衡,可能需要更多的计算。尽管在过去的某个时刻可以通过缓存平衡来减轻这种情况

所以在我看来,这样的系统将是一致性和可用性之间的中点。。。

您所描述的更正式地称为操作CRDT。

是的,它可以起作用,就像执行突变操作一样。一般来说,这种方法有几个缺点。

第一个问题是运算不是幂等的(因为在您的例子中,您将差值/增量应用于平衡,而不是设置平衡)。

其次,随着系统的正常运行时间延长,更改的增量将不断累积。如果在任何时候,新参与者想要了解您所指的余额,他们需要阅读所有历史记录并重新计算当前余额。如果您正在处理大量的更改,这可能是一个问题。

为了避免这种情况,通常会执行某种形式的快照。然而,由于第三点的原因,这可能很难构建。

第三,你的系统在任何时候都不能保证你的参与者对平衡有一个一致的看法。

现在,根据你想做什么,我可以想出一些解决方案来解决这些问题。

例如,您可以为每个更新提供一个标识符(UUID)。这将给您一定程度的信心,使您的更新可以幂等地应用。然后,标识符也可以用作快照的一种方式(例如,在id X为1000之前的所有平衡)。然后,网络中的新参与者只需读取到最后一个快照的操作历史记录。

然而,由于您的系统,创建快照的过程会有点问题:所有参与者都必须同意X之前的余额是有价值的。此时,您可能会发现一些参与者错过了历史记录,而不仅仅是最新的更新,因此必须重新同步。

最新更新