1

前言

CAP 定理指出,我们不能拥有严格一致且可用的分布式系统。对于交易系统(例如某些支付系统),一致性通常比可用性更受欢迎,因为我们不能容忍货币被“创造”或“销毁”的情况。

例子

A 和 B 都想将 10 美元转给 C。C 的初始余额为 15 美元。如果 A 和 B 同时读取 C 的当前余额并添加 $10,则 C 将是 $25,但应该是 $35 (15+10+10)

问题

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

我正在阅读\观看有关一致性和分布式系统的几个来源,但我没有找到任何关于此的内容。

想法

优点:

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

缺点:

  1. 透支是可能的。
  2. 为了显示平衡,可能需要更多的计算。虽然它可以通过缓存过去某个时间点的平衡来缓解。

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

4

1 回答 1

1

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

是的,它可以工作,就像执行突变操作一样。通常,这种方法有几个缺点。

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

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

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

第三,您的系统在任何时候都不能保证您的参与者对余额有统一的看法。

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

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

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

于 2017-11-05T14:29:05.657 回答