通过发布/预订消息传递进行工作负载分担
在发布/预订消息传递中,消息传递系统将已发布的每条消息的一个副本发送至每个相匹配的预订。订户(即,将使用发布/预订消息的应用程序)将从各个预订使用这些消息。要均衡一个应用程序的多个实例的工作负载(例如,当应用程序在服务器集群中运行时),那么该应用程序的所有实例必须使用同一预订。
图 1 表明在此配置中,只有该应用程序的一个实例处理每条发送至预订的消息。但是,图 2 表明,如果同一应用程序的不同实例配置为接收来自不同预订的消息,那么每个实例将处理每条相匹配的消息的副本,以便分散每条信息。
图 1. 共享单个预订(工作负载分担)的应用程序实例

图 2. 使用各个预订(扇出消息)的应用程序实例

对于点到点消息,可以使用队列目标和分区队列,以便对消息进行工作负载均衡。但是,您无法按此方式来划分预订。
对于发布/预订消息传递,要将多个应用程序实例配置为使用同一预订,从而均衡消息工作负载,那么必须使用持久预订。必须能够从同一预订同时使用该应用程序的多个实例。此类型的预订称为共享持久预订。要配置共享持久预订,请为相关连接工厂或激活规范设置“共享持久预订”属性。
持久预订具有主消息传递引擎和唯一标识,该标识由客户机标识和预订名称组成。即使没有活动订户,消息传递系统也可以为预订累积新的相匹配的发布。主消息传递引擎使用发布点为预订累积消息。当订户启动或者重新启动时,消息传递系统使用唯一标识和主消息传递系统来标识发布点,查找持久预订以及传递所累积的任何消息。
非持久预订不具备唯一标识。它的持续时间为其订户的生存期。多个应用程序实例无法从同一非持久预订接收消息。
可以将“共享持久预订”属性设置为下列其中一个值:
- 在集群中
- 当客户机使用同一客户机标识和持久预订名称时,总线将在连接至同一集群中的总线成员的客户机之间分配工作。
- 总是共享
- 当客户机使用同一客户机标识和持久预订名称时,总线将在客户机(无论它们在何处连接至总线)之间分配工作。
- 从不共享
- 客户机无法与现有会话使用相同的客户机标识和持久预订名称。