#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. Имейте в виду, что, хотя требования к синхронизации дисков повышают производительность, увеличивается вероятность потери данных в случае сбоя.