ActiveMQ之虚拟主题

虚拟主题主要用于什么地方呢?这里我们就来看一个运行场景,如一个系统中的消息消费者是有一个集群组成的,这里我们ActiveMQ需要发送M1~M8共8条消息,给A、B两个消费者集群进行消费,其示意图如下:
在这里插入图片描述

效果如上,ActiveMQ发出M1~M8共8条消息,AB消费者集群都可以接受到这8条消息,但是其内部就不能进行重复消费了,即集群内部对消息应该进行分摊,那么该需求我们该如何进行处理呢?


首先我们如果使用Queue模式的消息,那么肯定不满足需求,应该使用Queue的话,A、B集群就无法获取全部的消息,只会进行分摊消息,如下:
在这里插入图片描述

那么如果使用Topic模式呢?肯定也不行,使用Topic模式,A、B集群的确可以收到全部的消息,但是其集群内部每个消费者也都会收到相同的8条消息,如下:
在这里插入图片描述


那么我们应该如何解决呢?了解Queue和Topic模式特性的同学肯定都知道了,肯定是把Queue模式和Topic模式组合起来使用啦,在集群外部进行接收消息使用Topic,集群内部进行消费时使用Queue
在这里插入图片描述


上述的确可以使用该需求,不过实现方式繁重,需要独立的中转的消息订阅者来完成,多了一次消息的投递和一次消息消费过程,对效率有影响,增加了消息中间件负载压力。所以ActiveMQ为我们提供了虚拟主题的办法。


对于消息发布者来说,就是一个正常的Topic模式,名称以VirtualTopic.开头,如下:
在这里插入图片描述


对于消息接收端来说,则是个队列,不同集群中使用不同的前缀作为集群的名称,即可表明该消费者在哪个集群中,即可实现消费者集群分组。

例如Consumer.A.VirtualTopic.bxs,说明它是名称为A集群的消费端,我们可以定义多个Consumer.A.VirtualTopic.bxs,则说明A集群中有多个消费者,同理Consumer.B.VirtualTopic.bxs说明是一个名称为B集群的客户端,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


如上,我们启动了两个A集群消费者,一个B集群消费者(其余代码和我们之前介绍的一致),测试结果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


所以从上述的使用来看,发现ActiveMQ虚拟主题的使用非常非常的简单,其消息的发送者和消费者都是固定的,即

  • 默认虚拟主题消息生成者的前缀是:VirtualTopic.xxx
  • 默认虚拟主题消息消费者默认格式:Consumer.*.VirtualTopic.xxx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章