3

我一直在阅读 Nathan Marz关于如何使用 Lambda 架构击败 CAP 定理的文章,但我不明白不可变数据如何降低最终一致性的复杂性。

以下段落摘自文章:

关键是数据是不可变的。不可变数据意味着没有更新之类的东西,因此一条数据的不同副本不可能变得不一致。这意味着没有分歧值、矢量时钟或读取修复。从查询的角度来看,一条数据要么存在,要么不存在。该数据上只有数据和功能。您无需执行任何操作来强制执行最终一致性,并且最终一致性不会妨碍对系统进行推理。

想象一下下面的例子:我有一个分布式的仅插入数据库,有两个节点 A 和 B 并且都保存记录[timestamp=1; id=1; value=10]。然后同时,对节点 A 进行插入,导致[timestamp=2; id=1; value=20]对节点 B 进行读取以获取记录id=1

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

4

1 回答 1

2

我不是100%我做对了,但无论如何我都会尝试解释。

考虑一个示例 - 您有 2 个接受写入/读取的数据库,通过网络链接连接。链接断开,导致网络分区。我们希望我们的系统是 CAP 可用的,因此我们在两个数据库中都接受写入/读取。

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

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

于 2017-10-06T13:37:27.263 回答