Colas de tareas para PHP: RabbitMQ, Beanstalkd y Gearman
En las aplicaciones web modernas, a menudo surge la necesidad de ejecutar operaciones largas o que consumen muchos recursos de forma asíncrona, sin obligar al usuario a esperar una respuesta. Ejemplos típicos: envío de correos electrónicos masivos, generación de informes, procesamiento de imágenes, interacción con APIs externas. Para resolver estas tareas en PHP se utilizan colas de tareas (job queues). Permiten separar la lógica de la solicitud del procesamiento en segundo plano, mejorando la capacidad de respuesta de la interfaz y la escalabilidad del sistema.
En este artículo, analizaremos en detalle tres herramientas populares para organizar colas en PHP: RabbitMQ, Beanstalkd y Gearman. Conocerás sus características, arquitectura, ejemplos de uso y aprenderás a elegir la solución adecuada para tu proyecto.
1. RabbitMQ
RabbitMQ es un potente broker de mensajes que implementa el protocolo AMQP (Advanced Message Queuing Protocol). Soporta escenarios complejos de enrutamiento, intercambiadores (exchanges), colas con prioridades, confirmaciones de entrega y mucho más. RabbitMQ es ideal para arquitecturas de microservicios y sistemas donde se requiere una entrega confiable de mensajes.
Instalación y conexión
Para trabajar con RabbitMQ en PHP se utiliza la librería php-amqplib. Instalación a través de Composer:
composer require php-amqplib/php-amqplibEjemplo: envío de notificación por correo electrónico
Crearemos un productor (remitente) y un consumidor (procesador) para el envío de correos en segundo plano.
Archivo producer.php:
<?phprequire_once 'vendor/autoload.php';
use PhpAmqpLib\\Connection\\AMQPStreamConnection;use PhpAmqpLib\\Message\\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);
$data = json_encode([ 'email' => 'user@example.com', 'subject' => '¡Bienvenido!', 'body' => 'Gracias por registrarte.']);
$msg = new AMQPMessage($data, [ 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');
echo " [x] Mensaje enviado";
$channel->close();$connection->close();Archivo consumer.php:
<?phprequire_once 'vendor/autoload.php';
use PhpAmqpLib\\Connection\\AMQPStreamConnection;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);
echo " [*] Esperando mensajes. Para salir presione CTRL+C";
$callback = function ($msg) { $data = json_decode($msg->body, true); // Simulación de envío de email sleep(2); echo " [x] Correo enviado a {$data['email']}"; $msg->ack();};
$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);
while ($channel->is_consuming()) { $channel->wait();}
$channel->close();$connection->close();2. Beanstalkd
Beanstalkd es un gestor de colas ligero, rápido y fácil de usar. Funciona con un protocolo similar a memcached y es ideal para tareas que no requieren enrutamiento complejo. Beanstalkd admite prioridades, retrasos (delay) y time-to-run (TTR).
Instalación
Para PHP existe el cliente pda/pheanstalk:
composer require pda/pheanstalkEjemplo: procesamiento de imágenes
Supongamos que necesitamos crear miniaturas para las imágenes subidas.
Archivo producer.php:
<?phprequire_once 'v También en la biblioteca
Migraciones de bases de datos en Java: descripción general de herramientas populares
Aprendizaje automático en JavaScript (Node.js): bibliotecas para ML
InversifyJS: Contenedor IoC para aplicaciones TypeScript
Colas de tareas para Rust: Resumen de bibliotecas y herramientas populares