RABBITMQ CON PHP: CÓMO INTEGRARLO Y PROCESAR MENSAJES

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 monitorizar 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 enviar mensajes con un script productor que envía datos (como un JSON) a una cola en RabbitMQ.
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();
    }