PHP драйвер RabbitMQ (AMQP): обработка заблокированных соединений
Я пытаюсь создать значимый код для обработки ситуации, когда RabbitMQ начинает блокировать соединения из-за уровня диска или предупреждения о водяных знаках памяти.
Есть возможность добавить обработчик для уведомлений о переводе соединения в заблокированный режим.
Однако, похоже, что это уведомление отправляется только тогда, когда я пытаюсь закрыть соединение.
Так работает
$this->channel->basic_publish($msg, $this->exchangeName, $route);
выполняется успешно, обработчик не получает уведомления о заблокированном соединении.
В то же время, сообщение не добавляется в очередь - я могу сказать это с панели инструментов.
Но когда я пытаюсь закрыть соединение явно:
$this->channel->close();
или неявно (просто давая сценарию завершиться, деструктор объекта AMQP делает все остальное), я получаю уведомление о том, что канал заблокирован, и после того, как этот сценарий просто зависает, поскольку, насколько я понимаю, он ожидает завершения некоторых данных методом close_ok.
Таким образом, вопрос заключается в том, как получить информацию о заблокированном канале во время (или сразу после) публикации? И как избежать вечного ожидания скрипта на заблокированном соединении?
Заранее спасибо.
1 ответ
ОК, похоже, у меня есть ответ.
RabbitMQ публикует уведомления для активных подключений.
Поэтому, если я пытаюсь установить соединение с сервером, который испытывает проблемы с памятью или диском, эти уведомления не помогают вообще.
Но если соединение активно, то уведомление о блокировке приходит сразу после того, как я пытаюсь опубликовать сообщение, как и должно быть.
Теперь мне просто нужно выяснить, как обнаружить, что на сервере возникают проблемы на этапе создания нового соединения. Но это другой вопрос.