Sun Java System Message Queue 3 2005Q4 技术概述 |
第 4 章
代理群集Message Queue Enterprise Edition 支持使用代理群集:一组协同工作为客户端提供消息传送服务的代理。使用群集,管理员可以将客户端连接分布在多个代理中,从而使用消息流量来扩展消息传送操作。
本章讨论此类代理群集的体系结构和内部功能,涵盖了以下主题:
请注意,代理群集提供服务可用性,但不提供数据可用性。如果某个群集内的一个代理失败,则连接到该代理的客户端能够重新连接到该群集内的另一个代理,但是在这些客户端重新连接到备用代理时可能会丢失一些数据。
群集体系结构图 4-1 显示 Message Queue 代理群集的体系结构。群集内的每个代理直接与其他所有代理相连。每个客户端(消息生成方或使用方)都有一个本机代理,借助它,该客户端可直接进行通信以收发消息,就好像该代理是群集内的唯一代理。实际上,本机代理与其他代理协同工作,为连接的所有客户端提供传送服务。
在群集内,服务可用性取决于代理能否共享有关目标和长期订户的信息。如果某个群集代理失败,则此状态信息可能会失去同步。要防止这种可能的情况,可以将群集内的某个代理指定为主代理。主代理维护配置更改记录,以跟踪群集的持久性实体(目标和长期订阅)的更改。此记录用于将此类更改信息传播到发生更改时处于脱机状态的代理。
图 4-1 群集体系结构
以下各节讨论如何在群集内传送消息以及如何配置和同步代理(即使一个或多个代理处于脱机状态)。
消息传送在群集配置中,代理共享有关目标和消息使用方的信息。每个代理都知道以下信息:
这使每个代理都可以从自己直接相连的消息生成方将消息路由到远程消息使用方。生成方的本机代理与使用方的本机代理具有不同的职责:
多个群集代理可以协同工作以最大限度地降低群集内的消息流量;例如,如果某个远程代理对于同一个主题目标有两个完全相同的订阅,则消息将只通过线路发送一次。可以设置一个目标属性以指定向本地使用方的传送优先于向远程使用方的传送,从而进一步减小流量。
如果要求客户端与代理之间的消息传送安全且经过加密,则可以对群集进行配置,以便在代理之间提供安全的消息传送。
目标属性
为一个群集代理中的物理目标设置的属性适用于群集内该目标的所有实例;但是,由这些属性指定的一些限制会应用于整个群集,而其他属性则应用于单独的目标实例。表 4-1 列出了可以为物理目标设置的属性并指定了它们的适用范围。
群集和目标
无论目标是管理员创建的、自动创建的还是临时的,都会影响该目标在群集内的传播方式以及在连接或代理失败时该目标的处理方式。
图 4-2 显示了四个群集代理。该图显示代理之间的直接(专用)连接,以及客户端与它们所连接到的代理之间的连接。该图说明了以下各节将介绍的多种可能性。
图 4-2 群集示例
使用回复模型生成消息并放入队列
如上图所示:
生成消息并放入自动创建的目标
如上图所示:
发布到主题目标
如上图所示:
在连接或代理失败时处理目标
表 4-2 解释如何在群集内复制和删除不同种类的目标。
群集配置要在启动时在群集代理之间建立连接,必须为每个代理传送其他所有代理(包括主代理,如果有)的主机名和端口号。这些信息是通过一组群集配置属性来指定的,对于群集内的所有代理,这些属性应该是相同的。虽然可以为每个代理分别指定配置属性,但这种方法容易出错,并且容易导致群集配置出现不一致的情况。因此,建议您将所有配置属性都集中放在一个群集配置文件中,供每个代理在启动时引用。这样,就可以确保所有代理共享相同的配置信息。
有关群集配置属性的详细信息,请参见 Message Queue 管理指南。
群集同步每次更改群集的配置时,有关更改的信息都会自动传播到群集内的所有代理。发生以下事件之一时,会更改群集配置:
有关这些更改的信息会立即传播到群集内发生更改时处于联机状态的所有代理。但是,发生更改时,处于脱机状态的代理(例如,已崩溃的代理)不会收到更改通知。为了给脱机代理提供该信息,Message Queue 维护群集的配置更改记录,其中记录了已创建或已销毁的所有持久性实体(目标和长期订阅)。当脱机代理恢复为联机状态时(或向群集添加新代理时),会查阅此记录以获取有关目标和长期订户的信息,然后与其他代理交换有关当前活动的消息使用方的信息。
群集内的某个代理被指定为主代理,该主代理负责维护配置更改记录。因为在没有主代理的情况下其他代理无法完成初始化,所以应该始终首先启动群集内的主代理。如果主代理处于脱机状态,则将无法在整个群集内传播配置信息,因为其他代理无法访问配置更改记录。在这些情况下,如果尝试创建、重新配置或销毁目标或长期订阅,或者尝试执行某个相关的操作(例如,重新激活长期订阅),将发生异常。(但是,非管理消息传送仍然可以正常进行。) 主代理和配置更改记录的使用是可选的。只有当群集配置发生更改或代理失败之后群集的同步非常重要时,才有必要使用它们。