1)主要,Spring JMS的开销是使用JmsTemplate发送消息,而无需下面的缓存机制。从本质上讲,JmsTemplate 将为您发送的每条消息执行以下操作:
- 创建连接
- 创建会话
- 创建生产者
- 创建消息
- 发送消息
- 关闭会话
- 紧密连接
这可以与手动编写的代码进行比较,您可以在其中重用内容:
- 创建连接
- 创建会话
- 创建生产者
- 创建消息
- 发送消息
- 创建消息
- 发送消息
- 创建消息
- 发送消息
- 关闭会话
- 紧密连接
由于创建连接、会话和创建者需要在客户端和 JMS 提供程序之间进行通信,当然还有资源分配,因此它将为大量小消息创建相当大的开销。
您可以通过缓存 JMS 资源轻松解决此问题。例如,使用弹簧CachingConnectionFactory或ActiveMQs PooledConnectionFactory(如果您使用的是ActiveMQ,则您用它标记了这个问题)。
如果在完整的 JavaEE 容器中运行,那么在检索 JNDI 连接工厂时,池化/高速缓存通常是内置的和隐式的。
在使用spring默认消息监听容器时,spring中有一个薄层可能会增加很少的开销,但主要方面是您可以在并发等方面调整性能。
2)
PubSub 是一种使用模式,其中发布者不需要知道存在哪些订阅者。你不能简单地用p2p来模仿它。而且,在手头没有任何证据的情况下,我认为,如果你想将相同的消息从一个应用程序发送到十个其他应用程序,那么发布-订阅设置将比发送十次p2p的消息更快。
另一方面,如果您只有一个生产者和一个消费者,请选择带有队列的P2P模式,因为它在某些方面更容易管理。P2P(队列)允许负载平衡,而 pub/sub 则不允许(那么容易)。
ActiveMQ还有一个混合版本,VirtualDestinations - 它本质上是具有负载平衡的主题。
实际实现因供应商而异,但主题和队列没有根本的不同,并且应该具有相似的性能。相反,您应该检查的是:
- 坚持?(=较慢)
- 消息选择器?(=较慢)
- 并发?
- 持久订阅者?(=较慢)
- 请求/回复,“同步”与临时队列(= 开销 = 较慢)
- 队列预取(=在某些方面影响性能)
- 缓存