改造VirtualTopic消除多次内容复制

JMS持久化订阅的消息消费者由唯一的JMS客户端编号(clientId) 和 持久化订阅者的名字(subscriber name)。因此按照JMS规范,任何一个时间点一个JMS ClientId标识的链接只能有一个是有效的,同一个clientid和subscriber name标识的消费者只能有一个,这也就意味着topic不能具有下面的两个特性:
1、消费消息不能负载均衡
2、一个消费进程不工作,不能快速进行失效恢复


activemq提供了virtualtopic,使其具有topic的发布功能,不需要关系订阅者,订阅者在自己的队列上进行消费,这样消费者可以开启多个线程同时进行消费。

virtualtopic在接收到消息后会把查找所有关联的消费队列,把消息在这些队列中各保存一份。

这样就带来一个问题:
1、消息内容被复制了多份,随着消费队列的增加,发送性能会快速下降,在实际生产中,关联的消费者可能有几十个甚至上百个。

消费者数目发送时间
11.04ms
2014ms

为了解决虚拟主题内容被复制多份的问题,因此需要一种新的队列:VirtualQueue

VirtualQueue:
1、具有普通queue的特性,支持负载均衡
2、消息内容不单独保存,其消息映射到topic 上,一个queue在topic上创建一个 durable subscriber,消费确认通过对应的 durable subscriber进行。


消费流程:
1、queue对应的durable subscriber 加载消息到该queue
2、VirtualQueue把未消费的消费分发给队列上的多个消费者


改造需要解决:
1、消息在投递时,Message.regionDestination是topic,因此在进入VirtualQueue的时候需要变更,这样消息确认时通过regionDestination才能找到该VirtualQueue

2、生产者发送消息后,如果有对应的VirtualQueue在线,需要通知VirtualQueue有新消息,才能实时触发VirtualQueue进行消息投递。

3、VirtualQueue第一次创建的时候需要在topic上创建 durable subscriber (clientId可以默认为相同的值)

猜你喜欢

转载自dingjun1.iteye.com/blog/1962201
今日推荐