JMS 选择器与个人 Queues

JMS Selector vs. Individual Queues

我有一个应用程序在我的 AMQ 代理上使用来自 queue 的消息。我可能需要此应用程序的多个实例(出于性能原因),在这种情况下,每个实例都应使用来自 queue 的消息的子集。应根据传入消息的 'HeaderA' header 的值来选择此子集。

(注意:我知道这种设计不是很好,如果所有实例都等效并且可以使用任何消息会更好,但由于外部原因我受限于这种设计)

我正在考虑两种方法;

  1. 使用 Apache Camel 在 Broker 上路由消息,以便 每个唯一值的单独 queue(动态创建) 'HeaderA'。然后每个实例动态订阅 queue 它 有兴趣。

  2. 每个实例在同一个 queue 上创建一个消费者,但使用 JMS 选择器只使用它感兴趣的消息。

哪种方法会被考虑 'best',为什么?为唯一的 header 值创建潜在的数千个单独的 queue 是否危险?使用 JMS 选择器有什么注意事项吗?

我会选择选择器。

即使从理论上讲,您可以动态创建队列,但大多数(全部?)JMS 提供程序(例如 ActiveMQ)并未针对数千个队列的扩展进行优化。我应该指出,它可能会起作用。只需检查您的设置不会增加线程使用量或文件描述符使用量(或类似资源)。

使用 JMS 选择器没有什么大麻烦。一个潜在的问题可能是选择器中的 type-o 可能会消耗太多消息或根本没有消息而不指示错误。一如既往,需要进行广泛的系统测试。

另一件事 - ActiveMQ 管理控制台和 Hawt.io 等管理工具并不是为支持大量队列而构建的。如果您打算使用它们,请考虑不要使用超过需要的队列。