2012-02-05 4 views
13

¿RabbitMQ llama a la función de devolución de llamada para un consumidor cuando tiene algún mensaje para ello o el consumidor tiene que sondear al cliente RabbitMQ?¿RabbitMQ llama a la función de devolución de llamada para un consumidor cuando tiene algún mensaje para ello?

En el lado del consumidor, si hay un script PHP, puede RabbitMQ llamarlo y pasarle el mensaje/los parámetros. p.ej. si la calificación se envía en el fragmento 1 y la tabla de clasificación agregada está en el fragmento 2, ¿el consumidor de RabbitMQ en el fragmento 2 activará el script diciendo aggRating.php y pasará los parámetros que se insertaron en el fragmento 1?

+1

Las bibliotecas se implementan de manera diferente. La mayoría de ellos tiene soporte para el consumo básico.Si tu biblioteca php no lo hace, deberás escribir la tuya. Por ejemplo, puede conducir su script php mediante un script python o un programa java que consuma mensajes del broker. – scvalex

+0

Los clientes de Python/Java no tendrían que sondear en absoluto, pero necesitarían una conexión estable con el intermediario. El agente enviaría mensajes a los clientes P/J. Los clientes podrían llamar a sus scripts para cada mensaje. Consulte los tutoriales de RabbitMQ para obtener más información: http://www.rabbitmq.com/getstarted.html – scvalex

+1

No tengo ninguna experiencia con PHP y no sé nada sobre los clientes de PHP AMQP. Todo lo que he dicho sobre la biblioteca PHP es solo una suposición educada. Realmente no he respondido tu pregunta aquí. Por cierto, en el futuro, es posible que desee publicar preguntas como esta en la lista de correo RabbitMQ Discuss. Creo que soy el único desarrollador de RabbitMQ que verifica SO; pero nos aseguramos de responder cualquier pregunta publicada en la lista de correo. – scvalex

Respuesta

9

Lo que quiere es basic.consume, que le permite al intermediario enviar mensajes a los clientes.

Dicho esto, las bibliotecas se implementan de manera diferente. La mayoría de ellos tiene soporte para basic.consume, pero debido a las limitaciones inherentes de los marcos utilizados, algunos no (especialmente el cliente RabbitMQ C oficial en el que se basan muchos otros clientes).

Si su biblioteca PHP no es compatible con basic.consume, tiene que usar sondeo (mal), o puede utilizar uno de los clientes más completos para conducir el script. Por ejemplo, podría escribir un programa de Python o Java que consuma desde el intermediario (por lo tanto, el intermediario les envía entregas) y podrían llamar al script siempre que se reciba un nuevo mensaje. El official tutorials es una gran introducción a las API de AMQP y es un buen lugar para comenzar.

Esto es eficiente desde la mayoría de los puntos de vista, pero requiere una conexión estable con el intermediario.

Si tiene dudas sobre las capacidades de los diversos clientes, o si necesita más orientación, la lista de correo RabbitMQ Discuss es un gran lugar para hacer preguntas. Los desarrolladores hacen un punto de respuesta a cualquier consulta publicada allí.

0

Pecl amqp permite utilizar la funcionalidad de consumo con el método AMQPQueue::consume. Solo necesita pasar la función de devolución de llamada y se ejecutará cuando llegue el mensaje.

10

El método AMQPQueue :: consume es ahora una implementación "adecuada" de basic.consume a partir de la versión 1.0 de la biblioteca PHP AMQP (http://www.php.net/manual/en/amqpqueue.consume.php) Desafortunadamente, dado que PHP es un lenguaje con un único hilo, no puedes hacer otras cosas mientras esperas un mensaje en el mismo espacio de proceso. Si llama a AMQPQueue :: consume y le pasa una devolución de llamada, toda su aplicación se bloqueará y esperará a que el intermediario le envíe el siguiente mensaje, momento en que llamará a la función de devolución de llamada proporcionada. Si desea un método que no sea de bloqueo, deberá utilizar AMQPQueue :: get (http://www.php.net/manual/en/amqpqueue.get.php), que sondeará el servidor para obtener un mensaje y devolverá un booleano FALSO si no hay un mensaje.

No estoy de acuerdo con la sugerencia de scvatex de usar un lenguaje separado para usar un enfoque "push" para este problema. PHP no funciona con IO y, por lo tanto, utilizar un lenguaje separado para llamar a un script PHP cuando llega un mensaje parece una complejidad innecesaria: ¿por qué no simplemente usar AMQPQueue :: consume y dejar que el proceso se bloquee (esperar un mensaje) y poner todo la lógica en la devolución de llamada o hacer que la devolución de llamada ejecute un script PHP separado.

Hemos hecho esto último en mi trabajo como un sistema de procesamiento de trabajos a gran escala para que podamos segregar errores y mantener el procesador de trabajos principal ejecutándose sin importar lo que ocurra en los niños. Si desea una descripción detallada de cómo configuramos esto y algunos ejemplos de código, estaría más que feliz de publicarlos.

+0

¿Puedes publicar tus ejemplos sobre el sistema de procesamiento a gran escala (quizás Github?) – JavaSa

Cuestiones relacionadas