有没有办法序列化矢量时钟,这样,当比较2个矢量时钟时,我可以比较字符串?
使用LevelDB时,我希望能够将矢量时钟存储为记录键的一部分,并利用LevelDB为我做的数据库键的排序。
答案 0 :(得分:1)
我认为你不能这样做,因为当且仅当整个内容相同时,字符串才相等,并且矢量时钟可以比较不大于或小于不相同的时钟。例如,时钟[2,1]
和[1,2]
必须比较“相等”。要在序列化为字符串时满足该条件,它们必须映射到相同的字符串。如果它们映射到相同的字符串,您将无法将它们反序列化为不同的时钟。
答案 1 :(得分:1)
我知道我在聚会上有点迟了,但我在工作中遇到了同样的问题,并找到了解决方案。您必须稍微放松问题的约束,但它应该足以在分布式系统中创建有效的全局排序。
在适当的向量时钟A和B中,
因此,我们有三种状态 - 在(<),之后(>)和并发之前。对于字符串,我们只有两个有效的比较值,<和>。鉴于这些约束,我们可以稍微放松约束并获得以下内容:
通过这些约束,如果我们按序列化字符串值对所有事件进行排序,我们将获得可能的全局排序,这与向量时钟提供的所有部分排序一致。这意味着所有事件都在其所有原因之后和效果之前定位。唯一的技巧是我们需要为每个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