Der*_*ley 5 theory mongoose mongodb vector-clock
我已经使用 MongooseJSrevisionKey有一段时间了 -__v默认情况下,它包含在文档中的字段。我明白修订号的目的是什么,通常是什么时候更新。
我最近和一位朋友谈论了“矢量时钟”的想法,我提到了 MongoDB 和 MongooseJS 有这个__v领域。当时,听起来这可能是一个矢量时钟。但是在阅读了一些关于矢量时钟的内容后,现在我不确定。
所以我想知道:versionKeyMongooseJS的属性,以及__v它默认产生的字段,可以被认为是一个向量时钟吗?是或否,为什么?
在我看来,versionKey你提到的不能被视为矢量时钟。不过,您可以将其视为Lamport 时间戳(或 Lamport 时钟)。
让我们从全球角度看一下我们正在管理的内容:
\n\nLamport 时间戳和矢量时钟都是用于定义分布式系统中发生的不同事件的因果关系顺序的算法。换句话说,这两种算法都用于同步没有公共引用的事件。
\n\nLamport 时间戳算法对每个进程使用单个计数器(在问题的情况下,我们可以说每个文档使用单个计数器)。该算法的工作原理如下:
\n\n1) 每次流程内发生事件(通信、修改等)时,计数器都会预递增。
\n\n2) 当一个进程向其他进程发送消息时,它会将计数器的值附加到发送的消息中。
\n\n3) 当进程接收到任何类型的通信时,计数器会递增(如果接收到的值小于或等于当前计数器值),或者如果接收到的值大于当前值,则将计数器值设置为接收到的值。
\n\n以下是应用于三个进程的算法的示例:
\n\n
Lamport 时间戳为所有进程提供了一个计数器,可以确定哪个是进程的最后版本(或猫鼬情况下的文档)。
\n\n话虽如此,我们可以得出结论,这versionKey是一种机制,可以让我们知道我们正在处理的版本是当前版本还是已经过时。
正如Aaron Heckmann在他关于 Mongoose 版本控制的博客文章中指出的那样(Mongoose v3 第 1 部分 :: 版本控制:
\n\n\n\n\n在版本 3 中,文档现在具有
\nincrement()手动强制增加文档版本的方法。每当数组上的操作可能改变数组元素位置时,也会在内部使用它。
因此,开箱即用时,您只会使用versionKeyif 尝试修改作为数组的子文档并且正在更改该数组的顺序。
另一方面,Aaron 表示该increment()方法手动强制增加文档版本。如果您实现了 Lamport 算法,则可以使用此方法来增加满足算法第一条规则的版本。在这种情况下,您将使用versionKeyLamport 时间戳。
所以(这是你问题的实际答案)。为什么versionKey被视为矢量时钟:
versionKey是单个值,因此不能将其视为矢量时钟。DynamoDB 使用矢量时钟来处理版本,这里有一篇关于它的有趣读物以下是该论文的摘录:
\n\n\n\n\nDynamo 使用矢量时钟来捕获同一对象的不同版本之间的因果关系。矢量时钟实际上是(节点、计数器)对的列表。一个矢量时钟与每个对象的每个版本相关联。通过检查对象的矢量时钟,可以确定对象的两个版本是否位于并行分支上或具有因果顺序。如果第一个对象\xe2\x80\x99s 时钟上的计数器小于或等于第二个时钟中的所有节点,则第一个对象是第二个对象的祖先并且可以被忘记。否则,这两个更改将被视为冲突并需要协调。
\n
因此,我不会考虑versionKey矢量时钟,而是将其视为具有一些解决方法的 Lamport 时间戳。