繁体   English   中英

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

[英]Why can't I get performance boost while changing persistent activemq messages to non-persistent?

我正在尝试提高通过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>

有人可以帮忙,我在做什么错?

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

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

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

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

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

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

另外,在你的榜样,你真的很需要确保所有传入的消息被写入输入队列{{test.in}} 非持久!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM