在分布式事务系统中使用事务历史而不是平衡

时间:2017-11-05 14:06:50

标签: distributed-transactions cap-theorem

序言

CAP定理表明我们不能拥有严格一致且可用的分布式系统。对于交易系统(例如某些支付系统),通常优先考虑可用性,因为我们无法容忍“创建”或“销毁”资金的情况。

实施例

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

问题

使用交易记录和计算当前余额而不是存储余额是一种好习惯吗?这种方法的优点和缺点是什么?

我正在阅读\看几个关于一致性和分布式系统的消息来源,但我还没有发现任何相关内容。

思想

优点:

  1. “创造”/“摧毁”钱是不可能的。
  2. 无需与其他节点同步即可提交交易。
  3. 缺点:

    1. 透支是可能的。
    2. 为了显示平衡,可能需要更多计算。虽然可以通过缓存过去的某些点来平衡缓解。
    3. 所以在我看来,这样的系统将是一致性和可用性之间的中间点......

1 个答案:

答案 0 :(得分:1)

您所描述的内容更正式地称为operational CRDT

是的,它可以通过执行变异操作的方式工作。这种方法通常有几个缺点。

第一个是操作不是幂等的(因为您在示例中将差值/ delta应用于余额,而不是设置余额)。

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

为了避免这种情况,通常会进行某种形式的快照。但是,由于第三点,这可能很难建立。

第三,您的系统无法保证您的参与者对余额有一致的一致视图。

现在,根据你想做的事情,我可以想出一些解决这些问题的解决方案。

例如,您可以为每个更新提供标识符(UUID)。这样可以让您有一定程度的信心,可以明确地应用您的更新。然后,标识符也可以用作快照的方式(所有余额,直到id X为1000)。然后,您的网络中的新参与者只需阅读操作历史记录直到最后一个快照。

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