我有一个应用程序,它使用 AMQ 代理上的队列中的消息。我可能需要此应用程序的多个实例(出于性能原因),在这种情况下,每个实例都应该使用来自队列的消息的子集。应根据传入消息上“HeaderA” header 的值来选择此子集。
即
- 实例 1 使用 HeaderA == x 的消息
- 实例 2 使用 HeaderA == Y 的消息
- 等等
(注意:我知道这个设计不是很好,如果所有实例都等效并且可以使用任何消息,那就更好了,但由于外部原因我受限于这个设计)
我正在考虑两种方法;
使用 Apache Camel 在 Broker 上路由消息,以便 为每个唯一值创建一个单独的队列(动态创建) '标题A'。然后每个实例动态订阅它的队列 感兴趣。
每个实例在同一队列上创建一个消费者,但使用 JMS 选择器只使用它感兴趣的那些消息。
哪种方法被认为是“最佳”?为什么?为唯一 header 值创建潜在的数千个单独队列是否危险?使用 JMS 选择器有什么注意事项吗?
最佳答案
我会选择选择器。
尽管理论上您可以动态动态创建队列,但大多数(全部?)JMS 提供程序(例如 ActiveMQ)并未针对可扩展数千个队列进行优化。我应该指出,它可能会起作用。只需检查您的设置是否会增加线程使用或文件描述符使用(或类似资源)。
使用 JMS 选择器并没有什么大的痛苦。一个潜在的问题可能是选择器中的 type-o 可能会消耗太多消息或根本没有消息而不指示错误。一如既往,需要进行广泛的系统测试。
另一件事 - ActiveMQ 管理控制台和 Hawt.io 等管理工具并不是为支持大量队列而构建的。如果您打算使用它们,请考虑不要使用超出所需数量的队列。
关于filter - JMS 选择器与单独队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33389250/