如何序列化矢量时钟,以便您可以按字典顺序排序

时间:2013-07-26 23:25:41

标签: database computer-science distributed-computing

有没有办法序列化矢量时钟,这样,当比较2个矢量时钟时,我可以比较字符串?

使用LevelDB时,我希望能够将矢量时钟存储为记录键的一部分,并利用LevelDB为我做的数据库键的排序。

2 个答案:

答案 0 :(得分:1)

我认为你不能这样做,因为当且仅当整个内容相同时,字符串才相等,并且矢量时钟可以比较不大于或小于不相同的时钟。例如,时钟[2,1][1,2]必须比较“相等”。要在序列化为字符串时满足该条件,它们必须映射到相同的字符串。如果它们映射到相同的字符串,您将无法将它们反序列化为不同的时钟。

答案 1 :(得分:1)

我知道我在聚会上有点迟了,但我在工作中遇到了同样的问题,并找到了解决方案。您必须稍微放松问题的约束,但它应该足以在分布式系统中创建有效的全局排序。

在适当的向量时钟A和B中,

  • A> B iff (如果且仅在此情况下)A中的所有元素都是> = B中的元素
  • A和B如果不同时(A> B或B> A)

因此,我们有三种状态 - 在(<),之后(>)和并发之前。对于字符串,我们只有两个有效的比较值,<和>。鉴于这些约束,我们可以稍微放松约束并获得以下内容:

  • str(A)> str(B) if (不仅此处)A中的所有元素都是> = B中的元素
  • 如果A和B是并发的,则str(A)> str(B)和str(B)> str(A)是可以接受的

通过这些约束,如果我们按序列化字符串值对所有事件进行排序,我们将获得可能的全局排序,这与向量时钟提供的所有部分排序一致。这意味着所有事件都在其所有原因之后和效果之前定位。唯一的技巧是我们需要为每个actor提供一个唯一的整数标识符,但无论如何我们需要类似的矢量时钟。

我创建了一个python库,请查看:https://github.com/ethanfrey/vclock

如果您只是想看看我如何序列化矢量时钟,请看这里。 ArrayCodec依赖于存储为数组的vclock,由actor的id索引。 DictCodec依赖于一个字典,其中key是整数actor的id。基本实现在一个时钟上支持256个actor和1600万个事件,每个actor有6个字节,但是通过使用更多字节进行序列化可以很容易地扩展它:

https://github.com/ethanfrey/vclock/blob/master/vclock/codec.py