在群集配置中,代理共享有关目的地和消息使用方的信息。每个代理都知道以下信息:
群集内所有物理目的地的名称、类型和属性
每个消息使用方的名称、位置和兴趣
上述信息的更新(删除、添加或重新配置)
这使每个代理都可以从自己直接相连的消息生成方将消息路由到远程消息使用方。生成方的本机代理与使用方的本机代理具有不同的职责:
生成方的本机代理负责保持和路由源自该生成方的消息、进行日志记录、管理事务以及处理来自使用方客户端的确认。
使用方的本机代理负责保持有关使用方的信息、将消息转发给使用方、让生成方的代理知道使用方是否仍可用以及消息是否已成功使用。
群集代理可以协同工作以最大限度地降低群集内的消息流量。例如,如果某个远程代理对于同一个主题目的地有两个完全相同的订阅,则消息将只通过线路发送一次。可以设置一个目的地属性以指定向本地使用方的传送优先于向远程使用方的传送,从而进一步减小流量。
如果要求客户端与代理之间的消息传送安全且经过加密,则可以对群集进行配置,以便在代理之间提供安全的消息传送。
为一个群集代理中的物理目的地设置的属性适用于群集内该目的地的所有实例;但是,由这些属性指定的一些限制会应用于整个群集,而其他属性则应用于单独的目的地实例。表 4–1 列出了可以为物理目的地设置的属性并指定了它们的适用范围。
表 4–1 群集代理中物理目的地的属性
属性名 |
范围 |
---|---|
maxNumMsgs |
每个代理。因此,通过将生成方分布在一个群集中,可以提高对未使用消息的总数的限制。 |
maxTotalMsgBytes |
每个代理。因此,通过将生成方分布在一个群集中,可以提高为未使用消息保留的总内存的限制。 |
lmitBehavior |
全局 |
maxBytesPerMsg |
每个代理 |
maxNumProducers |
每个代理 |
maxNumActiveConsumers |
全局 |
maxNumBackupConsumers |
全局 |
consumerFlowLimit |
全局 |
localDeliveryPreferred |
全局 |
isLocalOnly |
全局 |
useDMQ |
每个代理 |
无论目的地是管理员创建的、自动创建的还是临时的,都会影响该目的地在群集内的传播方式以及在连接失败或代理发生故障时该目的地的处理方式。以下各节将详细考察几个使用案例,以决定目的地的创建时间和目的地的复制方式。这些案例包括:
下图显示客户端生成消息并放入队列以及使用回复模型时,目的地的创建和复制方式。
管理员创建物理目的地 QW。创建时,队列在整个群集内复制。
生成方 ProdQW 向队列 QW 发送一条消息,并使用回复模型将回复定向到临时队列 TempQ1W。(应用程序创建临时目的地并添加使用方时,系统会创建和复制临时队列。)
本机代理 BrokerW 保持发送到 QW 的消息并将消息路由到第一个符合该消息选择标准的活动使用方。根据哪个使用方准备好接收该消息,将消息传送到使用方 C1QW(位于 BrokerX 上)或使用方 C2QW(位于 BrokerZ 上)。接收该消息的使用方会将回复发送到目的地 TempQ1W 。
下图显示生成方向不存在且必须自动创建的目的地发送消息时,目的地的创建和复制方式。
生成方 ProdAutoQY 向代理中不存在的目的地 AutoQY 发送一条消息。
代理保持该消息并创建目的地 AutoQY。
自动创建的目的地不会自动在群集内复制。只有当某个使用方选择从队列 AutoQY 接收消息时,该使用方的本机代理才创建目的地 AutoQY 并将这些消息传递到该使用方。当一个使用方创建自动创建的目的地时,该目的地将在群集内复制。在本示例中,使用方 CAutoQY 创建目的地时就会复制该目的地。
下图显示客户端将消息发布到管理员创建的主题目的地时,目的地在群集中的创建和复制方式。
管理员创建物理主题目的地 TY。管理员创建的目的地 TY 会在使用之前在代理群集内复制。
发布者 PubTY 向主题 TY 发送一条消息。
本机代理 BrokerY 保持发布到 TY 的任何消息,并将这些消息路由到所有符合该消息选择标准的主题订户。在本示例中,C1TY 和 C2TY 均订阅主题 TY。
表 4–2 解释如何在群集内复制和删除不同种类的目的地。
表 4–2 在群集内处理目的地