spring-amqp работает неправильно, когда соединения заблокированы

Я использую spring-amqp 1.4.4, и после того, как очередь содержит слишком много сообщений и превышает память водяного знака, метод получения RabbitTemplate не отвечает, если он был вызван после метода отправки. Это ждать бесконечно. И в весеннем xml я установил answer-timeout="10" на rabbit:template. Если я не вызываю метод отправки и просто вызываю прием, он работает хорошо. Что случилось?

template.convertAndSend("test message");

String msg = (String) template.receiveAndConvert("log.queue"); // receiveAndConvert not response

person alexsodev    schedule 14.12.2016    source источник


Ответы (1)


Именно по этой причине ребята из rabbitmq рекомендуют использовать отдельные соединения для издателей и потребителей.

Spring amqp CachingConnectionFactory использует одно соединение для всех пользователей.

Мы рассматриваем возможность использования двух соединений, но тем временем вы можете настроить две фабрики соединений (и шаблоны), одну для отправки, а другую для получения.

person Gary Russell    schedule 14.12.2016
comment
Спасибо за ответ. Я создал два шаблона, и теперь у меня другая проблема - отправить ответ на остановку метода после некоторой высокой нагрузки и превышения памяти водяного знака. При отладке кода amqp-клиента проблема была в SocketFrameHandler.writeFrame() во время нового подключения или создания нового канала. Что случилось сейчас? в конфигурации запрошено-сердцебиение=3000 тайм-аут соединения=10 - person alexsodev; 15.12.2016
comment
Код метода SocketFrameHandler.writeFrame() заблокирован при синхронизации и не продолжается: synchronized (_outputStream) { frame.writeTo(_outputStream); } - person alexsodev; 15.12.2016
comment
Либо обновитесь до более новой версии, либо увеличьте размер кеша канала в фабрике соединений, чтобы избежать взбалтывания каналов; в более старых версиях Spring AMQP кэшируется только один канал. Начиная с версии 1.6 (текущая версия 1.6.5) мы кэшируем до 25 каналов по умолчанию; вы должны убедиться, что кеш достаточно большой, чтобы вы не создавали/закрывали каналы с высокой скоростью. Поскольку каналы используются только в течение короткого времени, большой кэш обычно не требуется, но 1 обычно недостаточно при высокой нагрузке. - person Gary Russell; 15.12.2016
comment
После некоторого опыта я думаю, что клиент java amqp не работает нормально при высокой нагрузке. Особенно если у кролика не хватает памяти для работы и он начинает блокировать каналы. В этом случае java-клиент блокирует потоки и ждет бесконечно долго, несмотря на тайм-ауты. - person alexsodev; 09.03.2017
comment
Попробуйте использовать новую версию 4.1.0 com.rabbitmq:amqp-client:4.1.0 - они добавили новый тайм-аут, чтобы избежать этих зависаний. - person Gary Russell; 09.03.2017