项目中有在使用,所以总结一下。
JMS 有 Topic 这个概念,这是所有了解 JMS 都知道的一个概念。但是可持久化的 Topic 在 JMS 规范中有个限制,那就是对于同一个 Client ID 的 Subscriber,同一时刻只能有一个是有效的。这就造成如果直接使用 Topic,负载均衡等特性就无法实现。但是 Queue 没有这个限制。
解决这个问题有两种方法,一种是用不同的 Client ID(动态生成),另一个就是使用 ActiveMQ 的 VirtualTopic。
默认配置下,一个 Destination 配置成 VirtualTopic.xxx 的名字时,订阅类似 Consumer.A.VirtualTopic.xxx、Consumer.B.VirtualTopic.xxx、Consumer.C.VirtualTopic.xxx 等 Queue 的消费者都会受到这个 VirtualTopic 的消息(每个 Queue 里还是只有一个 Consumer 能收到消息。类似与 Kafka 的 Consumer Group)。这样就解决了持久化的 Topic Client ID 唯一有效的限制。
我觉得这个概念大概了解就可以了。现在 ActiveMQ 正在越来越多地被 RabbitMQ 和 Apache Kafka 取代。