转载: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的初始发送,当这个节点被tracer接收之后就会调用上面的SendGossipJoinMessage()函数,这个函数按照配置文件随机选取节点来发送new subscription,其中的SelectResPartners是用来选取节点的。