最近学习了一些 CDDT(Conflict-free replicated data type,无冲突可复制数据类型)相关的知识,其中,提到,CRDT满足强最终一致性,这是介于最终一致性和强一致性之间的一个一致性级别。

强一致性和最终一致性的区别很明显,也有很多文章讲过,并不难理解。但对于强最终一致性和最终一致性的区别,我只找到一些理论性的说明(例如 stackoverflow 上的这个回答),缺乏结合实例的说明,看不到它们在实际应用上导致的不同用户体验,让我着实为如何区分它们伤了一番脑筋。

经过思考,现在把自己的理解在这里记录一下,不过,我们仍需要先从理论上看下二者的区别:

  • 最终一致性:收到了一样的更新列表的正确副本们的最终状态一致;
  • 强最终一致性:收到了一样的更新列表的正确副本们的状态一致;

强最终一致性只比最终一致性少了“最终”二字。而这二字之差,反映到实际场景中,则可能导致下面的差异。

假设我们的系统包含数个副本,且这些副本都收到了一样的更新列表。

如果这个系统满足强最终一致性,则我们可以知道,不论是否出现了分区,这些副本的状态都是一致的。

而如果这个系统只满足最终一致性,当出现分区后,我们只能确定,在副本都到达最终状态后,每个分区中的副本状态一致,而不能保证不同分区中的副本状态一致。当分区消失后,副本状态会再次收敛并最终达到一致,这个再次收敛的过程意味着,在未收到任何新的更新列表的情况下,部分甚至全部“已经达到最终状态”的副本的状态会发生变化。在某些完全去中心化的场景中,例如区块链,我们甚至无法知道这个再次收敛的过程会发生多少次。

CRDT 主要应用于在线协作类场景,在这些场景中,只有满足强最终一致性才能让用户获得理想的用户体验。如果只满足了最终一致性,则会出现下面的情况:两个用户收到了一样的更新列表,并且都已经看到了最终的更新结果,然后,他们进行了一次同步,这次同步没有任何更新操作,但其中一个(甚至两个)人却发现自己的数据变得面目全非了。