为什么八卦消息传得快?

  虽然美剧gossip gril(绯闻女孩)作为一部剧集已经成为过去式,但是她造成的影响力却依然存在。

  当初站在最前沿引领时尚的服装,尽管已经过去了差不多十年,但即便拿到现在来看,也丝毫不过时。

  不过,今天我们要谈的既不是服装,也不是女孩(gril),而是八卦消息(gossip)。

  八卦消息的传播很有特点,最初可能只有很少的几个人发现了八卦新闻,得知这些花边消息的人或者转发在朋友圈,或者转发给好友,尽管每个人的好友都有限,但经过一番杂乱无章的传播后,最终八卦消息在社交网络中快速的发酵,所有人都得已知晓。

  这个奇妙的传播过程很有趣,它不仅实现了消息在人群中的快速同步,又具有很强的纠错性。

  比如当年冠希哥的艳照门事件,短短时间内就传遍了东亚娱乐圈,就算你不认得男女主也不要紧,持续海量的新闻会帮你认清现实。当时事业正如日中天的陈冠希,颜值演技俱佳,远非现在的小鲜肉之流可比,却因此息影远走,非常遗憾。

  因为八卦消息在传播时的独特性,在1987年ACM 上的论文 《Epidemic Algorithms for Replicated Database Maintenance》中该协议被正式提出,并被命名为为gossip协议。它还有很多别名,如“流言算法”、“疫情传播算法”等,电脑病毒的传播,森林大火,细胞扩散等现象都能从gossip协议中得以解释。

  在区块链技术兴起后,人们为如何保证分布式系统中信息传播一致性伤透了脑筋,如果信息的传输得不到保障,那任何建立于其上的业务都无从谈起。而gossip协议在这方面有着得天独厚的优势。

  Trias将gossip与区块链结合到一起,使得分布式系统中信息传播一致性方面得到显著提升。区块链网络信息的点对点传播,与gossip协议的低 CPU开销和低网络带宽占用实现了非常好的结合。

  另外,有必要提一下gossip的学术说法。gossip是一种被用在分布式的非强一致性系统中用来同步各节点状态的方法,是一种最终一致性算法。

  学术名词是不大好懂。一言以蔽之,就是在传播过程中,该算法不要求每个节点的信息都一致,但是随着时间的增长,在最终的某一时刻,全网会得到相同的信息。

  前文说到,gossip被设计成低 CPU开销和低网络带宽占用,因此非常适合大型的 P2P网络。另外,该协议扩展性好,具备容错天然的优势,去中心化,简单,组网规模几乎不受限制,通信性能好。

  任何一个网络中,都不能完全避免错误。这些错误可能是来自于运行系统,如网络的延迟,平台运行BUG等,也可能是认为因素,如黑客攻击,用户误操作等。尤其是在去中心化的体系中,由于没有权威的中心机构来裁决,任何错误一经扩散都可能造成巨大的不良影响,因此良好的容错机制尤为重要。

  而gossip在传播时,同一份信息,网络中每一个参与者都会从其他参与者那里收到很多份,即便里面混杂着虚假消息,也能轻易得排除。当然,虚假消息不能过半,否则就弄假成真了。

  按时间,可分为同步gossip和异步gossip两种模式。同步算法是指网络中的节点有确定的时序关系,并按照一定的时序关系进行数据交换,同步几乎没有实际应用。异步算法指的是,每一个时间间隔随机唤醒网络中的一个节点,被唤醒的节点随机的选择邻居节点进行数据交换。

  按节点之间的更新方式,可分为单播gossip和广播gossip。单播gossip指被唤醒的节点每次随机选取一个节点进行数据交换,单播算法同样无法在实际中使用;广播gossip是指被唤醒的节点与所有邻居节点都进行数据交换。

  按交互方式,可分为Anti-entropy(反熵):以固定的概率传播所有的数据,只要数据不同步,就开始同步数据。每个节点周性随机选择其他节点,然后相互交换自己的所有数据来消除两者之间的差异;

  Rumor-Mongering(谣言传播):仅传播新到达的数据,每隔固定的时间开始同步数据。指当一个节点有了新的信息后,该节点变为活跃状态,周期性的联系其他节点并发送新的信息,直到所有节点都知道该新消息。

  实际中为了保证通信代价和可靠性,一般采用Rumor mongering,且每隔一段时间使用一次Anti-entropy,保证节点的信息交换的可靠性。

  1、Push 模式:一般拥有新信息的节点才会作为发起节点,没有新信息的节点作为接收方,更新比自己新的数据。

  2、Pull 模式:A 仅将数据 key、version 推送给 B,B 将本地比 A 新的数据(key,value,version)推送给 A,A 更新本地。与push模式相反,发起数据交换的节点随机选择节点并获取所选节点的数据,一般无新数据的节点才会作为发起节点。

  3、Push-Pull 模式:在 Pull 的基础上,A 再将本地比 B 新的数据推送给 B,然后 B 再更新本地数据。也就是在 Pull 之后,A 再对比自己掌握的信息,更新 B 手中掌握的信息。

相关文章

用户评论

*

*

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。