14.5. 配置集群消息分组
消息分组可让客户端发送特定类型的一组消息,以便由同一消费者按顺序处理。通过向集群中的每个代理添加分组处理器,您可以确保客户端可以将分组的消息发送到集群中的任何代理,并且仍以同一消费者正确顺序使用这些消息。
分组和集群技术总结如下:
- 消息分组对消息消耗施加一个顺序。在组中,必须完全消耗和确认每个消息,然后才能继续下一消息。这个方法会导致串行消息处理,其中 concurrency 不是一个选项。
- 集群旨在水平扩展代理,以提高消息吞吐量。通过添加额外的可同时处理消息的消费者来实现水平扩展。
由于这些技术相互冲突,因此请避免将集群和分组一起使用。
有两种分组处理程序:local handlers 和 remote handlers。它们可让代理集群将特定组中的所有消息路由到适当的队列,以便预期的消费者能够以正确顺序使用它们。
先决条件
集群中每个代理应至少有一个使用者。
当消息固定到队列上的消费者时,具有相同组 ID 的所有消息都将路由到该队列。如果删除了使用者,队列将继续接收消息,即使没有消费者。
流程
在集群中的一个代理上配置本地处理程序。
如果您使用高可用性,这应该是 master 代理。
-
打开代理的 <
broker_instance_dir> /etc/broker.xml
配置文件。 在 <
;core>
; 元素中,添加一个本地处理程序:本地处理程序充当远程处理程序的仲裁程序。它存储路由信息并将其通信到其他代理。
<configuration> <core> ... <grouping-handler name="my-grouping-handler"> <type>LOCAL</type> <timeout>10000</timeout> </grouping-handler> ... </core> </configuration>
grouping-handler
-
使用
name
属性为分组处理器指定唯一名称。 type
-
把它设置为
LOCAL
。 timeout
等待(以毫秒为单位)决定路由消息的决定的时间。默认值为 5000 毫秒。如果在做出路由决策前达到超时,则会抛出异常,这样可确保严格的消息排序。
当代理收到一个带有组 ID 的消息时,它会将路由传播到消费者要附加到的队列。如果集群中其他代理上的分组处理程序接受路由,则会建立路由:集群中的所有代理都将使用此组 ID 转发到该队列。如果代理的路由提议被拒绝,它会拒绝一个备用路由,重复该过程,直到路由被接受为止。
-
打开代理的 <
如果您使用高可用性,请将本地处理程序配置复制到主代理的从代理中。
将本地处理器配置复制到从代理可防止本地处理器的单一故障点。
在集群的每个其余代理中,配置远程处理器。
-
打开代理的 <
broker_instance_dir> /etc/broker.xml
配置文件。 在 <
;core>
; 元素中,添加一个远程处理程序:<configuration> <core> ... <grouping-handler name="my-grouping-handler"> <type>REMOTE</type> <timeout>5000</timeout> </grouping-handler> ... </core> </configuration>
grouping-handler
-
使用
name
属性为分组处理器指定唯一名称。 type
-
把它设置为
REMOTE
。 timeout
- 等待(以毫秒为单位)决定路由消息的决定的时间。默认值为 5000 毫秒。将此值设置为本地处理程序值的一半。
-
打开代理的 <
其他资源
-
有关为消息分组配置的代理集群示例,请参阅 cluster
-grouping
AMQ Broker 示例程序。