其他注意点
在这个网站上,最重要的就是它的动图模拟功能了,但是也不要忽略了它里面的其他部分的描述。
比如这一段话,我就觉得非常的重要。
这一段话里面提到了两个问题,我一个个的说。
首先它说在网站模拟的过程中,所有节点发送消息似乎都是同步的,就像有一个全局循环一样。
在模拟中这样做,是因为这样看起来更加的直观。
但是,在一个真正的 gossip 协议中,每个节点都有自己的周期,它们之间根本没有也不需要同步。
上面是说什么意思呢?
我再说的直白一点,每个节点往外同步消息的时候,是按照自己的周期来处理的,比如每 10 秒一次。根本就不关心其他节点什么时候触发同步消息的操作,只需要管好自己就行了。
第二问题我认为就很重要了:
How do the nodes know about each other?
节点之间怎么知道其他节点的存在的?
其中一个方式就是当节点加入集群时,必须知道该集群中的一个节点的信息。通过前面的动图我们知道,如果一个节点被另外一个节点知道,那么它最终也一定会被感染。
那问题就来了:新节点加入时又是如何知道集群中一个节点信息的呢?
很简单,我知道的一个方案就是人工指定。
Redis 集群采用的就是 gossip 协议来交换信息。当有新节点要加入到集群的时候,需要用到一个 meet 命令。
http://www.redis.cn/commands/cluster-meet.html
这里提到了另外一个模拟的网站:
它可以通过控制这几个参数,来测算集群达成一致性的时间。
上面这个图表示的就是在信息交换频率(GOSSIP INTERVAL)为 0.2s,Fanout 节点数为 3,总节点数为 30,丢包率和节点失败率为 0 的这个情况。
在这个情况下,对应的到达最终一致性的时间图长这样:
基本上在一秒的时间就搞定了。
你也可以自己去修改一下参数,看看对应的时间图的变化。
比如,我只修改节点数,把它从 30 修改为 3000,时间图变成了这样:
在 1.75s 左右完成了收敛。
节点扩大 100 倍,但是时间增加不到 1s,确实是很优秀。
这玩意好是好,但是给你看个刺激的,来感受一下这恐怖的传播规模:
从动图中可以看出,前面一两次传播还好,至少眼睛还能看出个大概,但是到了后几轮,大多数节点都被感染了,但是还在继续对外传播消息。
这消息数量,简直是看的让人头皮发麻。
六度分隔理论
最后再说一个有意思的东西,叫做“六度分隔理论”:
1967年,哈佛大学的心理学教授Stanley Milgram想要描绘一个连结人与社区的人际连系网。做过一次连锁信实验,结果发现了“六度分隔”现象。简单地说:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过六个人你就能够认识任何一个陌生人。
六度分割理论,也叫小世界理论。这其实和 Gossip 协议也有千丝万缕的联系。
我在小破站上看到一个相关的视频,我觉得解释的还是挺清楚的,你如果有兴趣的话可以去看看:
在视频里面,有这样的一个画面:
好家伙,这不是我们前面的网站上面的翻版嘛,看起来可太亲切了。
这个理论刚刚提出来的时候还是“最多通过六个人你就能够认识任何一个陌生人”。
但是随着这几年社交网络的急速发展,地球都被拉小到了一个“村”的概念了。
所以这个数字在逐渐的减少:
而且如果把这个范围拉小一点,比如局限在程序员这个小范围内,那就更小了。
有时候拉个业务对接群,进去一看好家伙还有前同事,你说这个圈子能有多大。
本文已收录到个人博客,欢迎大家来玩。