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

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

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

Ответы [ 3 ]

11 голосов
/ 04 марта 2012

Метод AMQPQueue :: потребление теперь является «правильной» реализацией 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 голосов
/ 19 февраля 2012

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

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

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

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

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

0 голосов
/ 29 февраля 2012

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

...