限制消息分发

对等通道设计为一个广播网格。 它的基本泛洪模型涉及将网格的任何成员发送的每个消息分发给该网格的所有其他成员。 在成员生成的每条消息都与所有其他成员(例如聊天室)相关且有用的情况下,这是理想的情况。 但是,许多应用程序偶尔需要限制消息分发。 例如,如果新成员加入网格并想要检索通过网格发送的最后一条消息,则不需要将此请求广播给网格的每个成员。 请求可以限制为近邻,也可以筛选出本地生成的消息。还可以将消息发送到网格上的单个节点。 本主题讨论如何使用跃点计数、消息传播筛选器、本地筛选器或直接连接来控制消息在整个网格中的转发方式,并提供选择方法的一般准则。

跃点计数

这一 PeerHopCount 概念类似于 IP 协议中使用的 TTL(Time-To-Live)。 PeerHopCount该值绑定到消息实例,并指定在删除消息之前应转发消息的次数。 每次对等通道客户端收到消息时,客户端都会检查消息,以确定是否已指定 PeerHopCount。 如果指定了跳数,客户端会在将消息转发到相邻节点之前,将跳数值减 1。 当客户端收到跃点计数值为零的消息时,客户端将处理该消息,但不会将消息转发给邻居。

可以通过将 PeerHopCount 作为属性 (attribute) 添加到邮件类实现中适用的属性 (property) 或字段中,来将跃点计数添加到消息中。 在将消息发送到网格之前,可以将此值设置为特定值。 这样,您可以根据需要使用跃点计数来限制消息在整个网格内的分发,潜在避免不必要的消息复制。 如果网格包含大量冗余数据,或者用于向相邻邻居或几个跃点内的邻居发送消息,则这非常有用。

消息传播筛选器

MessagePropagationFilter 可用于自定义控制消息泛滥,特别是在消息内容或特定场景决定传播方式时。 该筛选器为通过节点的每个消息做出传播决策。 对于您节点接收到的源自网格中其他地方的消息以及由您的应用程序创建的消息,这同样适用。 筛选器可以访问消息及其起源,因此有关转发或删除消息的决定可以基于可用的完整信息。

PeerMessagePropagationFilter是具有单个函数的基抽象类。 ShouldMessagePropagate 方法调用的第一个参数传入消息的完整副本。 对消息所做的任何更改都不会影响实际消息。 方法调用的最后一个参数标识消息的源(PeerMessageOrigination.LocalPeerMessageOrigination.Remote)。 此方法的具体实现必须从PeerMessagePropagation枚举中返回一个常量,该常量指示消息应转发到本地应用程序(Local)、转发到远程客户端(Remote)、同时转发到两者(LocalAndRemote),或两者都不转发(None)。 可以通过访问相应的 PeerNode 对象并在属性中 PeerNode.MessagePropagationFilter 指定派生传播筛选器类的实例来应用此筛选器。 请确保在打开对等通道之前附加传播筛选器。

与网格中的单个节点联系

可以通过设置本地筛选器或设置直接连接来联系网格中的单个节点。

如果网格中的节点各自具有单个 ID,则可以在消息的实现中指定目标 ID。 可以通过在消息协定中编写函数来设置本地筛选器,该函数仅在消息 ID 与指定的目标 ID 匹配时,才会向当前节点显示该消息。 网格传输消息,因此设置新连接的开销不必产生。 但是,由于消息在整个网格中发送多次,因此效率会降低。 这非常适合将消息发送到网格的各个成员,前提是消息既不是太大也不是太频繁。

对于持久的高带宽连接,直接连接是可取的。 可以通过网格传递连接信息,然后根据您的选择建立直接连接以发送和接收消息。

选择用于限制消息分发的方法

发现需要限制消息分发的方案时,请自行提出以下问题:

  • 需要接收消息? 仅仅是一个邻居节点? 网格中其他位置的节点? 还是半个网格?

  • 此消息的发送频率是多少

  • 此消息将使用哪种 带宽

这些问题的解答可以帮助你确定是使用跃点计数、消息传播筛选器、本地筛选器还是直接连接。 请考虑以下一般准则:

    • 单个节点:本地筛选器或直接连接。

    • 一定范围内的邻居:PeerHopCount。

    • 网格的复杂子集:MessagePropagationFilter。

  • 频率

    • 非常频繁:直接连接、PeerHopCount、MessagePropagationFilter。

    • 偶尔:本地筛选器。

  • 带宽使用

    • :直接连接,不建议使用 MessagePropagationFilter 或本地筛选器。

    • :任何一种方法,很可能不需要直接连接。

另请参阅