Проблемы с производительностью ActiveMQ Artemis и Spring JmsTemplate

#spring-boot #jms #spring-jms #activemq-artemis

#spring-загрузка #jms #spring-jms #activemq-artemis

Вопрос:

При выполнении некоторых нагрузочных тестов с брокером ActiveMQ Artemis и моим приложением Spring Boot у меня возникают проблемы с производительностью.

Что я делаю, так это отправляю, например, 12 000 сообщений в секунду брокеру с помощью JMSeter, и приложение получает их и сохраняет в базе данных. Это работает нормально. Но когда я расширяю свое приложение с помощью механизма фильтрации, который пересылает события после сохранения в БД, обратно к брокеру, использующему jmsTemplate.send(destination, messageCreator) его, происходит очень медленно.

Я впервые использовал ActiveMQ 5.x, и там этот механизм работает нормально. Там вы можете настроить ActiveMQConnectionFactory with setAsyncSend(true) для настройки производительности. Для реализации ActiveMQ Artemis ConnectionFactory такой возможности нет. Есть ли другой способ настроить производительность, как в ActiveMQ 5.x?

Я использую Apache ActiveMQ Artemis 2.16.0 (но также пробовал 2.15.0), artemis-jms-client 2.6.4 и Spring Boot 1.5.16.RELEASE.

Ответ №1:

Первое, что следует отметить, это то, что вам нужно быть очень осторожным при использовании JmsTemplate Spring для отправки сообщений, поскольку в нем используется хорошо известный антишаблон, который действительно может снизить производительность. Это фактически создаст новое соединение JMS, сеанс и производителя для каждого отправляемого сообщения. Я рекомендую вам использовать пул соединений, подобный этому, который основан на реализации пула соединений ActiveMQ 5.x, но теперь поддерживает JMS 2. Дополнительные сведения об опасности использования JmsTemplate см. В документации ActiveMQ. Это также обсуждается в статье от Pivotal (то есть «владельцев» Spring).

Второй момент здесь заключается в том, что вы можете настроить, отправляются ли постоянные сообщения JMS синхронно или нет, используя свойство blockOnDurableSend URL, например:

 tcp://localhost:61616?blockOnDurableSend=false
 

Это гарантирует, что постоянные сообщения JMS отправляются асинхронно. Это обсуждается далее в документации ActiveMQ Artemis.

Комментарии:

1. Я также добавил «<journal-sync-non-transactional>false</journal-sync-non-transactional>», так что я думаю, что теперь это работает намного лучше.

2. Имейте в виду, что, хотя требования к синхронизации дисков повышают производительность, увеличивается вероятность потери данных в случае сбоя.