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