Настройка 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, но вышеописанного метода обычно достаточно.

Вы также можете улучшить пропускную способность, используя параметры параллелизма контейнера.

Другие вопросы по тегам