我一直在阅读Nathan Marz'article关于如何利用Lambda架构击败CAP定理,并且不理解不可变数据如何使最终的一致性变得不那么复杂。
以下段落取自文章:
关键是数据是不可变的。不可变数据意味着没有更新这样的东西,因此一条数据的不同副本不可能变得不一致。这意味着没有发散值,矢量时钟或读取修复。从查询的角度来看,一段数据存在或不存在。该数据只有数据和功能。您无需采取任何措施来强制执行最终的一致性,最终的一致性不会妨碍对系统的推理。
想象一下以下示例:我有一个带有两个节点A和B的分布式仅插入数据库,它们都保存记录[timestamp=1; id=1; value=10]
。然后同时对节点A进行插入,得到[timestamp=2; id=1; value=20]
,对节点B进行读取,以便记录id=1
。
与具有更新可能性的数据库相比,如何解决最终一致性问题的复杂性不那么复杂?
答案 0 :(得分:2)
我不是100%我做对了,但无论如何我都会尝试解释。
考虑一个示例 - 您有2个数据库接受写入/读取,与网络链接相连。链路断开,导致网络分区。我们希望我们的系统可以使用CAP,因此我们接受两个数据库中的写入/读取。
使用可变数据结构时:假设连接到第一个数据库的客户端想要将记录X的值更新为A,而连接到第二个数据库的另一个客户端想要将该值更新为B.由于我们的系统如果可用,我们接受两个数据库中的两个写入,但是一旦网络parittion消失,我们将不得不解决冲突。这将导致其中一个更新丢失。
对于不可变数据结构,您不会更新数据但是插入,因此在网络paritition消失后,两个写入都将存在。你仍然需要某种时间同步,以保持操作顺序,这可能非常棘手(参见Sebastien Diot文章中的评论)。