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

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

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

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

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

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

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

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

Метод 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-скрипта при поступлении сообщения кажется излишней сложностью: почему бы просто не использовать AMQPQueue :: потреблять и не позволить блоку процесса (ждать сообщения), и либо поместить все логика в обратном вызове или заставить обратный вызов запускать отдельный скрипт PHP.

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

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