У меня есть приложение, которое должно отправлять сообщения на адрес ~ 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?
Могу ли я что-то сделать, чтобы улучшить скорость передачи сообщений?