NMS.ActiveMQ 镜像队列
镜像队列
队列提供了一种出色的可靠且高性能的负载均衡机制。每个放在队列中的消息只能被单个消费者成功处理。这是好事!. 但是有时候你希望监控消息在队列的生产者和消费者之间流动的情况。
为此,你可以使用虚拟目的地来设置一个虚拟队列,它将消息转发到多个物理队列。但是,为系统中的每个队列启用此功能可能会很痛苦。
所以,为了简化监控队列的操作,我们添加了一个名为镜像队列的功能。镜像队列有点像你消息代理中所有队列的零配置线路监听器。
示例
例如,假设我们有一些生产者发送到队列Foo.Bar
,而消费者从队列Foo.Bar
消费,我们想要监控或查看活动。
如果你启用镜像队列,那么默认情况下,你可以订阅主题VirtualTopic.Mirror.Foo.Bar
并接收发送到队列Foo.Bar
的所有消息。由于它是一个主题,因此可以根据需要订阅此主题的多个消费者。
如果你愿意,你可以将此功能与虚拟主题结合使用;这样你就可以定义一个逻辑消费者;比如叫做 A。然后,你可以订阅队列Consumer.A.VirtualTopic.Mirror.Foo.Bar
来接收发送到队列Foo.Bar的所有消息,用于消费者 A。然后,你可以运行此消费者的多个实例,这些实例可以在彼此之间进行负载均衡。
这种镜像队列和虚拟目的地的组合对于监控事务流程非常有用;例如,使用业务活动监控 (BAM)。
镜像队列的工作原理
启用后,镜像队列会导致每条发送到队列的消息也发送到一个名称相似的主题;这样,那些有兴趣观看队列中消息交换的人就可以从镜像队列主题中消费。
当与上述示例中描述的此主题上的虚拟主题结合使用时,你实际上可以创建新的队列,这些队列是在运行时动态镜像给定队列的!
启用镜像队列
默认情况下,镜像队列是禁用的;因为启用它会导致为你使用的每个队列创建一个虚拟主题。
要启用镜像队列,请在BrokerService上设置useMirroredQueues属性,或者在
<destinationInterceptors>
<mirroredQueue copyMessage = "true" postfix=".qmirror" prefix=""/>
</destinationInterceptors>
这将在你的代理上的每个队列创建一个名为*.qmirror
的主题。