A和B都希望将10美元转移到C.C的初始余额是15美元。如果A和B同时读取C的当前余额并加上10美元,那么C将是25美元,但它应该是35美元(15 + 10 + 10)
使用交易记录和计算当前余额而不是存储余额是一种好习惯吗?这种方法的优点和缺点是什么?
我正在阅读\看几个关于一致性和分布式系统的消息来源,但我还没有发现任何相关内容。
优点:
缺点:
所以在我看来,这样的系统将是一致性和可用性之间的中间点......
答案 0 :(得分:1)
您所描述的内容更正式地称为operational CRDT。
是的,它可以通过执行变异操作的方式工作。这种方法通常有几个缺点。
第一个是操作不是幂等的(因为您在示例中将差值/ delta应用于余额,而不是设置余额)。
其次,由于系统具有更长的正常运行时间,因此变化的增量将会累积。如果新参与者想要在任何时候想要了解您所指的余额,他们需要阅读所有历史记录并重新计算当前余额。如果您正在处理大量更改,这可能是一个问题。
为了避免这种情况,通常会进行某种形式的快照。但是,由于第三点,这可能很难建立。
第三,您的系统无法保证您的参与者对余额有一致的一致视图。
现在,根据你想做的事情,我可以想出一些解决这些问题的解决方案。
例如,您可以为每个更新提供标识符(UUID)。这样可以让您有一定程度的信心,可以明确地应用您的更新。然后,标识符也可以用作快照的方式(所有余额,直到id X为1000)。然后,您的网络中的新参与者只需阅读操作历史记录直到最后一个快照。快照创建将会成为一个有问题的过程,但是,由于您的系统:所有参与者必须同意最多X的余额是一些值。此时,您可能会发现某些参与者错过了历史记录,而不仅仅是最新更新,因此必须重新同步。