分布式排队和集群

分布式排队意味着将消息从一个队列管理器发送到另一个队列管理器。 接收队列管理器可以在同一台机器上,也可以在另一台机器上; 在附近或在世界的另一侧。 它可以在与本地队列管理器相同的平台上运行,也可以在 IBM® MQ支持的任何平台上运行。 您可以手动定义分布式排队环境中的所有连接,也可以创建集群并让 IBM MQ 为您定义许多连接详细信息。

分布式 排队

图 1。 分布式排队组件概述
分布式排队的组件。 应用程序连接到队列管理器,并打开队列以使用传输服务将消息传输到另一个队列管理器。
在上图中:
  • 应用程序使用 MQCONN 调用来连接到队列管理器。 然后,应用程序使用 MQOPEN 调用来打开队列,以便它可以将消息放入队列中。
  • 每个队列管理器都有其每个队列的定义。 它可以具有 本地队列 (即,由此队列管理器托管) 的定义以及 远程队列 (即,由其他队列管理器托管) 的定义。
  • 如果消息以远程队列为目标,那么本地队列管理器会将它们保存在 传输队列上,该队列会将它们持久存储在消息存储器中,直到可以将它们转发到远程队列管理器为止。
  • 每个队列管理器都包含通信软件 (称为 移动服务) ,队列管理器使用这些软件与其他队列管理器进行通信。
  • 传输服务 独立于队列管理器,可以是下列任何一项 (取决于平台):
    • 系统网络体系结构高级程序间通信 (SNA APPC)
    • 传输控制协议/因特网协议 (Transmission Control Protocol/Internet Protocol,TCP/IP)
    • 网络基本输入/输出系统 (NetBIOS)
    • 顺序包交换 (SPX)

发送消息所需的组件

如果要将消息发送到远程队列管理器,那么本地队列管理器需要 传输队列通道的定义。 通道是两个队列管理器之间的单向通信链路。 它可以将消息发送到远程队列管理器中的任意数量的队列。

通道的每个端都具有单独的定义,例如,将其定义为发送端或接收端。 简单通道由本地队列管理器上的 发送方 通道定义和远程队列管理器上的 接收方 通道定义组成。 这两个定义必须具有相同的名称,并且它们共同构成一个通道。

用于处理消息发送和接收的软件称为 消息通道代理程序 (MCA)。 在通道的每一端都有一个 消息通道代理程序 (MCA)。

每个队列管理器都应该具有 死信队列 (也称为 未传递的消息队列 )。 如果无法将消息传递到其目标,那么会将这些消息放入此队列。

下图显示了队列管理器,传输队列,通道和 MCA 之间的关系:
图 2。 发送消息
通过通道发送消息。 发送端,将消息放到传输队列上,并通过通道发送到接收方端的应用程序队列。 MCA 处理消息的发送和接收。

返回消息所需的组件

如果应用程序要求从远程队列管理器返回消息,那么需要定义另一个通道,以便在队列管理器之间以相反的方向运行,如下图所示:
图 3。 双向发送消息
发送方和接收方队列管理器都具有传输队列和应用程序队列,以允许 MCA 双向发送消息。 可以将消息从每个队列管理器的传输队列发送到另一个队列管理器的应用程序队列。 为每个方向的消息传输定义了通道。

集群

您可以在集群中对一组队列管理器进行分组,而不是手动定义分布式排队环境中的所有连接。 执行此操作时,队列管理器可以使其托管的队列可供集群中的其他队列管理器使用,而无需针对每个目标的显式通道定义,远程队列定义或传输队列。 集群中的每个队列管理器都有一个传输队列,用于将消息传输到集群中的任何其他队列管理器。 对于每个队列管理器,您只需要定义一个集群接收方通道和一个集群发送方通道; 任何其他通道都由集群自动管理。

IBM MQ 客户机可以连接到属于集群的队列管理器,就像它可以连接到任何其他队列管理器一样。 与手动配置的分布式排队一样,您使用 MQPUT 调用将消息放入任何队列管理器中的队列。 您可以使用 MQGET 调用从本地队列检索消息。

支持集群的平台上的队列管理器不必是集群的一部分。 您可以继续手动配置分布式排队,也可以使用集群来代替分布式排队。

使用集群的优点

集群提供了两个关键优势:
  • 集群简化了 IBM MQ 网络的管理,这些网络通常需要针对要配置的通道,传输队列和远程队列的许多对象定义。 在许多队列管理器需要互连的大型网络中,这种情况尤其严重,可能发生变化。 这种架构特别难以配置和积极维护。
  • 集群可用于在集群中的队列和队列管理器之间分配消息流量的工作负载。 此类分发允许将单个队列的消息工作负载分布到位于多个队列管理器上的该队列的等效实例中。 工作负载的这种分布可用于实现对系统故障的更大弹性,并提高系统中特别活跃的消息流的缩放性能。 在这种环境中,分布式队列的每个实例都使用了处理消息的应用程序。 有关更多信息,请参阅 使用集群进行工作负载管理

如何在集群中路由消息

您可以将集群视为由良心系统管理员维护的队列管理器网络。 无论何时定义集群队列,系统管理员都会根据需要在其他队列管理器上自动创建相应的远程队列定义。

您不需要创建传输队列定义,因为 IBM MQ 在集群中的每个队列管理器上提供了传输队列。 此单个传输队列可用于将消息传递到集群中的任何其他队列管理器。 您不限于使用单个传输队列。 队列管理器可以使用多个传输队列来分隔发送到集群中每个队列管理器的消息。 通常,队列管理器使用单个集群传输队列。 您可以更改队列管理器属性 DEFCLXQ,以便队列管理器对集群中的每个队列管理器使用不同的集群传输队列。 您还可以手动定义集群传输队列。

所有加入集群的队列管理器都同意以这种方式工作。 他们发送有关自己和他们托管的队列的信息,并接收有关集群的其他成员的信息。

要确保在队列管理器变为不可用时不会丢失任何信息,请在集群中指定两个队列管理器以充当 完整存储库。 这些队列管理器存储有关集群中所有队列管理器和队列的完整信息集。 集群中的所有其他队列管理器仅存储有关这些队列管理器及其与其交换消息的队列的信息。 这些队列管理器称为 部分存储库。 有关更多信息,请参阅 集群存储库

要成为集群的一部分,队列管理器必须具有两个通道: 集群发送方通道和集群接收方通道:
  • 集群发送方通道是类似于发送方通道的通信通道。 必须在队列管理器上手动创建一个集群发送方通道,以将其连接到已是集群成员的完整存储库。
  • 集群接收方通道是类似于接收方通道的通信通道。 必须手动创建一个集群接收方通道。 通道充当队列管理器接收集群通信的机制。
然后,将自动创建此队列管理器与集群的其他成员之间的通信所需的所有其他通道。
下图显示了名为 CLUSTER 的集群的组件:
图 4: 队列管理器集群
该图显示由三个队列管理器 (其中两个主机完整存储库) 组成的 IBM MQ 集群。
  • CLUSTER 包含三个队列管理器: QM1, QM2和 QM3。
  • QM1 和 QM2 托管有关集群中队列管理器和队列的信息的完整存储库。
  • QM2 和 QM3 托管一些集群队列,即可供集群中任何其他队列管理器访问的队列。
  • 每个队列管理器都有一个名为 TO.qmgr 的集群接收方通道,可以在该通道上接收消息。
  • 每个队列管理器还具有一个集群发送方通道,在该通道上,它可以将信息发送到其中一个存储库队列管理器。
  • QM1 和 QM3 发送到 QM2 上的存储库, QM2 发送到 QM1上的存储库。