14.4. 启用消息重新分发
如果您的代理集群配置了 消息-load-balancing
设置为 ON_DEMAND
或 OFF_WITH_REDISTRIBUTION
,则可以配置 消息 重新分配以防止在队列中没有消费者使用消息的消息"stuck"。
这部分包含有关以下内容的信息:
14.4.1. 了解消息重新分发
代理集群使用负载均衡来在集群中分发消息负载。当在集群连接中配置负载均衡时,您可以使用 以下消息-load-balancing
设置启用 redistribution:
-
ON_DEMAND
- 启用负载均衡并允许重新分发 -
OFF_WITH_REDISTRIBUTION
- 禁用负载均衡,但允许重新分发
在这两种情况下,代理仅将信息转发给具有匹配消费者的其他代理。这个行为可确保消息不会移到没有消费者使用消息的队列。但是,如果在消息转发到代理后连接到队列后,这些消息会在队列中变为"stuck"且不会被使用。此问题有时被称为 星号。
消息重新分发通过自动重新分发消息从没有消费者到集群中有匹配使用者的代理的队列重新分发。
使用 OFF_WITH_REDISTRIBUTION
时,代理仅在没有活跃本地消费者的情况下将消息转发到匹配消费者的其他代理,允许您在提供消费者不可用时优先考虑代理。
消息重新分发支持使用过滤器(也称为 选择器),即当消息与可用本地消费者的选择器不匹配时重新分发。
其他资源
- 有关集群负载均衡的更多信息,请参阅 第 14.1.1 节 “代理集群如何平衡消息负载”。
14.4.2. 配置消息重新分发
此步骤演示了如何配置消息重新使用负载均衡。如果您希望在没有负载均衡的情况下重新分配消息,将 < ;message-load-balancing&
gt; 设置为 OFF_WITH_REDISTRIBUTION
。
流程
-
打开 &
lt;broker_instance_dir> /etc/broker.xml
配置文件。 在 &
lt;cluster-connection>
; 元素中,验证<message-load-balancing&
gt; 是否已设置为ON_DEMAND
。<configuration> <core> ... <cluster-connections> <cluster-connection name="my-cluster"> ... <message-load-balancing>ON_DEMAND</message-load-balancing> ... </cluster-connection> </cluster-connections> </core> </configuration>
在 &
lt;address-settings
> 元素内,为队列或一组队列设置重新分发延迟。在这个示例中,在最后一个消费者接近后,负载均衡到
my.queue
的消息将被重新分配 5000 毫秒。<configuration> <core> ... <address-settings> <address-setting match="my.queue"> <redistribution-delay>5000</redistribution-delay> </address-setting> </address-settings> ... </core> </configuration>
address-setting
-
将
match
属性设置为您要重新分发消息的队列的名称。您可以使用代理通配符语法来指定一系列队列。更多信息请参阅 第 4.2 节 “将地址设置应用到一组地址”。 redistribution-delay
-
代理在将信息重新分发至集群中其他代理之前,代理在最终消费者关闭后应等待的时间(以毫秒为单位)。如果将其设置为
0,
则会立即重新分发信息。但是,您应该在重新分发前设置延迟 - 这对于消费者而言很常见,但要在同一队列上快速创建另一个对象。
- 对集群中的每个额外代理重复此步骤。
其他资源
-
有关重新分发消息的代理集群配置示例,请参阅
queue-message-redistribution
AMQ Broker 示例程序。