Gossip协议-推导运算分析

简介

Gossip协议又称传染病协议,因为gossip(流言)以类似于病毒的方式在计算机之间传播信息。

Gossip协议满足的条件

  1. 协议的核心包括周期性,成对性,内部进程交互
  2. 交互期间的信息量大小固定
  3. 节点交互后,至少一个agent获知另一个agent的状态
  4. 通信不可靠
  5. 交流的频率远远低于消息的传输延迟
  6. 对端选择的随机性,或者从全集,或者从部分集合
  7. 由于副本的存在,传输的信息具有隐式冗余

Gossip协议举例

假设我们在一个网络中寻找一个pattern的最优匹配,机器上运行着agent 程序,这些agents实现了gossip协议

  1. 用户首先要求local agent传播pattern
  2. 每一个agent定期并以一定的速率(0.1秒一次)随机选择一个其他的节点传播此pattern。例如节点A和B,如果A知道了pattern,那么B也会知道,随后A和B随机选择了C和D继续传播此消息。因此即使发生节点故障或者消息丢失,此消息依然会在全网范围内传播。
  3. 如果agent第一次收到此pattern,则开启本地查询,寻找本地的最优匹配
  4. agents也传播其最优匹配。因此,如果A和B进行交互后,A和B都会知道最优匹配。最优匹配也会通过全网范围进行传播。
  5. Log时间的复杂度,例如25000个节点,那么30轮就会结束,15轮进行pattern的传播,15轮询问最优匹配。

有偏Gossip协议

不是从全部节点中随机选择一个,考虑到网络延迟,从相邻的节点中随机选择,更高效。

为何是log时间

变量定义

初始 1 1 1个人,全部 n n n个人,一个人每次感染 b b b个人,则感染率为 p = b / ( n − 1 ) p = b/(n-1) p=b/(n1)
令第 i i i轮有 x i x_i xi个人被感染, n − x i n-x_i nxi未感染
则第 i + 1 i+1 i+1被感染的新的人数为 x i ∗ p ∗ ( n − x i ) x_i * p * (n-x_i) xip(nxi)
x i + 1 = x i + x i ∗ p ∗ ( n − x i ) x_{i+1} = x_i + x_i * p * (n-x_i) xi+1=xi+xip(nxi),且 x 1 = 1 x_1 = 1 x1=1

证明

x i x_i xi个人中每一个人能够感染的新人为: b ∗ ( n − x i ) / ( n − 1 ) b * (n-x_i)/(n-1) b(nxi)/(n1)
则一共 x i x_i xi个人贡献的感染人数为: x i ∗ b ∗ ( n − x i ) / ( n − 1 ) = x i ∗ p ∗ ( n − x i ) x_i * b * (n-x_i) / (n-1) = x_i * p * (n-x_i) xib(nxi)/(n1)=xip(nxi)
##推导 x t x_t xt
一种方案是解通项公式,对 x i + 1 x_{i+1} xi+1进行转换
x i + 1 = A ∗ x i 2 + B ∗ x i + C = A ( x i − B / 2 A ) 2 + C − B 2 / ( 4 A ) 其 中 A = − p n , B = p n + 1 , C = 0 x_{i+1} = A * x_i^2 + B * x_i + C \\ = A(x_i-B/2A)^2 + C - B^2/(4A)\\ 其中 A=-pn, B=pn+1, C=0 xi+1=Axi2+Bxi+C=A(xiB/2A)2+CB2/(4A)A=pn,B=pn+1,C=0
x i = a i + B / ( 2 A ) x_i = a_i + B/(2A) xi=ai+B/(2A)代入到上式中,则
a i + 1 = P ∗ a i 2 + Q 且 满 足   P = A , Q = ( 4 A C − B 2 + 2 B ) a_{i+1} = P * a_i^2 + Q\\ 且满足\ P = A, Q = (4AC - B^2 + 2B) ai+1=Pai2+Q P=A,Q=(4ACB2+2B)
于是现在的问题转换为如何解出 a i + 1 a_{i+1} ai+1,然而我并没有想到很好的解法,不知道能否通过展开求级数?

另一种方案是采用微分方程的方式,然而并不完全可靠
一些简单的分析:
分析1: 由 x i + 1 = x i + 1 x_{i+1} = x_{i}+1 xi+1=xi+1,可推导出 x i + 1 − x i = 1 x_{i+1}-x_i=1 xi+1xi=1,即 d y d t = 1 \frac{dy}{dt} = 1 dtdy=1,从而可以解出 y = t y = t y=t,即 x t = t x_t=t xt=t
分析2: 由 x i + 1 = 2 ∗ x i x_{i+1} = 2*x_{i} xi+1=2xi,可推导出 x i + 1 − x i = x i x_{i+1}-x_i=x_i xi+1xi=xi
d y d t = y \frac{dy}{dt} = y dtdy=y,从而可以解出 ln ⁡ y = t \ln{y} = t lny=t,即 x t = e t x_t=e^t xt=et,然而实际上我们可以手动计算此通项,即 x t = 2 t x_t = 2^t xt=2t,这两个是不一样的,然而我们可以看出它们的指数是一样的 t t t,仅仅是底数不同而已,同理,可使用其他类似的式子进行测试,它的总体指数趋势是不变的,变的仅仅是底数而已,于是我想当然的利用这一特性(个人感觉应该可行)!

x i + 1 = x i + x i ∗ p ∗ ( n − x i ) x_{i+1} = x_i + x_i * p * (n-x_i) xi+1=xi+xip(nxi),得 x i + 1 − x i = x i ∗ p ∗ ( n − x i ) x_{i+1}-x_i = x_i * p * (n-x_i) xi+1xi=xip(nxi),故而 d y d t = y ∗ p ∗ ( n − y ) \frac{dy}{dt} = y * p * (n-y) dtdy=yp(ny)
对上次进行积分过程如下:
d y d t = y ∗ p ∗ ( n − y ) d y y ∗ ( n − y ) = p ∗ d t d y y + d y n − y = p ∗ n ∗ d t 积 分 可 得 : ln ⁡ y − ln ⁡ n − y = p ∗ n ∗ t ln ⁡ y n − y = p ∗ n ∗ t \frac{dy}{dt} = y * p * (n-y)\\ \frac{dy}{y*(n-y)} = p*dt\\ \frac{dy}{y} + \frac{dy}{n-y} = p * n * dt\\ 积分可得: \ln{y}-\ln{n-y} = p*n*t \\ \ln{\frac{y}{n-y}} = p*n*t\\ dtdy=yp(ny)y(ny)dy=pdtydy+nydy=pndtlnylnny=pntlnnyy=pnt
n n n非常大的时候,可令 y = n − 1 y=n-1 y=n1,且 p ∗ n ≈ b , n ≈ n − 1 p*n \approx b, n \approx n-1 pnb,nn1,则
ln ⁡ n = b ∗ t \ln{n} = b*t lnn=bt,即 t = ln ⁡ n b t = \frac{\ln{n}}{b} t=blnn,故而得出经过 ln ⁡ n b \frac{\ln{n}}{b} blnn轮,有 n − 1 n-1 n1个人被感染,也可认为全部被感染。
考虑到上面在转化为积分过程中,会有底数的不一致性,因此也就是时间复杂度为 c log ⁡ n c\log{n} clogn级别。

你可能感兴趣的:(分布式系统)