
RABBITMQ CON PHP
RabbitMQ es un sistema de mensajería de código abierto que actúa como un intermediario para el intercambio de mensajes entre aplicaciones o componentes. Usa el protocolo AMQP (Advanced Message Queuing Protocol) y permite la comunicación asíncrona entre productores (quienes envían mensajes) y consumidores (quienes los reciben), utilizando colas de mensajes. Es ampliamente utilizado en aplicaciones para manejar tareas como procesamiento en segundo plano, integración de sistemas y escalabilidad.
Características principales
- Colas de mensajes: Los mensajes se almacenan en colas hasta que un consumidor los procesa, permitiendo desacoplar productores y consumidores.
- Persistencia: Los mensajes y colas pueden configurarse para ser persistentes, asegurando que no se pierdan si el servidor se reinicia.
- Enrutamiento avanzado: Soporta patrones como publicación/suscripción, enrutamiento basado en claves, y más.
- Escalabilidad: Permite manejar grandes volúmenes de mensajes y distribuir cargas entre múltiples consumidores.
- Multiplataforma: Funciona en Windows, Linux, macOS y puede integrarse con lenguajes como PHP, Python, Java, etc.
- Interfaz de gestión: Incluye una interfaz web para monitorear y administrar colas, usuarios y conexiones.
Casos de uso
- Procesamiento asíncrono: Por ejemplo, enviar correos electrónicos o procesar pedidos en una tienda en línea sin bloquear la aplicación principal.
- Integración de sistemas: Conectar microservicios o aplicaciones heterogéneas.
- Tareas en segundo plano: Ejecutar procesos largos, como generar reportes o procesar imágenes.
- Balanceo de carga: Distribuir tareas entre múltiples trabajadores.
RabbitMQ se puede usar en php con la librería php-amqplib para recibir mensajes con un script consumidor que lee los mensajes de la cola y los procesa.
Por ejemplo, en un sistema de comercio electrónico, un productor puede enviar un pedido a una cola, y un consumidor lo procesa para actualizar una base de datos o enviar una notificación.
Un mensaje en RabbitMQ es la unidad de datos que se envía entre un productor y un consumidor a través de una cola de mensajes. En esencia, es la información que se transfiere de un componente a otro en un sistema distribuido, utilizando RabbitMQ como intermediario.
Cómo usar un en RabbitMQ con php. Os pongo un ejemplo del productor y del emisor:
- Productor (enviar mensaje):
require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage; //Crea una conexión a RabbitMQ (host, puerto, usuario, contraseña). $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); //Abre un canal lógico dentro de la conexión (requerido por AMQP). $channel = $connection->channel(); //Declara una cola llamada 'test_queue'. Si ya existe, la reutiliza. $channel->queue_declare('test_queue', false, false, false, false); //Crea un mensaje con el contenido que se quiere enviar. $message = new AMQPMessage('¡Hola, RabbitMQ!', ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]); //Publica el mensaje en la cola 'test_queue'. $channel->basic_publish($message, '', 'test_queue'); echo "Mensaje enviado: ¡Hola, RabbitMQ!\n"; $channel->close(); $connection->close();
- Consumidor (recibir mensaje):
require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; //Conecta con RabbitMQ. $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); //Abre un canal de comunicación. $channel = $connection->channel(); // Asegurarse de que la cola 'test_queue' existe $channel->queue_declare('test_queue', false, false, false, false); echo " [*] Esperando mensajes. Presiona CTRL+C para salir\n"; //Define lo que pasa cuando se recibe un mensaje. Aquí solo se imprime. $callback = function ($msg) { echo ' [x] Recibido ', $msg->body, "\n"; }; //Se suscribe a la cola 'test_queue' y llama al callback cuando llega un mensaje. $channel->basic_consume('test_queue', '', false, true, false, false, $callback); //Bucle infinito que espera mensajes y ejecuta el callback. while ($channel->is_consuming()) { $channel->wait(); }