在使用 ActiveMQ Artemis 代理和我的 Spring Boot 应用程序进行一些负载测试时,我遇到了性能问题。
我正在做的是发送例如使用 JMSeter 每秒向代理发送 12,000 条消息,应用程序接收它们并将它们保存到数据库中。效果很好。但是,当我通过过滤机制扩展我的应用程序时,该机制在保存到数据库后将事件转发回代理,使用
jmsTemplate.send(destination, messageCreator)
,速度非常慢。
我首先使用 ActiveMQ 5.x,这个机制工作得很好。在那里,您可以使用
ActiveMQConnectionFactory
配置 setAsyncSend(true)
来调整性能。对于 ActiveMQ Artemis ConnectionFactory
实现,不存在这种可能性。有没有像 ActiveMQ 5.x 那样调整性能的另一种方法?
我正在使用 Apache ActiveMQ Artemis 2.16.0(但也尝试过 2.15.0)、artemis-jms-client 2.6.4 和 Spring Boot 1.5.16.RELEASE。
首先要注意的是,在使用 Spring 的 JmsTemplate 发送消息时需要非常小心,因为它采用了众所周知的反模式,这确实会降低性能。它实际上会为它发送的每条消息创建一个新的 JMS 连接、会话和生产者。我建议您使用像这样的连接池,它基于 ActiveMQ Classic 连接池实现,但现在支持 JMS 2。有关使用 JmsTemplate 危险的更多详细信息,请参阅ActiveMQ 文档。 Pivotal(即 Spring 的“所有者”)的一篇文章也讨论了这一点。 这里的第二点是,您
可以使用 blockOnDurableSend
URL 属性来调整是否同步发送持久 JMS 消息,例如:
tcp://localhost:61616?blockOnDurableSend=false
这将确保异步发送持久 JMS 消息。ActiveMQ Artemis 文档