查看文章 |
昨天放假一天,看了几部电影:加勒比海盗1,2 还有魔戒1 开始接触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是用来选取节点的。 ![]() ![]() 上面的函数是gossip包处理函数,处理的过程就是按照上面说的流程来进行的。由于在网络中有很多这样的gossip包,因此这个包的处理速度会影响到系统的性能,因此上面加了注释的代码是不能被应用到实际中的。我们只是要随机的选择一个或者几个member来发送gossip包,而这里却不得不用一个循化来遍历所有的member,这样做是不划算的。具体的解决方法我还没有想到,主要是因为对标准容器map的操作还不是非常了解。这段代码明天还要请涂博士来看看。 今天的工作还是比较有挑战性,毕竟这是我这一周来第一次来编写代码。从整个的过程来看,尽管遇到了一些莫名其妙的问题,但还是比较顺利。因为师兄的代码中接口做的很好,所以我只是进行了相关的调用就可以实现比较复杂的功能。有些类和他的方法还是没有真正掌握,而且感觉大部分的代码是模仿师兄来完成的,如果是自己写的话可能就不会有这么顺利。因此还是要多读多写代码才能提高。 |




