PHP-AMQPLIB: RPC -> очередь RPC оставляет нераспакованные сообщения позади
У меня есть пара потребителей (брокеров) типа PHP RPC, которые прикреплены к RMQ для получения событий.
Один посредник находится в удаленной системе - однако для целей разработки / тестирования я запускаю "удаленный" посредник локально.
Есть брокеры, работающие с приложением, один из которых (брокер Au) обрабатывает запрос и во время обработки создает новое соединение AMQP с удаленным брокером через отдельный класс, публикует запрос удаленному брокеру (брокеру Vu).
Broker Vu принимает запрос, публикует возвращаемую полезную нагрузку обратно в брокер Au - и вызывает метод basic_ack().
Broker Au распаковывает возвращаемую полезную нагрузку из Broker Vu и возвращает ее полезную нагрузку клиенту PHP, который правильно отображает результаты.
резюме:
testProgram -> создает экземпляр testClass1, который распечатывает имя очереди обратного вызова: (например: amq.gen-6_EhL_eb3HcLiiOb-TUNRA), публикует запрос для брокера Au
брокер Au -> создает экземпляр class2, который выводит имя очереди обратного вызова: (например: amq.gen-J0jhxeMAf1XZSbHZJ8NZ3g), публикует запрос для брокера Vu
брокер Vu -> делает вещи (успешно), возвращает полезную нагрузку брокеру Au, вызывает basic_ack()
брокер Au -> декодирует возвращаемую полезную нагрузку и генерирует собственную возвращаемую полезную нагрузку для testProgram и вызывает basic_ack().
testProgram -> отображает результаты и заканчивается
На этом этапе я вижу в консоли администратора RMQ на вкладке Очереди:
все мои подключенные брокеры (AD = true) и (amq.gen-J0jhxeMAf1XZSbHZJ8NZ3g) показывают Готовность: 0, Неиспользованные: 1, Всего: 1
Для столько запросов, сколько я отправляю, сгенерированные очереди обратного вызова соответственно увеличиваются.
В брокере Vu у меня есть обработчик событий ping - все, что он делает, это говорит "да, я здесь" и возвращает true. Это событие также генерирует осиротевшие сгенерированные очереди обратного вызова сиротами.
У меня есть все мои методы выключения, зарегистрированные в брокерах - если я пытаюсь явно закрыть канал / соединение в клиенте соединения (следуя $channel->wait()), он работает в первый раз и приводит к аварийному завершению работы брокера. второй раз это выполняет.
Если я запускаю тестовую программу, которая напрямую подключается к брокеру Vu и отправляет тот же запрос события, ни одна из сгенерированных amqp очередей не будет потеряна. Это определенно происходит из-за процесса публикации / использования брокером-на-брокере.
Спасибо за настойчивость... любая помощь приветствуется!
--Майк
1 ответ
В клиентском классе, созданном в Broker Vu, я добавил явный вызов close() канала после wait() и до возврата полезной нагрузки.
Это очищает сгенерированные amqp очереди.
добавление явного закрытия соединения приводит к сбою брокера на второй итерации (несмотря на то, что показывают все опубликованные примеры), поэтому я просто опущу это и позволю этой вещи делать свое дело...