sanchez161
@sanchez161

RabbitMQ: Растет количество каналов. Как правильно закрывать каналы?

Доброго времени суток! Столкнулся со следующей проблемой - есть сервер с RabbitMQ, в него периодически публикуются json-пакеты, которые затем забираются другим сервером php-скриптом, отрабатывающим на кроне раз в минуту. Обратил внимание, что через определенный промежуток времени (в зависимости от текущей нагрузки на проект) количество каналов переваливает за несколько десятков тысяч, после чего сервер с RabbitMQ благополучно падает и отказывается принимать входящие соединения.

В своем коде я использую вызовы:

$channel->close();
$connection->close();


Но похоже что толку от закрытия канала никакого. Как побороть данную проблему?

Заранее спасибо!

Ниже привожу часть своего кода, в котором предположительно возникает проблема:

$connection = new AMQPStreamConnection($server, $port, $login, $pass);
$channel = $connection->channel();
$channel->queue_declare('q_output', false, true, false, false);
        
while($msg = $channel->basic_get("q_output", true)) {
        // тут полезная нагрузка
}

$channel->close();
$connection->close();
  • Вопрос задан
  • 570 просмотров
Пригласить эксперта
Ответы на вопрос 2
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Непонятно как запускается код, сколько раз запускается и т.д.

До ваших close код не доходит если задачи постоянно летят свежие и не настроены таймауты на умирание при отсутствии задач.

Но и бесконечно они создаваться не должны сами по себе. Явно запускаете бесконечно скрипт кроном каким-нибудь, вот они и висят.
Ответ написан
kraso4niy
@kraso4niy
fullstack
Возможно там где у вас // тут полезная нагрузка скрипт долго работает и держит открытый channel. Далее запускается еще один такой же и также долго работает... и так много раз, следовательно tcp забивается , cpu растет и все падает.
Можно переписать код , так чтобы после get перед полезной нагрузки канал закрывался. И еще не ясно зачем вам while. Получили одно сообщение и закрыли все все.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы