发布/订阅是一种系统,在该系统中,对等点聚集在他们感兴趣的主题周围。对某个主题感兴趣的对等点被称为订阅了该主题:
对等点可以向主题发送消息。每条消息都会传递给订阅该主题的所有对等方:
pub/sub 的使用示例:
在点对点发布/订阅系统中,所有对等点都参与在整个网络中传递消息。对等发布/订阅系统有几种不同的设计,它们提供了不同的权衡。理想的属性包括:
libp2p 当前使用一种称为gossipsub的设计。它以这样的事实命名,即对等点互相八卦他们看到了哪些消息,并使用这些信息来维护消息传递网络。
在对等方可以订阅主题之前,它必须找到其他对等方并与它们建立网络连接。发布/订阅系统本身没有任何方法来发现对等点。相反,它依赖于应用程序代表它寻找新的对等点,这个过程称为环境对等点发现。
发现对等点的潜在方法包括:
例如,在一个 BitTorrent 应用程序中,上述大多数方法在下载文件的过程中已经使用过。通过重用在 BitTorrent 应用程序执行其常规业务时发现的对等点,该应用程序也可以建立一个强大的发布/订阅网络。
发现的对等点被询问是否支持发布/订阅协议,如果支持,则将其添加到发布/订阅网络。
在 gossipsub 中,对等点通过全消息对等互连或仅元数据对等互连相互连接。整体网络结构由这两个网络组成:
全消息对等互连用于在整个网络中传输消息的全部内容。该网络连接稀疏,每个对等点仅连接到其他几个对等点。(在里面八卦规范 这个连接稀疏的网络称为网格,其中的对等点称为网格成员。)
限制全消息对等互连的数量很有用,因为它可以控制网络流量;每个对等点仅将消息转发给其他几个对等点,而不是所有对等点。每个对等点都有一个目标数量的要连接的对等点。在这个例子中每个对等体将理想像将被连接到3个的其它对等体,但将沉降2 - 4 连接:
在本指南中,以紫色突出显示的数字 可由开发人员配置。
对等互连度(也称为网络度或D)控制着网络速度、可靠性、弹性和效率之间的权衡。更高的对等程度有助于更快地传递消息,更有可能到达所有订阅者,并且任何对等点离开而破坏网络的可能性也更小。然而,高对等程度也会导致在整个网络中发送每条消息的额外冗余副本,从而增加参与网络所需的带宽。
在 libp2p 的默认实现中,理想的网络对等程度是 6,可以接受4 – 12 之间的任何 程度。
除了全消息对等连接的稀疏连接网络之外,还有一个仅元数据对等连接的密集连接网络。该网络由非全消息对等体的对等体之间的所有网络连接组成。
仅元数据网络共享有关哪些消息可用的八卦,并执行功能以帮助维护全消息对等网络。
对等互连是双向的,这意味着对于任何两个连接的对等点,两个对等点都认为它们的连接是完整消息,或者两个对等点都认为它们的连接仅是元数据。
任一对等方都可以通过通知另一方来更改连接类型。嫁接是将仅元数据连接转换为完整消息的过程。修剪 是相反的过程;将完整消息对等互连转换为仅元数据:
当一个对等点的全消息对等点太少时,它会随机嫁接一些只有元数据的对等点成为全消息对等点:
相反,当一个对等点有太多的全消息对等点时,它会随机将其中一些修剪回仅元数据:
在 libp2p 的实现中,每个 peer 每1秒执行一系列检查 。这些检查称为 心跳。在此期间进行嫁接和修剪。
对等点跟踪其直接连接的对等点订阅了哪些主题。使用这些信息,每个对等点都能够建立一个关于他们周围主题的图片,以及哪些对等点订阅了每个主题:
通过发送订阅和 取消订阅消息来跟踪订阅。当两个对等点之间建立新连接时,它们首先向对方发送它们订阅的主题列表:
然后随着时间的推移,每当对等方订阅或取消订阅主题时,它都会向其每个对等方发送订阅或取消订阅消息。无论接收对等方是否订阅了相关主题,这些消息都会发送到所有连接的对等方:
订阅和取消订阅消息与嫁接和修剪消息齐头并进。当一个节点订阅一个主题时,它会选择一些节点,这些节点将成为该主题的完整消息节点,并在订阅消息的同时向它们发送嫁接消息:
当对等方取消订阅某个主题时,它将在发送取消订阅消息的同时通知其完整消息对等方他们的连接已被修剪:
当一个节点想要发布一条消息时,它会向它所连接的所有完整消息的节点发送一个副本:
类似地,当一个对等点从另一个对等点收到一条新消息时,它会存储该消息并将副本转发给它所连接的所有其他完整消息对等点:
在里面 八卦规范,对等点也称为路由器,因为它们具有通过网络路由消息的功能。
对等点记住最近看到的消息列表。这让对等方仅在第一次看到消息时对其进行操作,而忽略已看到消息的重传。
对等方也可以选择验证收到的每条消息的内容。什么算作有效和无效取决于应用程序。例如,聊天应用程序可能强制所有消息必须少于 100 个字符。如果应用程序告诉 libp2p 一条消息无效,那么该消息将被丢弃并且不会通过网络进一步复制。
同行们八卦他们最近看到的消息。每 1秒,每个对等方随机选择 6个仅元数据对等方,并向他们发送最近看到的消息列表。
八卦让同伴有机会注意到他们错过了全消息网络上的消息。如果一个 peer 注意到它反复丢失消息,那么它可以与拥有消息的 peer 建立新的全消息对等。
以下是如何通过仅元数据对等互连请求特定消息的示例:
在里面 八卦规范,八卦宣布最近看到的消息称为IHAVE消息,对特定消息的请求称为IWANT消息。
允许对等点向他们未订阅的主题发布消息。有一些关于如何执行此操作的特殊规则,以帮助确保可靠地传递这些消息。
第一次节点想要向它未订阅的主题发布消息时,它会随机选择订阅该主题的6 个节点(如下所示的3 个)并将它们记住为该主题的扇出节点:
与其他类型的对等互连不同,扇出对等互连是单向的;它们总是从主题外的对等点指向订阅该主题的对等点。订阅该主题的对等方不会被告知他们已被选中,并且仍将连接视为任何其他仅元数据对等方。
每次发送者想要发送消息时,它都会将消息发送到其扇出对等点,然后由后者在主题内分发消息:
如果发送者要发送消息,但注意到他们的一些扇出对等点自上次以来就消失了,他们将随机选择额外的扇出对等点将它们顶回6。
当一个节点订阅一个主题时,如果它已经有一些扇出节点,它会更喜欢它们成为完整消息的节点:
在2分钟未向主题发送任何消息后,该主题的所有扇出对等点都将被遗忘:
对等点实际通过网络相互发送的数据包是本指南中所有不同消息类型的组合(应用程序消息、拥有/想要、订阅/取消订阅、嫁接/修剪)。这种结构允许将多个不同的请求批量处理并在单个网络数据包中发送。
这是整个网络数据包结构的图形表示:
见 规格 对于确切的 协议缓冲区 用于编码网络数据包的模式。
以下是每个对等方必须记住的状态摘要,以参与发布/订阅网络: