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.
- 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. - Driver deferred: ejecuta el job después de enviar la respuesta HTTP, sin worker. Adecuado para tareas ligeras y no críticas.
- 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
- Determina la criticidad de la tarea (alta → worker tradicional).
- Si la tarea es ligera y no crítica, considera deferred.
- Para equilibrio operativo (sin workers pero más robusto que deferred), usa el driver background.
- 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.
