Gossip-based Protocol

转载:http://hi.baidu.com/jingjing615/blog/item/3d42fd0343f6d188d53f7c17.html

开始接触gossip,阅读了英文的peer-to-peer membership management for gossip-based protocols

关于gossip,我先谈下自己的理解,这个协议是用来解决我们前面讨论过的partner维护的问题。因为我们在某一时刻无法知道整个系统的分布是什么样子的,因此我们的信息是不全面的,有局限性的。gossip从某种程度上给我们关于这个系统的全局性的信息,并且是以一种分布式的方式来解决,这样就会缓解服务器的压力,更有利于发挥p2p的优势。

我们先来看看gossip设计协议需要具备的相关特性,然后给出他的基本算法。

×可量测性(Scalability)每个节点的部分视图(partial view)随着系统大小的变化不至于变化得太快。

×可靠性(Reliability)每个节点的部分视图一定要足够大,以满足可以描述这个系统信息的要求。

× 分布式操作(Decentralized Operation)所有的更新操作一定只通过本地的信息来进行,不能向服务器申请。

×隔离回复(Isolation Recovery)由于gossip具有随机性,因此如果一个节点的partner列表太久没有更新,我们需要一个回复算法。

下面我们来描述一个简单的gossip-based protocols

1。当一个节点加入的时候,他随机的选择他的member来发送subscription,这个即是一个gossip包,他主要描述的就是这个节点的加入信息。

2。当一个节点收到了一个new subscription的时候,他需要做两件事

2-1 他要向他所有的member转发这个gossip包,我们管这个包叫forward subscription

2-2 他要从他的member列表中随机选择k个节点发送冗余的forward subscription

3。当一个节点收到了一个forwrod subscription的时候:

3-1 首先要判定这个gossip包描述的节点是不是在自己的member列表中,

3-2-1 如果是则以p的概率把这个节点加为member,这里p一般等于1/membersize+1

3-2-2 如果没有加入这个节点,转3-3

3-3 这个节点要从自己的member列表中随机的选择一个并把重新转发这个forward subscrption

这个过程我今天已经实现为代码,下面我们来看一看代码部分:

Gossip-based Protocol_第1张图片

这个部分主要是进行gossip的初始发送,当这个节点被tracer接收之后就会调用上面的SendGossipJoinMessage()函数,这个函数按照配置文件随机选取节点来发送new subscription,其中的SelectResPartners是用来选取节点的。

Gossip-based Protocol_第2张图片
Gossip-based Protocol_第3张图片
上面的函数是gossip包处理函数,处理的过程就是按照上面说的流程来进行的。由于在网络中有很多这样的gossip包,因此这个包的处理速度会影响到系统的性能,因此上面加了注释的代码是不能被应用到实际中的。我们只是要随机的选择一个或者几个member来发送gossip包,而这里却不得不用一个循化来遍历所有的member,这样做是不划算的。具体的解决方法我还没有想到,主要是因为对标准容器map的操作还不是非常了解。

你可能感兴趣的:(海量存储和算法)