高性能JMS消息传递

IAm*_*aja 13 java messaging spring activemq-classic jms

我阅读了今年UberConf的幻灯片,其中一位发言人提出Spring JMS为您的消息队列系统增加了性能开销的论点,但我没有看到任何证据支持幻灯片.发言者还说明点对点比传统的"发布 - 订阅"方法更快,因为每个消息只发送一次而不是广播给每个消费者.

我想知道是否有经验丰富的Java消息传递专家可以在这里权衡并澄清一些技术细节:

  • 使用Spring JMS而不仅仅是纯JMS实际上是否会产生性能开销?如果是这样,它是如何以及在何处引入的?它有什么办法吗?
  • 有什么实际证据支持P2P比pub-sub模型更快,如果是这样的话,是否有任何情况下你想要通过P2P发布sub-sub(即为什么变慢?!?)?

Pet*_*der 24

1)主要的,Spring JMS的开销是使用JmsTemplate来发送没有缓存机制的消息.从本质上讲,JmsTemplate将为您发送的每条消息执行以下操作:

  • 创建连接
  • 创建会话
  • 创建制片人
  • 创建消息
  • 发信息
  • 关闭会话
  • 关闭连接

这可以与您重复使用的手动编写的代码进行比较:

  • 创建连接
  • 创建会话
  • 创建制片人
  • 创建消息
  • 发信息
  • 创建消息
  • 发信息
  • 创建消息
  • 发信息
  • 关闭会话
  • 关闭连接

由于连接,会话和生成器的创建需要客户端和JMS提供者之间的通信,当然还有资源分配,它将为许多小消息创建相当大的开销.

您可以通过缓存JMS资源轻松解决此问题.例如,使用spring CachingConnectionFactory或ActiveMQs PooledConnectionFactory(如果您使用的是ActiveMQ,则标记此问题).

如果您在一个完整的JavaEE容器中运行,那么当您检索JNDI连接工厂时,池内/缓存通常是内置的并且是隐式的.

当使用spring Default Message Listening Container接收时,Spring中有一个薄层可能会增加很少的开销,但主要方面是您可以根据并发性等调整性能.本文非常好地解释了它.

2)

PubSub是一种使用模式,发布者不需要知道存在哪些订阅者.你不能简单地用p2p模仿它.而且,如果你想要从一个应用程序向另外十个应用程序发送相同的消息,我认为如果你想要从一个应用程序向另外十个应用程序发送相同的消息,那么发布消息比发送消息十次p2p要快.

另一方面,如果您只有一个生产者和一个消费者,请选择带有队列的P2P模式,因为它在某些方面更容易管理.P2P(队列)允许负载平衡,其中pub/sub不那么容易.

ActiveMQ还有一个混合版本VirtualDestinations - 它本质上是负载平衡的主题.

不同供应商的实际实现有所不同,但主题和队列并没有根本不同,并且应该具有相似的性能.你应该检查的是:

  • 持久性?(=慢)
  • 消息选择器?(=慢)
  • 并发?
  • 耐用用户?(=慢)
  • 请求/回复,"与"临时队列"同步"(=开销=较慢)
  • 队列预取(=在某些方面影响性能)
  • 高速缓存

  • 很好的答案,只是主题与队列的一个小的补充(你有点提到它,但是很好地使它明确).主题保证对主题的每个在线或离线持久订阅都会收到消息.队列保证只有一个订阅者处理消息.除此之外,主题可以用于1-1通信,并且队列可以具有多个发布者和负载平衡订阅者.虽然使用普通主题进行负载平衡,但使用队列进行事件分发效率很低.马匹课程. (2认同)