Подтвердить что ты не робот

Jms с производительностью spring

i создал простое моделирование потребительских потребителей, основанное на spring, jms и activemq, я пытаюсь достичь высокой производительности с обеих сторон, производителей и потребителей,

Настройки подключения:

<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
     <property name="connectionFactory"  ref="connectionFactory" />
</bean>

<amq:connectionFactory id="amqConnectionFactory" brokerURL="failover:(tcp://${broker.url}:61616)"  />

<bean id="connectionFactory"
    class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="amqConnectionFactory" />
</bean>

<amq:queue id="queue" physicalName="queue" />

<beans:bean id="jsonMessageConverter" class="XXXXX.converter.JsonMessageConverter" />

Настройки пользователя:

<jms:listener-container concurrency="10"
    acknowledge="auto" prefetch="1" message-converter="jsonMessageConverter" transaction-manager="transactionManager"

    >
    <jms:listener id="queueListener_1" destination="ooIntegrationQueue"
        ref="myMessageListenerAdapter" />
</jms:listener-container>


<beans:bean id="myMessageListenerAdapter"
    class="org.springframework.jms.listener.adapter.MessageListenerAdapter" >
    <beans:property name="delegate" ref="consumer"/>
</beans:bean>


<beans:bean id="consumer" class="XXX.ConsumerImpl"/>

Настройки производителя:

<beans:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"
    p:connectionFactory-ref="connectionFactory" p:messageConverter-ref="jsonMessageConverter"
    p:defaultDestination-ref="ooIntegrationQueue" p:sessionTransacted="true" />

начиная с потребителя, мне удалось потреблять около 25 сообщений в секунду, что очень медленно, я обнаружил, что узким местом является тот факт, что я использую транзакции, после того, как вы немного поиграли в Google, и играя с конфигами, я узнал, что после автоустановки DefaultMessageListenerContainer и изменения уровня кэша на

listenerContainer.setCacheLevelName("CACHE_SESSION") 

моя производительность увеличивается примерно до 1500 сообщений в секунду при все еще транзакциях.

моя проблема теперь с производителем, который все еще застревает около 25 операций в секунду, мой тест производителя прост:

int numOfMessages = getNumberOfMessages();


double startTime = System.currentTimeMillis();

for (int i = 1; i <= numOfMessages; i++) {
    jmsTemplate.convertAndSend("HelloWorld" + i);
}

double endTime = System.currentTimeMillis();

double totalTime=(endTime-startTime)/1000;
System.out.println("Time - "+totalTime+" seconds");
System.out.println("EPS - "+numOfMessages/totalTime);

Мне интересно, как достичь аналогичных выступлений с продюсером, так как теперь это является узким местом всей системы.

4b9b3361

Ответ 1

Извините, если этот ответ приходит поздно, чтобы помочь оригинальному плакату. Недавно я исследовал производительность JmsTemplate. Даже при одинаковых режимах доставки и подтверждения собственный JMS код казался намного быстрее, чем JmsTemplate. Проблема заключалась в том, что ActiveMQ обычно по умолчанию выполняет асинхронную отправку, но при использовании JmsTemplate вместо этого используется отправка синхронизации. Это значительно снижает производительность. Вы можете установить для свойства ActiveMQConnectionFactory useAsyncSend значение true для принудительной отправки асинхронных сообщений. Подробнее здесь: JmsTemplate не злой

Ответ 2

JMSTemplate выполняет соединение ConnectionFactiory → Connection → Session → MessageProducer, закрывая каждый объект после каждой отправки. Чтобы обойти это, оберните свой amqConnectionFactory bean с помощью org.apache.activemq.pool.PooledConnectionFactory и используйте его под шаблоном, а не с CachingConnectionFactory.

Ответ 3

Попробуйте изменить метод подтверждения с AUTO на CLIENT_ACKNOWLEDGE. Для получения дополнительной информации смотрите Спецификация.

Ответ 4

Каков режим доставки по умолчанию для ActiveMQ? это постоянная очередь? если да, то как он настроен? насколько удален брокер? Эти ответы будут определять базовую стоимость отправки в очередь, отвечая, сколько времени сервер берет на отправку (т.е. RTT + потенциальная стоимость хранения сообщения на диск синхронно).

Другая возможность заключается в том, что вы на самом деле создаете новое соединение, сеанс и обработчик сообщений при каждой отправке. Это, по меньшей мере, очень дорого. Будет ли подтверждено, будет ли это происходить (например, добавить журнал отладки в spring, проверить админ-консоль amq для отладки соединения) или нет в качестве базовой проверки работоспособности. По его мнению, CachingConnectionFactory должен кэшировать один сеанс и обработчик сообщений по умолчанию, а convertAndSend должен закрыть сеанс, который он получает после отправки, который приводит к возврату кэшированного сеанса в пул. Это должно означать, что он относительно быстрый (spring jms проходит через очень много кода, просто чтобы отправить сообщение), чтобы получить кешированный сеанс на следующей отправке.