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


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

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

Author: jeff musk, 2012-02-05

3 answers

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

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

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

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

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

 9
Author: scvalex, 2012-02-19 00:05:06

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

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

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

 10
Author: Pieter, 2012-03-04 05:13:10

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

 0
Author: wormhit, 2012-02-28 21:29:50