ActiveMQ 主题上的并行消息消费

Dov*_*vmo 2 java multithreading activemq-classic activemq-artemis

ActiveMQ 中的持久主题(这似乎是 JMS 本身的一个障碍)似乎只有一个使用者可以在订阅者上处于活动状态。

也就是说,在 ActiveMQ 文档中:

JMS 持久订阅者 MessageConsumer 是使用唯一的 JMS clientID 和持久订阅者名称创建的。要与 JMS 兼容,在任何时间点只能为一个 JMS clientID 激活一个 JMS 连接,并且对于一个 clientID 和订阅者名称只能激活一个使用者。即,只有一个线程可以从给定的逻辑主题订阅者中主动消费。

但是,其他排队系统(根据文档,Azure 服务总线似乎是这样做的)似乎很容易在单个“订阅”上允许多个线程“订阅者”。在这个时代,人们会认为这是理所当然的。

为什么会这样?这是否会在 JMS 和/或 ActiveMQ 的未来版本中得到解决?

PS,对于这种情况,“虚拟主题”(上面引用的文档)似乎不是一种理想且性能不佳的解决方法,因为它似乎在后台为每个订阅者创建了一个完全独立的队列。

Jus*_*ram 5

为什么会这样?

您引用的文档说明了为什么会这样 - 符合 JMS。需要明确的是,这里的 JMS 合规性是 1.1 版。JMS 2.0 引入了“共享”持久订阅者

这是否会在 JMS 和/或 ActiveMQ 的未来版本中得到解决?

ActiveMQ 5.x 仅实现 JMS 1.1,我知道没有计划添加对 JMS 2.0 的支持。但是,ActiveMQ Artemis(ActiveMQ 旗下的另一个代理,建立在更现代、更高性能的核心之上)确实支持 JMS 2.0(以及其他协议)。

就其价值而言,在具有队列的代理中实现订阅不一定存在性能问题。这就是 ActiveMQ Artemis 所做的,它具有非常好的性能。