Hoy vamos a ver algo bastante interesante (creo yo). Es sencillo de configurar e implementar pero potencia tu aplicación web muchísimo!
Vamos a ver cómo usar Batch API + QueueUI + AdvanceQueue en Drupal para montar un sistema de procesamiento de procesos con colas.
Contexto
Te pongo un ejemplo concreto de donde sería útil tener este sistema:
- Tienes una aplicación web con varios endpoint Rests que procesas contenidos (operaciones CRUD)
- Estos endpoints tienen bastante peticiones recurrentes
- En picos de tráfico llegarás a cuellos de botella porque tienes límites de memoria y CPU
Porqué necesito colas?
Con el sistema que tienes ahora, puedes sufrir algunas paradas por sobrecarga en el sistema.
Si tienes un sistema de colas, las peticiones Rest, son mucho más livianas (validas, encolas y devuelves respuesta). Con esto consigues que tu sistema sea capaz de procesar muchísimas más peticiones porque lo que hacen es encolar las peticiones que se irán procesando poco a poco.
Cómo lo montamos?
Pues muy sencillo como siempre con Drupal. Básicamente es instalar módulos, crear tus colas y comenzar a encolar procesos.
Eso si, aquí puedes complicarte lo que quieras y más jeje. Lo principal
- Batch API ya está instalado por defecto en el core de Drupal. Esto quiere decir que si hacer nada, ya puedes empezar a crear colas custom y procesarlas. Porqué no se suele hacer? porque te falta esa parte visual que siempre ayuda!
- Instala el módulo Queue UI para poder gestionar y visualizar tus colas desde interfaz
- Instala el módulo Advanced Queue para darte aún más potencial. Este módulo de proporciona un registro en DB propio, diferentes tipos de Trabajo, gestión por comandos drush o systemd, etc....
Con esto ya tienes tu sitio preparado para empezar a gestionar las colas
Crea tu primera cola y empieza a encolar
Tienes 2 opciones: hacerlo por la interfaz que tiene Drupal gracias al módulo Advanced Queue o directamente desde fichero. Te dejo por aquí la definición de una cola por código (que mola más!):
Vamos a crear la cola process_content_queue, para ello necesitas crear un fichero .yml en tu config de tu módulo o directamente importa la configuración a tu sitio Drupal
# Fichero advancedqueue.advancedqueue_queue.process_content_queue
langcode: es
status: true #true|false
id: process_content_queue
label: 'Procesar contenido por colas'
backend: database
backend_configuration:
lease_time: 300
processor: cron #cron|systemd
processing_time: 90
locked: false
Con esto directamente ya podemos empezar a encolar nuestros mensajes directamente. Como ¿? pues así de sencillo:
$contenidoMensaje = [
'mensaje'=> 'OK'
];
$queueJob = \Drupal\advancedqueue\Job::create('process_content_queue', $contenidoMensaje);
$queue->enqueueJob($queueJob);
Define la lógica de la cola (qué va a hacer¿?)
Ya que tenemos la cola definida y ya empezamos a meter mensajes, necesitamos definir qué es lo que va a hacer nuestra cola custom. En este ejemplo simplemente voy a hacer que cada mensaje en la cola, pinte OK.
Para ello, necesitamos un fichero en nuestro módulo custom que implemente la clase Drupal\advancedqueue\Plugin\AdvancedQueue\JobType\JobTypeBase
<?php
# Fichero ProcessContentQueue.php
namespace Drupal\mi_modulo_custom\Plugin\AdvancedQueue\JobType;
use Drupal\advancedqueue\Job;
use Drupal\advancedqueue\JobResult;
use Drupal\advancedqueue\Plugin\AdvancedQueue\JobType\JobTypeBase;
/**
* @AdvancedQueueJobType(
* id = "process_content_queue_job",
* label = @Translation("Imprime el campo mensaje"),
* max_retries = 3,
* retry_delay = 30,
* )
*/
class ProcessContentQueue extends JobTypeBase
{
public function process(Job $job): JobResult
{
$payload = $job->getPayload();
$mensaje = $payload['mensaje'] ?? null;
# No hay campo mensaje ¿? marcamos el mensaje actual como error
if (!$mensaje) {
return JobResult::failure('Error al procesar el mensaje');
}
# Simplemente marcamos en el registro de la cola OK y pintamos el mensaje
return JobResult::success($message);
}
}
Ejecución de las colas
Esto es muy muy sencillo! Básicamente con drush podemos ejecutar y procesar las colas.
La opción manual:
# Dentro del proyecto drupal
vendor/bin/drush advancedqueue:queue:process process_content_queue
Lo quieres automatizar ¿? Sencillo! Un cron y listo!:
# Que se ejecute cada minuto por ejemplo
0 * * * * {ruta_proyecto_drupal}/vendor/bin/drush advancedqueue:queue:process process_content_queue
Y hasta aquí! ya veis que es sencillo implementar colas y mensajes en Drupal y la verdad es que te proporciona mucho potencial!





