将持久性activemq消息更改为非持久性时,为什么不能提高性能?

时间:2019-05-14 04:15:46

标签: java transactions apache-camel activemq persistence

我正试图提高通过ActiveMQ代理发送消息的速度。

问题是,我的演奏能力没有得到很大提高。 通过我的服务,从№1队列到№2队列发送10000条持久消息大约需要2分40秒。 发送10000条非持久性消息大约需要2分20秒。 我期望在非持久模式下获得至少x10的速度性能。 实际上,我可以将交易属性设置为“ false”来获得它:

<property name="transacted" value="false"/>

但这不是一个选择,我需要事务性模式来处理持久性消息。

我已经这样配置ActiveMQ:

<bean class="org.apache.activemq.ActiveMQConnectionFactory" id="jmsConnectionFactory">
        <property name="brokerURL" value="${AMQ.URL}"/>
        <property name="userName" value="${AMQ.USER}"/>
        <property name="password" value="${AMQ.PASSWORD}"/>
    </bean>
    <bean class="org.apache.activemq.pool.PooledConnectionFactory"
        destroy-method="stop" id="jmsConnectionPool" init-method="start">
        <property name="maxConnections" value="10"/>
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
    </bean>
    <bean class="org.apache.camel.component.jms.JmsConfiguration" id="jmsConfig">
        <property name="connectionFactory" ref="jmsConnectionPool"/>
        <property name="concurrentConsumers" value="10"/>
        <property name="preserveMessageQos" value="true"/>
        <property name="transacted" value="true"/>
        <property name="cacheLevelName" value="CACHE_CONSUMER"/>
    </bean>
    <bean class="org.apache.activemq.camel.component.ActiveMQComponent" id="activemq">
        <property name="configuration" ref="jmsConfig"/>
    </bean>

骆驼测试路线:

<route id="SRV.TEST">
       <description>Test route</description>
       <from uri="{{mqName}}:queue:{{test.in}}"/>
       <to uri="{{mqName}}:queue:{{test.out}}"/>
</route>

任何人都可以帮忙,我在做什么错了?

1 个答案:

答案 0 :(得分:1)

正如Justin所说,事务性和持久性是JMS中的独立方面,尽管非持久消息上的事务非常可疑-如果要保证事务的安全性,就需要ACID持久性部分中的消息持久性。

持久性消息的大部分性能取决于您的代理配置,尤其是消息存储后端。因此,如果您确实想要交易(这在某种程度上意味着您想要持久性),则应尝试配置快速消息存储库,例如在快写存储(例如闪存缓冲SSD或SAN)上使用kahadb。

另一个选择可能是使用ActiveMQ的现代化变体Artemis(https://activemq.apache.org/components/artemis/),它具有更快的仅附加存储。

如果您在没有持久性的情况下继续进行操作(这可能适合您的用例),您也可以考虑删除事务(无论如何都不持久),但请注意,编写时,持久性是基于每个消息设置的将确切的消息发送到队列。

在骆驼中,这可以使用URI上的 deliveryPersistent 选项来完成,例如

<to uri="{{mqName}}:queue:{{test.out}}?deliveryPersistent=false"/>

在您的示例中,您实际上还需要确保所有传入消息都已被持久写入到输入队列 {{test.in}} 已经

临时非持久消息还需要放入代理的RAM中,否则它将开始将它们分页到磁盘。因此,再次说明您的代理配置是相关的(当然也是网络)。