上面这个图你可以看到有很多线,但是它们的起点都是一个红色的节点。
这个红色的节点就是你用鼠标随意点击小圆圈中的一个或者多个都可以,鼠标一点击就会变成红色,就是完犊子了,红码了,表示“被感染”了。
上面的线条是怎么搞出来的呢?
有了一个红色的小圆圈之后,点击上面的“Show Paths”就会出现路径了:
但是不是说好 Fanout=4 吗,为什么怎么多的路径?
因为,虽然这个节点知道这么多其他节点,但是它只会选择其中的 4 个进行感染。
上面这个图还是有点复杂,所以我把参数都调小一点,这样看起来就清爽多了:
集群中有一个节点的信息更新了,这个节点知道其他 5 个节点的存在,但是它只会把信息推送给其中的两个,点击 Send Message 按钮之后就会像是这样:
你可以发现上面这个图里面已经有三个红色的节点了,有两条路径变粗了,含义是从这个路径传播过来的。
整个集群最终会全部完成“感染”,达成最终一致性:
同时,gossip 协议它也具备容错性:
比如,每次都设置为 Fanout=4,那么节点数和预估传播轮次之间的关系是这样的:
- 40 个节点,2.66 轮
- 80 个节点,3.16 轮
- 160 个节点,3.66 轮
- 320 个节点,4.16 轮
- 640 个节点,4.66 轮
- ...
可以看到,随着节点数的翻倍增加,传播轮次并没有明显的增加。
这就是前面 Learn More 截图里面提到的这个词:Scalable
这是个四级词汇啊,会考的,记住了,是“可伸缩”的意思。
采用 gossip 协议的集群,Scalable is very 的 nice。