Evolución de las colas en Laravel: workers, deferred y background

Este artículo resume la evolución del sistema de colas en Laravel: desde los workers tradicionales hasta el driver background basado en concurrencia. Explica usos, diferencias y ejemplos prácticos de implementación.

Introducción

Laravel ha transitado de un sistema de colas basado en workers persistentes a opciones que reducen la complejidad operativa: drivers deferred y background (impulsado por concurrencia).

Prerrequisitos

Antes de aplicar cualquiera de las estrategias descritas, confirma lo siguiente:

  • Proyecto Laravel con entorno PHP configurado.
  • Driver de colas definido (Redis, database, etc.) si planeas usar workers tradicionales.
  • En caso de background driver, la configuración de conexiones en config/queue.php debe incluir la conexión ‘background’ (ver ejemplo).

Desarrollo

Procedimiento

A continuación se describen las tres aproximaciones principales y cómo elegir entre ellas según la carga y la tolerancia a fallos.

  1. Workers tradicionales: ejecutan jobs mediante procesos persistentes (p. ej. php artisan queue:work redis), adecuados para cargas pesadas y con control avanzado de reintentos y fallos.
  2. Driver deferred: ejecuta el job después de enviar la respuesta HTTP, sin worker. Adecuado para tareas ligeras y no críticas.
  3. Driver background (concurrencia): ejecuta jobs en procesos PHP separados, sin worker persistente; equilibrio entre robustez y simplicidad operativa.

Ventajas y limitaciones resumidas:

  • Workers tradicionales: alto rendimiento y control; requieren DevOps para gestionar procesos.
  • Deferred: baja sobrecarga; limitado en reintentos y duración de tarea.
  • Background: sin workers dedicados, más robusto que deferred; útil para tareas de duración media.
php artisan queue:work redis
Lenguaje del código: Bash (bash)
<?php
return [
    'connections' => [
        'background' => [
            'driver' => 'background',
        ],
    ],
];
Lenguaje del código: PHP (php)

El ejemplo anterior muestra cómo declarar una conexión ‘background’ en config/queue.php. Su dispatch usa la conexión para ejecutar el job en otro proceso PHP.

Ejemplos

Ejemplo de clase Job que implementa ShouldQueue y se serializa para su ejecución en background o por un worker.

<?php
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\SerializesModels;

class RecordDelivery implements ShouldQueue
{
    use Dispatchable, Queueable, SerializesModels;

    public function __construct(public $order)
    {
    }

    public function handle()
    {
        // lógica de procesamiento
    }
}
Lenguaje del código: PHP (php)

Dispatch desde un controlador usando la conexión background para evitar bloquear la petición HTTP.

<?php
use App\Jobs\RecordDelivery;

class DeliveryController
{
    public function store(Request $request)
    {
        $order = Order::create([...]);
        RecordDelivery::dispatch($order)->onConnection('background');

        return response()->json(['status' => 'processing'], 202);
    }
}
Lenguaje del código: PHP (php)

Checklist

  1. Determina la criticidad de la tarea (alta → worker tradicional).
  2. Si la tarea es ligera y no crítica, considera deferred.
  3. Para equilibrio operativo (sin workers pero más robusto que deferred), usa el driver background.
  4. Configura reintentos, timeouts y monitoreo según el método elegido.

Conclusión

La evolución de las colas en Laravel ofrece alternativas para distintos perfiles de carga operativa. Elegir entre workers, deferred o background depende de la carga, la tolerancia a fallos y la capacidad operativa del equipo.

Si buscas simplificar la operación sin renunciar a capacidad de procesamiento, el driver background —impulsado por concurrencia— es una opción intermedia interesante.

Comments

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *