1

我一直在阅读Nathan Marz的'article关于如何用Lambda架构击败CAP定理,并不明白不变数据如何使最终一致性更简单。不可变数据如何使最终一致性变得微不足道?

以下段落从文章采取:

的关键在于数据是不可变的。不可变的数据意味着没有更新这样的事情,所以一块数据的不同副本不可能变得不一致。这意味着没有发散值,矢量时钟或读取修复。从查询的角度来看,一段数据存在或不存在。数据上只有数据和功能。你不需要做任何事情来强化最终的一致性,最终的一致性不会妨碍系统的推理。

想象一下下面的例子:我有一个分布式插入数据库,它有两个节点A和B,两者都保存记录[timestamp=1; id=1; value=10]。然后与此同时,针对节点A的插入导致[timestamp=2; id=1; value=20]以及针对节点B的读取以用于记录id=1

与具有更新可能性的数据库相比,如何解决与该示例相比最终一致性问题更简单的问题?

回答

0

我不是100%我说得对,但我会尽力解释。

考虑一个例子 - 您有2个数据库接受写入/读取,与网络链接相连。链接关闭,导致网络分区。我们希望我们的系统可用CAP,所以我们接受两个数据库中的写入/读取。

使用可变数据结构时:假设连接到第1个数据库的客户端想要将记录X的值更新为A,并且连接到第2个数据库的另一个客户端想要将该值更新为B.由于我们系统可用,我们同时接受两个数据库中的写入,但是一旦网络部分消失,我们将不得不解决冲突。这将导致其中一个更新丢失。

对于不可变的数据结构,您不会更新数据,而是插入数据,因此在网络分区消失后,两个写入都会在那里。尽管如此,您仍然需要某种时间同步,以保持操作顺序,这可能非常棘手(请参阅Sebastien Diot的文章中的评论)。