前两篇:

http://www.cnblogs.com/star-star/archive/2013/05/15/3080162.html

http://www.cnblogs.com/star-star/archive/2013/05/15/3080216.html

大体的概述了一下vector clocks算法。

实现起来并不困难,但实际上还有很多细节需要考虑。

思考一下,如果有很多的服务器节点,那么每个数据的vector clocks可能会非常长,甚至长到无法接受的地步,如下图的版本信息:

[(A, 1), (B,1), (C,1) ...... (AA,1), (BB, 1) ...]

他就占用了无法想象的内存,比对版本信息时的复杂度也成倍增长,例如:那我们又该怎么处理这种情况呢?

 

dynamo的一种解决方法就是在一定的情况下,对vector clocks进行截断。

上篇博客说了,可以在版本信息中额外加入时间戳,当vector clocks过长时候,我们则可以根据时间戳来截去过长时间之前更新的版本信息。

当然了,这可能会丢失一些版本维护信息,但这并不会使你的用户信息丢失,出现这种情况的时候,多半是用户长时间没有操作之类,衡量之下,这种处理方式其实没有问题的。

 

 

现在我们看一下实际生产中的运用,riak作为一种类dynamo的实现。它对vector clocks的截断处理取决于四个参数:

  • small_vclock
  • big_vclock
  • young_vclock
  • old_vclock

small_vclock 和 big_vclock 与vector clocks的length相关,

当length < small_vclock 的时候,不会截断,当 length > big_vclock 的时候,则开始进行截取。

young_vclock 和 old_vclock 与版本信息的时间戳有关。

当timestamp < young_vclock 的时候,不会截断,当 timestamp > old_vclock的时候, 则开始进行截取。

以下是从riak文档中截取出的一副示意图:

 

ok~~~

 

 

 

 posted on 2013-05-15 20:46  文武双全大星星  阅读(408)  评论(0编辑  收藏  举报