客户端连接到代理之后,即可开始路由和传送消息。 在这个阶段,代理负责创建和管理不同类型的物理目的地,确保消息流畅通,以及有效地使用资源。您可以使用路由属性中介绍的代理配置属性,根据应用程序的需要以相应方式来管理这些任务。
代理的性能和稳定性取决于可用的系统资源(如内存)以及资源的使用效率。 可以设置配置属性,以防止代理因传入消息太多而过载,或者耗尽内存。这些属性在三种不同的级别上起作用,使消息服务在资源不足时仍可正常运行:
系统范围的消息限制共同应用于系统中的所有物理目的地。 这些限制包括代理保存的最大消息数 (imq.system.max_count) 以及这些消息占用的最大总字节数 (imq.system.max_size)。如果达到这两个限制中的任何一个,代理将会拒绝所有新消息,直到待处理消息低于该限制。 在单个消息的最大大小 (imq.message.max_size) 以及回收过期消息的时间间隔 (imq.message.expiration.interval) 方面也存在限制。
单个目的地限制控制发送到特定物理目的地的消息流。 第 15 章,物理目的地属性参考中对控制这些限制的配置属性进行了介绍。其中包括以下几个方面的限制:目的地可以保存的消息的数量和大小、可以为目的地创建的消息生成方和使用方的数量,以及可以作为一个批次一起传送到目的地的消息数。
可以对目的地进行配置以响应内存限制:降低消息生成方传送消息的速度、拒绝新的传入消息,或者丢弃时间最长或优先级最低的现有消息。 对于以这种方式从目的地中删除的消息,可以选择将其移动到停用消息队列,而不是彻底丢弃;代理属性 imq.destination.DMQ.truncateBody 可以控制是将整个消息主体保存在停用消息队列中,还是仅仅将消息头和属性数据保存在停用消息队列中。
为了在应用程序开发和测试期间提供方便,可以将消息代理配置为:只要消息生成方或使用方尝试访问的目的地不存在,即自动创建新的物理目的地。 表 14–3 中汇总的代理属性与上面介绍的代理属性类似,但它们适用于这种自动创建的目的地,而不是以管理方式创建的目的地。
系统内存阈值定义了几个内存使用级别,代理将根据这些级别采取越来越严格的措施以防止内存过载。 共定义了四个这样的使用级别:
Green:有大量内存可用。
Yellow:代理内存开始变得不足。
Orange:代理内存非常少。
Red:代理已没有可用内存。
定义这些级别的内存占用百分比分别由代理属性 imq.green.threshold、 imq.yellow.threshold、imq.orange.threshold 和 imq.red.threshold 指定;默认值为 0% (green)、80% (yellow)、90% (orange) 和 98% (red)。
当内存使用从一个级别上升到另一个级别时,代理将采取渐进的响应措施:首先将消息从活动内存交换到持久性存储库中,然后限制非持久性消息的生成方,最后阻止消息流入代理。 (这两种措施都会降低代理的性能。)代理使用以下方法来限制消息生成:将传送的每个批次的大小限制为由属性 imq.resourceState .count 所指定的消息数,其中 resourceState 分别为 green 、yellow、orange 或 red 。
触发这些系统内存阈值表明系统范围和目的地级别的消息限制设置得过高。由于内存阈值无法始终及时地捕获潜在的内存过载,因此不应该依赖它们来控制内存使用,而应重新配置系统范围和目的地级别的限制以优化内存资源。