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 очереди.

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

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