RabbitMQ вызывает функцию обратного вызова для потребителя, когда у него есть какое-то сообщение?

Использует ли RabbitMQ функцию обратного вызова для потребителя, если у нее есть какое-то сообщение для нее, или потребитель должен опросить RabbitMQ клиент?

Итак, на стороне потребителя, если есть PHP script, может ли RabbitMQ вызвать его и передать ему сообщение/параметры. например если рейтинг представлен на осколке 1, а таблица aggregateRating находится на осколке 2, тогда потребитель RabbitMQ на осколке 2 запускает script say aggRating.php и передает параметры, которые были вставлены в осколок 1?

Ответ 1

То, что вы хотите, это basic.consume, что позволяет брокеру отправлять сообщения клиентам.

Тем не менее, библиотеки реализованы по-разному. Большинство из них поддерживают basic.consume, но из-за присущих ограничений используемых фреймворков некоторые из них не являются (в первую очередь официальным клиентом RabbitMQ C, на котором основано множество других клиентов).

Если ваша библиотека PHP не поддерживает basic.consume, вам либо нужно использовать опрос (плохой), либо вы можете использовать одного из более полных клиентов для управления script. Например, вы могли бы написать программу Python или Java, которая потребляет от брокера (таким образом, брокер толкает к ним поставки), и они могут вызывать script всякий раз, когда получено новое сообщение. Официальные руководства являются отличным введением в API AMQP и являются хорошим местом для начала.

Это эффективно с большинства точек зрения, но для этого требуется стабильное соединение с брокером.

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

Ответ 2

Метод AMQPQueue:: consume теперь является "правильной" реализацией basic.consume с версии 1.0 библиотеки PHP AMQP (http://www.php.net/manual/en/amqpqueue.consume.php), К сожалению, поскольку PHP является одним поточным языком, вы не можете делать другие вещи, ожидая сообщения в том же пространстве процесса. Если вы вызываете AMQPQueue:: потребляете и передаете ему обратный вызов, ваше приложение будет блокировать и ждать, пока следующее сообщение будет отправлено брокером, и в этот момент он вызовет предоставленную функцию обратного вызова. Если вы хотите использовать неблокирующий метод, вам придется использовать AMQPQueue:: get (http://www.php.net/manual/en/amqpqueue.get.php), который будет опросить сервер для сообщения и вернуться boolean FALSE, если нет сообщения.

Я не согласен с предложением scvatex использовать отдельный язык для использования "push" подхода к этой проблеме. PHP не управляется IO, и поэтому использование отдельного языка для вызова PHP script при поступлении сообщения кажется излишней сложностью: почему бы просто не использовать AMQPQueue:: потреблять и не позволить блоку процесса (ждать сообщения), и либо поместить всю логику в обратный вызов или сделать обратный вызов для запуска отдельного PHP скрипт.

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

Ответ 3

Pecl amqp позволяет использовать функциональность потребления с помощью метода AMQPQueue::потреблять. Вам просто нужно передать функцию обратного вызова в нее, и она будет выполнена при поступлении сообщения.