如何保证所有节点都被基于 gossip 的协议感染?
Posted
技术标签:
【中文标题】如何保证所有节点都被基于 gossip 的协议感染?【英文标题】:How to guarantee that all nodes get infected in gossip-based protocols? 【发布时间】:2015-09-16 06:48:48 【问题描述】:在基于 gossip 的协议中,我们如何保证所有节点都被消息感染?
如果我们选择随机数量的节点并向这些节点发送消息,并且这些节点也这样做,则有可能某些节点不会收到消息。
虽然无法计算,但似乎很小。但是,如果系统运行了很长时间,在某些时候,一个节点会不走运,会被遗留下来。
【问题讨论】:
【参考方案1】:由于两个原因,这有点难以回答:
并没有真正的 a 基于 gossip 的协议。最多有 家族 种基于八卦的算法。
这些算法实际上只在特定假设下才能保证感染。例如,如果,正如你所说,“系统运行了很长时间”,任何给定的链接在某个指数过程(很可能的情况)下永久失败,那么概率 1 某个节点将被完全隔离,并且没有协议可以克服的。
但是,IIUC,您询问的是具有以下假设的协议:
-
对于任何组 V' ⊂ V 个节点,有一个活动链接u ∈ V' → v∈ V ∖五'。
-
每个节点在每个步骤中统一选择其邻居的 d 个,而不管它们的状态、其他节点做出的选择、总更新状态等。
在这种情况下,你提出的问题的概率为0。
您可以将感染视为Markov Chain,如果 i 节点被感染,系统处于状态 i。假设某些更改源自某些 的 ∈ V,因此系统从状态 i 开始。
通过属性 1.,存在从 i 个受感染节点到其他 n - i 个节点之一的链接。
根据属性 2.,选择此链接的概率至少为 1 / n。这是因为其链接恰好穿过切割线的节点最多有 n 个邻居,但至少有一个穿过切割线的邻居。即使它的选择是完全无状态和不知情的,这也是它会选择这个邻居的机会。
因此,对于 j 步,这种不会发生的概率是(1 - d/n)j时间>。使用Union Bound,任何状态 i 发生这种情况的概率最多为 n (1 - 1/n)j。取j = n2,这就变成了n e-n;取j = n3,这就变成了n e- n2。等等。
(当然,gossip 算法感染发生得更快;这是最坏情况的上限。)
因此,如果系统运行足够长的时间,某个节点不被感染的概率会降低到 0(非常快)。对于Anti-Entropy Gossip Protocols,这就足够了。对于某些其他协议,正如您所怀疑的那样,某些节点可能会因某些更新而丢失。
【讨论】:
感谢您的回答。关于第二个假设,节点是否知道其他节点选择了什么(即它不选择先前选择的节点)?因为在我的场景中节点不知道其他节点的选择,本地决策,一个节点可能被多个节点选择(将收到重复的消息)。 @BSH 否。原始答案也明确适用于这种最坏的情况,其中决定是完全无状态的和本地的。我已经更新了答案以强调与此相关的部分(+ 练习了我糟糕的图表技巧)。 感谢 Ami 的努力,这真的很有帮助。【参考方案2】:我们无法提供答案,因为您不了解您的问题(因此问题含糊不清)
网络拓扑未知,但答案取决于它 算法的停止条件是什么?它会停止吗?假设给定节点连接到所有其他节点(即拓扑),并且每个节点在收到消息时执行相同的操作。
您可以将您的问题简化为更小的子问题(这就是“divide-et-impera”方法):假设任何节点只执行一次尝试(即i = 1
)。
由于任何节点完全随机选择接收者,并且由于此操作无限次执行,因此最终所有节点都会收到消息。需要多少次迭代才能达到给定的置信度(接收消息的节点的比率/所有节点的数量)取决于您。
一旦你得到这个,包括重复尝试i
就很简单了。
【讨论】:
【参考方案3】:我对您正在尝试做的事情做了一些模拟。 http://jsfiddle.net/ut78sega/
function gossip(nodes, tries, startNode, reached)
var stack = [startNode, tries];
while(stack.length > 0)
var ttl = stack.pop();
var n = stack.pop();
reached[n] = 1;
if(ttl <= 0) continue;
for(var i=0; i < ttl; i++)
stack.push(Math.floor(Math.random() * nodes), ttl - 1);
return reached;
node - 总节点数
tries - 随机选择的起始数量
startNode - 获得第一条消息的节点
reached - 当前模拟达到的节点哈希集
在递归的每一层,尝试的次数都会减一。大约需要 9 次尝试才能 100% 覆盖 65536 (2^16) 个节点。
【讨论】:
以上是关于如何保证所有节点都被基于 gossip 的协议感染?的主要内容,如果未能解决你的问题,请参考以下文章