Почему я не могу получить повышение производительности при изменении постоянных сообщений activemq на непостоянные? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь повысить скорость отправки сообщений через брокер ActiveMQ.

Проблема в том, что я не получаю большого увеличения производительности.Для отправки 10000 постоянных сообщений из очереди №1 в очередь №2 через мой сервис требуется около 2 минут 40 секунд.И для отправки 10000 непостоянных сообщений требуется около 2 минут 20 секунд.Я ожидаю получить как минимум скорость x10 для непостоянного режима.На самом деле я могу получить для свойства transacted значение 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 Ответ

1 голос
/ 15 мая 2019

Как сказал Джастин, транзакционность и постоянство являются независимыми аспектами в JMS, хотя транзакции с непостоянными сообщениями очень сомнительны - если вам нужны гарантии транзакций, вам нужна постоянность сообщений для части ACID с долговечностью.

Большая часть производительности постоянных сообщений зависит от конфигурации вашего брокера, особенно от серверной части хранилища сообщений.Поэтому, если вы действительно хотите транзакции (что несколько подразумевает, что вы хотите постоянство), вы должны попытаться настроить быстрое хранилище сообщений, например, используя kahadb в быстродействующем хранилище, таком как SSD или SAN с флэш-буферизацией.

Другим вариантом может быть использование модернизированного варианта ActiveMQ, Artemis (https://activemq.apache.org/components/artemis/), который использует более быстрое хранилище только для добавления.

Если вы продолжите без постоянства, это может быть хорошодля вашего случая использования вы могли бы также подумать об отбрасывании транзакций (но не длительных), но заметьте, что постоянство устанавливается для каждого сообщения при записи этого точного сообщения в очередь.

В Camel это можно сделать с помощью опции deliveryPersistent для URI, например

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

Также в вашем примере вам действительно нужно убедиться, что все входящие сообщения были записаны для вводаочередь {{test.in}} уже непостоянный!

временные непостоянные сообщения также должны помещаться в оперативную память вашего брокера, иначе он начнет пейджингв любом случае, они снова записываются на диск. Так что, опять же, конфигурация вашего брокера актуальна (конечно, и сеть).

...