PHP драйвер RabbitMQ (AMQP): обработка заблокированных соединений

Я пытаюсь создать значимый код для обработки ситуации, когда RabbitMQ начинает блокировать соединения из-за уровня диска или предупреждения о водяных знаках памяти.

Есть возможность добавить обработчик для уведомлений о переводе соединения в заблокированный режим.

Однако, похоже, что это уведомление отправляется только тогда, когда я пытаюсь закрыть соединение.

Так работает

$this->channel->basic_publish($msg, $this->exchangeName, $route);

выполняется успешно, обработчик не получает уведомления о заблокированном соединении.

В то же время, сообщение не добавляется в очередь - я могу сказать это с панели инструментов.

Но когда я пытаюсь закрыть соединение явно:

$this->channel->close();

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

Таким образом, вопрос заключается в том, как получить информацию о заблокированном канале во время (или сразу после) публикации? И как избежать вечного ожидания скрипта на заблокированном соединении?

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

1 ответ

ОК, похоже, у меня есть ответ.

RabbitMQ публикует уведомления для активных подключений.

Поэтому, если я пытаюсь установить соединение с сервером, который испытывает проблемы с памятью или диском, эти уведомления не помогают вообще.

Но если соединение активно, то уведомление о блокировке приходит сразу после того, как я пытаюсь опубликовать сообщение, как и должно быть.

Теперь мне просто нужно выяснить, как обнаружить, что на сервере возникают проблемы на этапе создания нового соединения. Но это другой вопрос.

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