前言
帽定理指出,我们不可能有严格一致和可用的分布式系统。对于交易系统(例如某些支付系统),一致性通常优于可用性,因为我们不能容忍金钱被“创造”或“被破坏”的情况。
示例
A和B都想把10美元转帐给C。C的初始余额是15美元。如果A和B同时读取C的当前余额,加上10美元,C将是25美元,但它应该是35美元(15+10+10)。
问题
使用事务历史和计算当前余额而不是存储余额是一种良好的实践吗?这种方法的利弊是什么?
我读到了一些关于一致性和分布式系统的资料,但是我还没有发现任何关于这方面的信息。
思考
优点:
缺点:
所以在我看来,这样的系统在一致性和可用性之间是一种中间点.
发布于 2017-11-05 14:29:05
您所描述的内容更正式地称为操作CRDT。
是的,它可以起作用,就像执行突变操作一样。一般来说,这种方法有几个缺点。
第一种是操作不是幂等的(因为在您的示例中,您正在将差异/增量应用于一个平衡,而不是设置一个平衡)。
第二,由于系统的正常运行时间更长,因此变化的增量将累积。如果在任何时候,一个新的参与者想要意识到你所指的平衡,他们需要阅读所有的历史并重新计算当前的余额。如果您正在处理大量的更改,这可能是一个问题。
为了避免这种情况,通常会进行某种形式的快照。然而,由于第三点的原因,这可能很难建立。
第三,你的系统不会在任何时候保证你的参与者对平衡的看法是一致的。
现在,根据您想要做的事情,我可以想出一些解决方案来解决这些问题。
例如,您可以为每个更新提供一个标识符(UUID)。这将给您一定程度的信心,您的更新可以应用到幂等。然后,标识符也可以用作快照的一种方式(例如,在id X为1000之前,所有的平衡)。然后,网络中的新参与者只需阅读操作历史记录,直到最后一次快照。
但是,快照创建将是一个有问题的过程,因为您的系统:所有参与者都必须同意,直到X的平衡是有价值的。此时,您可能会发现有些参与者错过了历史片段,而不仅仅是最新的更新,因此必须重新同步它们。
https://stackoverflow.com/questions/47122468
复制相似问题