LARAVEL HORIZON: MONITORIZACIÓN DE COLAS Y TRABAJOS

Laravel Horizon es un paquete oficial de Laravel que sirve para gestionar y monitorizar colas (queues) usando Redis como driver.

Características principales

  • Un dashboard en la ruta "/horizon" donde se puede ver en tiempo real:
    • Jobs procesados por minuto.
    • Tiempos de ejecución.
    • Fallos (failed jobs).
    • Throughput.
    • Balanceo automático de workers.
    • Gráficos y métricas detalladas.
  • Configuración en código (en config/horizon.php) en lugar de supervisores manuales o comandos largos de "queue:work".
  • Se pueden definir múltiples entornos, colas con prioridad, cantidad de workers por cola, etc.
  • Auto-escalado de workers según la carga (muy útil en producción).
  • Soporte para ver y reintentar jobs fallidos directamente desde la interfaz.

Instalación

Ejecutar el comando:

composer require laravel/horizon
Después instalar los assets y configurar:
php artisan horizon:install
Creando :
  • "config/horizon.php" donde se configura todo.
  • Tiempos de ejecución.

Configuración básica

'environments' => [
'production' => [
'supervisor-app' => [
  'connection' => 'redis',
  'queue' => ['default', 'high', 'low'],  // puedes tener prioridades
  'balance'=> 'auto',// auto-escala workers según carga
  'processes'  => 10,  // máximo workers simultáneos
  'timeout'=> 120, // segundos antes de matar un job colgado
  'tries' => 3,// reintentos automáticos
  'memory' => 128, // MB antes de reiniciar worker
],

'supervisor-reports' => [// otro grupo para colas específicas
  'connection' => 'redis',
  'queue' => ['reports'],
  'balance'=> 'simple',
  'processes'  => 5,
  'timeout'=> 600,// reportes pueden tardar más
],
],

'local' => [
'supervisor-1' => [
  'connection' => 'redis',
  'queue' => ['default'],
  'balance'=> 'false',
  'processes'  => 3,
],
],
],
  • Opciones clave de balance:auto → Horizon ajusta automáticamente la cantidad de workers según la carga (recomendado en prod).
  • simple → balance básico.
  • false → no balancea (manual).

Iniciar Horizon

Ejecutar el comando:

php artisan horizon
Esto ejecuta todos los workers definidos en tu config según el entorno (APP_ENV). En producción usar Supervisor o similar para que se reinicie si se cae.

El dashboard (/horizon)

  • Una vez corriendo, entrar a: https://tudominio.com/horizonVerás en tiempo real:Jobs por minuto (throughput)
  • Tiempo de ejecución promedio.
  • Jobs fallidos (con stack trace).
  • Tiempos de espera en cola.
  • Gráficos históricos.
  • Lista de workers activos.
  • Métricas por cola.
  • Posibilidad de pausar/reanudar colas.
  • Retry de jobs fallidos directamente desde la UI.
Nota: Para que las métricas históricas funcionen, programar esto en el scheduler:
$schedule->command('horizon:snapshot')->everyFiveMinutes();

Comandos útiles de Horizon

php artisan horizon// Inicia todo
php artisan horizon:pause  // Pausa todos los workers
php artisan horizon:continue// Reanuda
php artisan horizon:terminate// Mata graceful todos los workers
php artisan horizon:status  // Estado actual
php artisan horizon:forget {id} // Borra un failed job
php artisan horizon:clear  // Limpia métricas antiguas

Ventajas principales

  • Dashboard visual increíble (mejor que Telescope para queues).
  • Config en código → fácil versionar, deploy, CI/CD.
  • Auto-balanceo → ahorras recursos (no tienes 20 workers siempre corriendo).
  • Alertas (puedes configurar notificaciones Slack si una cola se atrasa mucho).
  • Tags automáticos en jobs (si usas Eloquent models, taggea por ID).
  • Muy estable y mantenido por el equipo de Laravel.

Cuándo NO usarlo

  • Si se usa driver database o sync → no sirve.
  • Proyectos muy pequeños sin colas pesadas (puedes quedarte con queue:work).
  • Si no se usa dedicado (Horizon usa una conexión especial llamada "horizon").
También se puede usar Laravel Pulse