LARAVEL HORIZON

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