首页 > 解决方案 > IBM MQ 中的集群 PUB/SUB 是否涉及使用集群通道来传递消息?

问题描述

理论上,当在集群主题中发布时,消息的副本会通过订阅对象传递给订阅该主题的所有队列管理器。

问题是纯理论问题:消息副本是否通过集群通道传递到目标队列管理器?集群通道是否用于此目的?

如果答案是否定的,那么将出版物的副本从来源地传递到目的地的机制是什么?

标签: ibm-mqpublish-subscribe

解决方案


简短的回答是肯定的,如果发布者不是进行订阅的队列管理器的本地,那么 IBM MQ 使用集群通道来传递发布到集群主题的消息。


更长的答案是,对于 IBM MQ v7.0/7.1/7.5,如果发布发生在所有注册了该主题的代理订阅的队列管理器中,则交付始终直接来自队列管理器。

这样做的问题是集群中的每个队列管理器都需要了解集群中的每个其他队列管理器以及集群中任何集群主题的每个订阅者。在大型集群中,即使只有两个队列管理器参与集群发布/订阅,集群中的每个队列管理器都需要了解每个其他队列管理器和订阅。

当您第一次在 PR(部分存储库)队列管理器上对主题进行集群时,它会通知 FR(完整存储库)有关新主题的信息,然后他们会将其发送到集群中的每个 PR 队列管理器以及有关如何连接的信息到集群中的每个其他 PR。如果集群中有 1000 个 PR 队列管理器,这意味着每个 PR 现在都知道其他 999 个 PR。

此外,当您在任何 PR 上添加对集群主题的订阅时,该 PR 将连接到所有其他 PR 并告诉它设置代理订阅,这意味着 PR 将启动 999 个 CLUSSDR 频道来传播此代理订阅。

在最初的信息传播之后,如果只有两个 PR 使用 pub/sub,例如发布者应用程序发布到 PR1 上的主题,订阅者应用程序订阅 PR2 上的主题,除了关于主题的集群更新之外,只有在PR1 和 PR2。

这与集群的 QUEUE 行为不同。当您第一次将 QUEUE 集群到 PR 队列管理器时,它将通知 FR(完整存储库)有关 QUEUE。此时,FR 不需要通知其他 PR(他们无论如何都会通知其他 FR)。如果你想把那个集群队列放到另一个 PR 上,如果 PR 不知道这个队列,它会去 FR 看看队列是否存在,如果存在,FR 会向 PR 发送有关它的信息。然后,FR 知道 PR 对该对象感兴趣,并且对集群 QUEUE 的任何进一步更新仅发送到感兴趣的 PR。如果应用程序继续放入集群队列以保持这种兴趣,PR 也会定期让 FR 知道他们仍然感兴趣,


在 MQ v8 中,IBM 为集群添加了路由 pub/sub,原来的现在称为直接 pub/sub。

您现在可以使用新属性更改集群主题的行为CLROUTE,可以将其设置为DIRECT默认值,并像 MQ v8 之前的工作一样工作,或者您可以通过将其设置为 来获得新行为TOPICHOST

我所说的第一部分保持不变,因为集群中的每个 PR 都会从 FR 获得有关新集群 TOPIC 的更新,但他们只会了解您在并非所有其他队列管理器上定义 TOPIC 的一个 PR在集群中。

当订阅 TOPIC 时,订阅的 PR 将只连接到定义了集群 TOPIC 的 PR CLROUTE(TOPICHOST),而不连接到所有其他 PR 以创建代理订阅。如果一条消息发布到任何 PR 上的主题,该 PR 将仅将其发送到 TOPICHOST,然后将其发送到通知它代理订阅的其他 PR。(请注意,您可以而且应该拥有多个 TOPICHOST 以实现冗余,但我没有深入了解这些细节)。


来自 IBM MQ L2 支持的 Angel Rivera 提供了一个非常好的关于这个主题的网络广播,您可以在此处访问音频的 PDF 和 MP3:MQ Pub/Sub:主题主机路由集群


推荐阅读