我正试图提高通过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>
任何人都可以帮忙,我在做什么错了?
答案 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中,否则它将开始将它们分页到磁盘。因此,再次说明您的代理配置是相关的(当然也是网络)。