JMS消息传递性能:大量主题/队列与广泛过滤(消息选择器)

时间:2009-02-25 21:19:23

标签: java performance jboss jms messaging

我正在开发一个将大量使用JBoss Messaging(JMS)的项目。我的任务是为其他开发人员构建一个易于使用的Messaging包装器,并且正在考虑使用JMS的Message Selectors来提供过滤技术,以便将不必要的消息发送保持在最低限度。我很好奇是否有人在表演方面有任何经验?我担心JMS提供商可能会陷入消息选择器的困境,从而有效地破坏了整个目的。然而,它比为每种消息类型创建一长串主题/队列要好得多。

最终,我无疑会最终使用两者的组合,但我关注的是对性能的影响,无论我更倾向于哪种方式。

5 个答案:

答案 0 :(得分:20)

正如Martin所提到的,默认情况下,大多数JMS实现将在客户端上处理消息选择器,除非它们是持久订阅的一部分,当大多数 JMS实现将处理它们时在服务器上以及当通过选择器的消息数量显着减少时,避免过多的消息被持久化。某些系统(如SonicMQ)允许您指定应在服务器上处理消息选择器,如果您的消息代理可以使用多余的CPU而不是消费者,则这是一个很好的选择。

请记住,虽然基于主题的选择通常更快,但它可能非常麻烦,因为如果你想听5种不同的东西,你必须拥有5种不同的MessageConsumers。天真的驱动程序实现中的每一个都是一个不同的线程,并且可以开始加起来。出于这个原因,从发布中支持两者通常是有用的,这样一些客户端只能监听他们想要的主题,而其他客户端可以使用消息选择器(或代码 - )来监听他们想要的主题层次结构(例如foo。#)。基于选择者)。

但是,您应该始终针对您的应用和您的经纪人进行测试。每个经纪人处理不同的情况,每个应用程序的功能都不同。你不能只说“总是使用技术X”,因为用于客户端的消息处理的每种技术都有不同的权衡。基准,基准,基准。

消息选择器要记住的一点是它们不能动态更改,因此您可能会丢失消息或不得不手动管理复杂的切换方案。想象一下以下用例:

  1. 您正在收听表单的消息选择器(Ticker in('CSCO','MSFT'))
  2. 用户想要开始收听AAPL
  3. 您必须关闭旧的MessageConsumer并使用表单中的选择器启动一个新的MessageConsumer(Ticker in('CSCO,'MSFT','AAPL'))
  4. 在切换期间,您要么丢失消息(因为您在启动新消息之前关闭了旧消息),要么必须手动删除重复消息(因为您在旧消息之前启动了新消息)

答案 1 :(得分:7)

我的两分钱:

我问自己与ActiveMQ完全相同的问题。

  • 首先,我没有使用选择器并创建了很多主题。由于经纪人在没有大量资源的情况下无法处理100个主题,因此表现非常糟糕。
  • 然后我使用了主题/选择器的组合。我现在有少量话题。选择很好。但负载不是很重,不超过10 msg / s

我确实开发了一个抽象层,允许开发人员在不问问题的情况下进行编码,我们通过切换实现来进行测试。

答案 2 :(得分:3)

不同的实现,但我将与BEA的JMS产品的高级架构师进行对话。我提到使用选择器,他评论的内容是“好的,如果你不想让它表演”。

我们的应用程序正在执行10条消息/秒。他可能习惯于以每秒100-1000的速度看到棘手的问题。除非您处于较高范围或硬件非常慢,否则许多队列/主题或选择器都可能正常工作。

关于Don关于JMS易于使用的观点......我们选择了一个包装器来抽象东西。一旦遇到强大的重新连接和正确处理多线程/异步侦听器等问题,编写代码的方法就有很多种。对于我们来说,包装细节是非常值得的,这样客户就可以对大多数细节保持无辜。

答案 3 :(得分:3)

根据我对JBoss MQ实现的经验,客户使用消息选择器来过滤消息。显然,这意味着主题中的每条消息仍会传递给每个收件人,即使他们忽略了它。另一方面,服务器上的不同队列和主题将影响服务器性能。

我会说选择器的扩散会影响客户端和网络负载和主题扩散&队列将影响服务器负载。显然,网络负载,消息使用者负载和消息生产者负载的扩展方式都不同。

除了简单的情况,包装器变得棘手;我建议你将错误处理和JMS API包装成一个简单的消息,通过API概念结构,以满足您的特定需求。然后,在封面下,您可以轻松地更改为上述任何不同的设计。

答案 4 :(得分:2)

嗯,我有疑虑。 JMS非常易于使用。我已经看过这个尝试了,更容易使用的解决方案更难以使用和错误。