Настройка Spring Integration QueueChannel для RabbitMQ
В настоящее время я использую Spring AMQP API для подключения к RabbitMQ. По сути, в моем коде пользователя я читаю сообщения асинхронно и делаю групповую вставку в упругом поиске. когда я делаю ack = AUTO, я получаю умеренную скорость 400-500 мсг / сек (чтение из очереди). когда я делаю ack = NONE, увеличение скорости чтения огромно, т. е. достигает 5000-6000 мсг / с.
Конфигурация выглядит следующим образом:
- Linux-машина с 32 ГБ ОЗУ
- Аргументы JVM:
-server
-Xms1g -Xmx1g -Xss384k PermSize=256m MaxPermSize=256m
Теперь проблема в том, что когда я делаю ack = NONE, хотя я получаю хорошую скорость, JVM через некоторое время получает OutOfMemory, и я вижу, что в этом сценарии происходит много GC.
Я планирую использовать QueueChannel из Spring, где я могу ограничить размер канала и количество сообщений, которое он может содержать.
Как я могу реализовать это с RabbitMQ, и есть ли другой способ достичь хорошей скорости чтения, такой как 4000-5000 мсг / с, без сбоя JVM?
1 ответ
Попробуйте использовать ack=AUTO
, но установите prefetch
а также txSize
скажем 1000; таким образом, ack будет отправляться только каждые 1000 сообщений (вы можете настроить это значение по мере необходимости).
Использование ackmode=NONE приводит к тому, что сообщения накапливаются в неограниченной очереди блокировки в контейнере слушателя, и будут работать только в том случае, если слушатель сможет не отставать (OOM означает, что ваше не может).
У нас есть открытая проблема JIRA, чтобы решить эту проблему для ack=NONE, но вышеописанного метода обычно достаточно.
Вы также можете улучшить пропускную способность, используя параметры параллелизма контейнера.