【问题标题】:Performance issues with ActiveMQ Artemis and Spring JmsTemplateActiveMQ Artemis 和 Spring JmsTemplate 的性能问题
【发布时间】:2020-12-08 16:28:38
【问题描述】:

在使用 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-boot jms spring-jms activemq-artemis


    【解决方案1】:

    首先要注意的是,在使用 Spring 的 JmsTemplate 发送消息时需要非常小心,因为它采用了一种众所周知的反模式,确实会影响性能。它实际上会为它发送的 每条 消息创建一个新的 JMS 连接、会话和生产者。我向您推荐use a connection pool like this one,它基于 ActiveMQ 5.x 连接池实现,但现在支持 JMS 2。有关使用 JmsTemplate 危险的更多详细信息,请参阅ActiveMQ documentation。这也在an article from Pivotal(即 Spring 的“所有者”)中进行了讨论。

    这里的第二点是您可以调整是否使用blockOnDurableSend URL 属性同步发送持久 JMS 消息,例如:

    tcp://localhost:61616?blockOnDurableSend=false
    

    这将确保以异步方式发送持久的 JMS 消息。这将在ActiveMQ Artemis documentation 中进一步讨论。

    【讨论】:

    • 我还添加了“false”,所以我结合它现在效果更好。
    • 请记住,虽然放宽磁盘同步要求会提高性能,但也会增加在崩溃时丢失数据的可能性。
    猜你喜欢
    • 2020-05-14
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2020-12-29
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多