DMR订阅传播和数据转发
在管理员建立了它们之间的关系之后,事件网格中的代理会动态地发现路由消息的需求。随着订阅的增加和删除,这些变化会自动广播,以便整个网络对订阅的了解随着变化而更新。在事件网 格中保持订阅信息的最新状态不需要手动干预。
对于同一集群内节点和不同集群节点之间的这个过程有所不同。这些差异在以下部分中描述。
集群内的订阅传播锚
每个节点向其直接连接的邻近节点广告其需要的订阅。所有节点客户端的订阅信息被聚合,然后发送给邻近节点。接收节点不会进一步传播这些订阅。由于每个节点都连接到每个其他节点,所有节点都会被填充有整个集群的完整、不重复的订阅信息。
例如,在上图中,节点A向节点B、C和D广告一个订阅,例如payments
。节点B、C和D不会在其控制通道上重新传输payments
订阅。请注意,每个节点可能是一个单独的代理或一个HA对/组代理。
集群间的订阅传播锚
网关节点在集群之间传播订阅信息。在网关节点通过其外部链接发送该信息之前,它首先聚合其整个集群的完整订阅集。
例如,在上图中,集群A向集群B和C广告一个订阅payments
。集群B和C不会在其控制通道上重新传输payments
订阅。因此,集群D没有收到payments
订阅。
订阅持久性锚
节点中的每个事件代理持久化其自己的保证订阅,但不持久化其他节点在事件网格中传播给它的订阅。当订阅传播到HA节点时,该节点的两个代理都会了解订阅,无论HA对中的哪一个当前处于活动状态。两个代理同时更新整个网络的订阅集。在代理故障的情况下,该代理的HA伙伴继续为本地节点提供服务。没有订阅状态或消息服务的丢失。当失败的代理重新启动时,它首先与相邻节点和自己的HA伙伴重新同步其订阅数据库,然后提供服务。
如果失败的代理没有HA伙伴,或者该伙伴也失败了,整个DMR节点就失败了,其本地客户端没有服务。然而,预定路由到该节点的保证消息继续在其邻近节点上排队,并将在失败的节点重新启动后交付给客户端。没有保证消息的丢失。但是,在节点非运行状态下发布的直接消息会丢失。
防止订阅传播竞争条件锚
如果您使用DMR进行请求/回复消息传递,您必须使用Solace PubSub+消息传递API的请求/回复方法,以防止与订阅传播相关的可能的竞争条件。更具体地说,您必须使用内置的请求/回复主题(默认情况下是内部P2P主题)。如果您将ReplyTo
设置为自定义值,将会出现订阅延迟和订阅传播竞争条件的可能性。
有关请求/回复消息传递的更多信息,请参见请求回复消息传递。
有关Solace PubSub+消息传递API的更多信息,请参见PubSub+消息传递API。
数据转发锚
与订阅传播一样,在集群内和不同集群之间的数据转发机制略有不同。然而,在任何情况下,相同的订阅或队列在不同节点上吸引相同的消息。
DMR保留了消息发布的服务质量。
如果事件网格中多个节点存在相同的队列名称,并且客户端通过名称发布到队列,消息将被发送到网格中所有具有相同名称的队列。如果您不希望这种行为,请发布到队列特定的订阅或确保队列名称在网格中是唯一的。
集群内锚
客户端发布的消息通过数据通道发送到直接连接的邻近节点,这些节点具有匹配的订阅或队列。即使消息要发送给多个客户端或队列,也只发送一份消息副本。接收节点不会进一步传输数据。由于来自源节点的消息只通过单个通道到达目的地,因此不存在转发循环。
集群间锚
在这种情况下,集群通过网关节点之间的外部链接直接向其他集群发送消息。当网关节点接收到来自其自己集群的消息时,它将消息转发到其外部链接上,只发送给具有匹配订阅或队列的集群。如果网关节点接收到来自不同集群的消息,它将消息转发到其内部链接上,只发送给其集群中具有匹配 订阅或队列的节点。即使消息要发送给多个客户端或队列,也只通过外部链接发送一份消息副本。
事件网格中的数据流总结锚
DMR内部链接总是以全网格的方式使用,以便每个节点与所有其他节点直接通信。每个内部DMR集群中的每个节点都与其他节点交换订阅。数据只从发布者连接的节点流向消费者连接的节点;消息不通过中间节点流动。客户端订阅在与邻近节点共享之前被汇总。这意味着,如果节点A与节点B交换订阅,并且节点A有三个客户端具有相同的订阅,只有在订阅的第一次实例中,一个订阅被传播到节点B,只有在最后一个客户端删除其订阅后才被移除。这最小化了邻近节点看到的订阅变化量。每个事件消息只通过内部链接发送一次,在目的地节点上进行分发。
DMR外部链接用于内部网格化的DMR集群之间。没有规则规定外部链接必须是全网格化的,但只有通过外部链接直接连接的集群才能交换消息。因此,如果集群A需要与集群B通信,那么两个集群之间必须存在外部链接。除了具有复制伙伴的网关节点外,任何两个集群之间只能有一个外部链接。在将节点订阅发送到邻近集群之前进行汇总。如果集群A在三个节点上具有相同的订阅,只有一个副本的订阅通过外部链接共享到集群B。每个事件消息只通过外部链接发送一次,分发到目标集群的内部链接节点,然后在节点内进一步分发到已订阅的客户端。