由于客户端数量和连接数量的增长,可能会需要扩展消息服务来消除瓶颈或增强性能。Message Queue 消息服务根据您的需要提供许多扩展选项。可以很容易地将这些选项归为以下几类:
垂直扩展是通过添加处理能力和扩展可用资源来实现的。这可以通过添加更多处理器或内存,切换到共享线程模型或者在 64 位模式下运行 Java VM 来完成。
如果使用的是点对点域,则可以通过允许多个使用方访问队列来扩展使用方一端。使用此方法,可以指定活动使用方和备份使用方的最大数量。负载平衡机制还将使用方的当前容量和消息处理速率考虑在内。这是 Message Queue 功能。(如果只有一个使用方访问队列,则 JMS 规范定义消息传送行为;允许多个使用方的队列行为是特定于提供者的。Message Queue 开发者指南提供了有关此扩展选项的详细信息。)
无状态水平扩展是通过使用其他代理并将现有的客户端重新分配给这些代理来实现的。此方法易于实现,但是只有当消息传送操作可以分成多个独立的工作组时,此方法才适用。
有状态水平扩展是通过将代理连接成群集来实现的。在代理群集中,每个代理不仅连接到群集内的其他每个代理,而且还连接到本地应用程序客户端。这些代理可以位于同一个主机上,也可以分布在网络中。有关目的地和使用方的信息会在群集内的所有代理中复制。目的地和订户的更新也会进行传播。因此,每个代理都可以将消息从与它直接相连的生成方路由到与群集内的其他代理连接的使用方。当使用备份使用方时,如果某个代理发生故障或连接失败,则发送到不可访问的使用方的消息可以转发到另一个代理上的备份使用方。
如果代理发生故障或连接失败,则有关持久性实体(目的地和长期订阅)的状态信息可能会失去同步。例如,如果当某个群集代理停机时,在群集内的另一个代理上创建了一个目的地,则当前者重新启动时,将不会知道有这个新目的地。要防止出现此问题,可以将群集内的某个代理指定为主代理。此代理负责跟踪主配置文件中目的地和长期订阅的所有更改,还负责更新群集内临时脱机的代理。有关其他信息,请参见第 4 章,代理群集。
即使在使用主代理时,当代理发生故障或连接失败时,Message Queue 也只是提供服务可用性,而不提供数据可用性。例如,如果群集代理变得不可用,则在该代理恢复之前,由该代理保存的任何持久性消息都将不可用。目前,只能通过使用 SunCluster Message Queue 代理来确保数据可用性。在这种情况下,持久性存储库保留在共享文件系统上。如果某个代理发生故障,则第二个节点上的 Message Queue 代理会启动一个接管共享存储库的代理。客户端会重新连接到该代理,从而既可以获得不间断的服务,又可以访问持久性数据。