Blog de Gonzalo

Blog de programación de Gonzalo López

RABBITMQ CON PHP

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 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();
    }
    

Compartir en twitter