Skip to main content

Qué es Horizon

Laravel Horizon es el dashboard de monitorización específico para colas Redis de Laravel. Visualiza en tiempo real la productividad, los tiempos de ejecución y los fallos de los jobs, y permite gestionar por código la configuración de los workers.
Horizon es un paquete que extiende la funcionalidad base de colas. Antes de continuar, familiarízate con lo básico de Colas y jobs. Además, el backend debe ser necesariamente Redis.

Instalación

Horizon utiliza Redis como backend de la cola. Verifica que QUEUE_CONNECTION en config/queue.php esté configurado como redis. Actualmente no soporta Redis Cluster.
Instala con Composer.
Tras la instalación, publica los assets y la configuración de Horizon.
Este comando genera config/horizon.php y app/Providers/HorizonServiceProvider.php.

Configuración

Estructura de config/horizon.php

config/horizon.php es el archivo donde se gestiona toda la configuración de los workers. La opción central es environments.
Horizon usa internamente una conexión Redis llamada horizon. No utilices ese nombre para otras conexiones en config/database.php.

CSP nonce (Content Security Policy)

Si quieres, como parte de tu Content Security Policy, añadir el atributo nonce a las etiquetas script / style de las vistas de Horizon, usa el método Horizon::cspNonce. Como se debe asignar un nonce nuevo por petición, normalmente se invoca desde un middleware.
Añade este middleware a la opción middleware de config/horizon.php.

Supervisores (Supervisor)

Cada entorno puede tener uno o varios «supervisores». Un supervisor es la unidad de gestión de un grupo de workers; en un mismo entorno pueden convivir varios supervisores con distintas colas, estrategias de balance y número de procesos.

Valores por defecto

En la opción defaults puedes fijar valores por defecto que se aplican a todos los supervisores.

Modo mantenimiento

Cuando la aplicación está en modo mantenimiento, Horizon no procesa jobs por defecto. Para forzar el procesamiento usa la opción force.

Número máximo de intentos de un job

Poner tries a 0 permite reintentos ilimitados.

Timeout del job

Configura timeout unos segundos menor que retry_after en config/queue.php. Además, la estrategia de balance auto puede terminar por la fuerza jobs que superen este valor.

Backoff (tiempo de espera antes de reintentar)

Indica los segundos de espera antes de reintentar tras una excepción.

Otras opciones del worker

Además de tries, timeout y backoff, cada supervisor admite opciones que controlan el comportamiento del proceso worker y el momento de reinicio automático. Reiniciar periódicamente los procesos de larga duración es una buena práctica para prevenir fugas de memoria.
  • memory — cantidad máxima de memoria (MB) que puede consumir un worker antes de reiniciarse. Por defecto 128.
  • maxJobs — número de jobs a procesar antes del reinicio. 0 significa sin límite. Por defecto 0.
  • maxTime — segundos que puede estar corriendo un worker antes del reinicio. 0 significa sin reinicio por tiempo. Por defecto 0.
  • sleep — segundos de espera hasta el siguiente polling cuando no hay jobs. Por defecto 3.
  • rest — segundos de pausa entre procesamiento de jobs. Por defecto 0.
  • nice — prioridad («niceness») del proceso worker. Cuanto más alto, menor prioridad. Por defecto 0.

Estrategias de balance

Horizon dispone de tres estrategias de balance de workers.
Ajusta automáticamente el número de workers según la carga de la cola. Indica el rango con minProcesses y maxProcesses.
  • time — escala según el tiempo estimado para vaciar la cola.
  • size — escala según el número de jobs en la cola.
Con la estrategia auto, el orden de las colas no implica prioridad. Si necesitas forzar prioridades, utiliza varios supervisores.
Fija el número de workers y los distribuye equitativamente entre las colas indicadas.
En este ejemplo se asignan 5 procesos a default y otros 5 a notifications.
Prioriza estrictamente las colas en el orden enumerado. Se comporta como el sistema de colas por defecto de Laravel, pero escala el número de workers según el backlog.
Los jobs de la cola default se procesan siempre antes que los de notifications.

Autorización del dashboard

El dashboard de Horizon está en la ruta /horizon. En local es accesible por defecto para cualquiera, pero en producción debes restringir el acceso mediante una gate. Edita el método gate() de app/Providers/HorizonServiceProvider.php.
Si no requieres autenticación (por ejemplo, si proteges por IP), haz el argumento opcional.

Arrancar Horizon

Comandos básicos

Desarrollo local: reinicio automático

Para reiniciar Horizon automáticamente al detectar cambios en los archivos, usa horizon:listen.

Ejecución permanente con Supervisor

En producción se mantiene Horizon en marcha permanente con Supervisor.

Instalar Supervisor

Crear el archivo de configuración

Crea /etc/supervisor/conf.d/horizon.conf.
Configura stopwaitsecs con un valor mayor que la duración del job más largo. Si es demasiado bajo, Supervisor terminará los jobs a la fuerza.

Arrancar Supervisor

En cada despliegue

Cada vez que despliegues código, reinicia Horizon para reflejar los cambios.
Con autostart=true / autorestart=true en Supervisor, se reiniciará automáticamente tras el apagado.

Gestión de jobs

Etiquetas

Horizon detecta automáticamente los modelos Eloquent relacionados con un job y les asigna etiquetas.
Para definir etiquetas manualmente, implementa el método tags().
En listeners de eventos, la instancia del evento se pasa al método tags().

Silenciado

Los jobs que no quieras que aparezcan en la lista de «jobs completados» del dashboard pueden silenciarse en config/horizon.php.
También puedes implementar la interfaz Silenced.

Métricas y monitorización

El dashboard de métricas de Horizon muestra el throughput y los tiempos de ejecución de jobs y colas. Programa la toma periódica de snapshots.
La opción metrics.trim_snapshots de config/horizon.php te permite configurar cuántos snapshots se conservan para las gráficas. Como este ajuste limita por número de entradas y no por antigüedad, el período efectivo de retención depende de la frecuencia con la que ejecutes horizon:snapshot.
Para borrar todos los datos de métricas:

Notificaciones de fallo de jobs

Puedes recibir notificaciones cuando el tiempo de espera de la cola aumenta. Configúralo en el método boot() de app/Providers/HorizonServiceProvider.php.

Umbrales de espera

En la opción waits de config/horizon.php configura los segundos de espera que disparan la notificación.
Al indicar 0 se desactiva la notificación para esa cola.

Gestión de jobs fallidos

Puedes borrar jobs fallidos por su ID o UUID.
Para vaciar todos los jobs de una cola:

Actualización

Al actualizar a una nueva versión mayor de Horizon, consulta siempre la guía de actualización.

Páginas relacionadas

Colas y jobs

Fundamentos de las colas de Laravel. Explica la creación, el despacho, el procesamiento por lotes y el manejo de fallos de los jobs.

Redis

Configuración y uso de Redis, necesario como backend de Horizon.
Última modificación el 2 de agosto de 2026