如何保证所有节点都被基于 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 的协议感染?的主要内容,如果未能解决你的问题,请参考以下文章

gossip协议介绍

gossip协议

散布谣言也能实现一致性?来看看Gossip协议如何活用六度分隔理论

了解 Gossip 协议

基础算法Gossip协议

Gossip数据传播协议