Проблема производительности ActiveMQ Artemis Producer с адресом / очередями 30 КБ - PullRequest
1 голос
/ 08 октября 2019

У меня есть приложение, которое должно отправлять сообщения на адрес ~ 30k. Раньше я использовал OpenMQ в качестве своего брокера и использовал JMS. Имеющийся у меня клиентский код JMS смог послать брокеру ~ 30 тыс. Сообщений в течение нескольких секунд. Затем я переключился на Артемиду, и производительность отправки резко ухудшилась. Теперь отправка всех сообщений брокеру Artemis занимает до 10 минут.

Я играл с разными настройками конфигурации как на сервере (broker.xml), так и через URL-адрес подключения.

Адреснастройка файла broker.xml

<address-setting match="#">
   <!-- <dead-letter-address>DLQ</dead-letter-address> -->
   <!-- <expiry-address>ExpiryQueue</expiry-address> -->
   <redelivery-delay>0</redelivery-delay>
   <!-- with -1 only the global-max-size is in use for limiting -->
   <max-size-bytes>-1</max-size-bytes>
   <message-counter-history-day-limit>10</message-counter-history-day-limit>
   <address-full-policy>DROP</address-full-policy>
   <auto-create-queues>true</auto-create-queues>
   <auto-create-addresses>true</auto-create-addresses>
   <auto-create-jms-queues>true</auto-create-jms-queues>
   <auto-create-jms-topics>true</auto-create-jms-topics>
</address-setting>

Отправка

private static final String BROKER_URL = "tcp://localhost:61616?minLargeMessageSize=10485760;compressLargeMessages=true;producerWindowSize=-1";

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(BROKER_URL);
factory.setDupsOKBatchSize(50 * 1024 * 1024);
factory.setProducerWindowSize(-1);
factory.setBlockOnDurableSend(false);
factory.setBlockOnNonDurableSend(false);
factory.setCacheDestinations(true);
System.out.println("Connection factory " + factory.toString());

Connection connection = factory.createConnection();
Session producerSession = connection.createSession(false, ActiveMQJMSConstants.PRE_ACKNOWLEDGE);
MessageProducer producer = producerSession.createProducer(null);
producer.setDisableMessageID(true);
producer.setDisableMessageTimestamp(true);

// Create a JMS message of type ByteMessage, and send

producer.send(destination, jmsMessage, DeliveryMode.NON_PERSISTENT, JMS_MESSAGE_PRIORITY, DEFAULT_TTL);

С кодом выше (упрощено для удобства чтения) я получаю только 20-40 сообщений в секунду.

Ячто-то упустил? Или это снижение производительности, вызванное преобразованием JMS в Core из клиентской библиотеки Artemis?

Могу ли я что-то сделать, чтобы улучшить скорость передачи сообщений?

...