• Introducción
  • Instalación
    • Configuración
    • Autorización del panel
  • Actualización de Horizon
  • Ejecutando Horizon
    • Implementación de Horizon
  • Etiquetas
  • Notificaciones
  • Métrica
  • Eliminación de trabajos fallidos
  • Borrar trabajos de las colas

Introducción

Horizon proporciona un hermoso panel de control y una configuración basada en código para sus colas de Redis impulsadas por Laravel. Horizon le permite monitorear fácilmente key métricas de su sistema de colas, como el rendimiento del trabajo, el tiempo de ejecución y las fallas del trabajo.

Toda la configuración de su trabajador se almacena en un solo archivo de configuración simple, lo que permite que su configuración permanezca en el control de la fuente donde todo su equipo puede colaborar.

Instalación

Debe asegurarse de que su conexión de cola esté configurada en redis en tus queue archivo de configuración.

Puede usar Composer para instalar Horizon en su proyecto de Laravel:

composer require laravel/horizon

Después de instalar Horizon, publique sus activos usando el horizon:install Mando artesano:

php artisan horizon:install

Configuración

Después de publicar los activos de Horizon, su archivo de configuración principal se ubicará en config/horizon.php. Este archivo de configuración le permite configurar sus opciones de trabajador y cada opción de configuración incluye una descripción de su propósito, así que asegúrese de explorar este archivo a fondo.

Debe asegurarse de que environments parte de tu horizon El archivo de configuración contiene una entrada para cada entorno en el que planea ejecutar Horizon.

Opciones de saldo

Horizon le permite elegir entre tres estrategias de equilibrio: simple, auto, y false. los simple La estrategia, que es la predeterminada del archivo de configuración, divide los trabajos entrantes de manera uniforme entre los procesos:

'balance'=>'simple',

los auto La estrategia ajusta el número de procesos de trabajo por cola en función de la carga de trabajo actual de la cola. Por ejemplo, si tu notifications la cola tiene 1,000 trabajos en espera mientras su render la cola está vacía, Horizon asignará más trabajadores a su notifications cola hasta que esté vacía. Cuando el balance la opción está configurada en false, se utilizará el comportamiento predeterminado de Laravel, que procesa las colas en el orden en que se enumeran en su configuración.

Al usar el auto estrategia, puede definir la minProcesses y maxProcesses opciones de configuración para controlar el número mínimo y máximo de procesos que Horizon debe escalar hacia arriba y hacia abajo para:

'environments'=>['production'=>['supervisor-1'=>['connection'=>'redis','queue'=>['default'],'balance'=>'auto','minProcesses'=>1,'maxProcesses'=>10,'balanceMaxShift'=>1,'balanceCooldown'=>3,'tries'=>3,],],],

los balanceMaxShift y balanceCooldown valores de configuración para determinar la rapidez con la que Horizon escalará para satisfacer la demanda de los trabajadores. En el ejemplo anterior, se creará o destruirá un máximo de un proceso nuevo cada tres segundos. Puede modificar estos valores según sea necesario en función de las necesidades de su aplicación.

Recorte de trabajos

los horizon El archivo de configuración le permite configurar cuánto tiempo deben persistir los trabajos recientes y fallidos (en minutos). De forma predeterminada, los trabajos recientes se conservan durante una hora, mientras que los trabajos fallidos se conservan durante una semana:

'trim'=>['recent'=>60,'failed'=>10080,],

Autorización del panel

Horizon expone un tablero en /horizon. De forma predeterminada, solo podrá acceder a este panel en el local medio ambiente. Dentro de tu app/Providers/HorizonServiceProvider.php archivo, hay un gate método. Esta puerta de autorización controla el acceso a Horizon en no local Ambientes. Puede modificar esta puerta según sea necesario para restringir el acceso a su instalación de Horizon:

/**
 * Register the Horizon gate.
 *
 * This gate determines who can access Horizon in non-local environments.
 *
 * @return void
 */protectedfunctiongate()Gate::define('viewHorizon',function($user)returnin_array($user->email,['[email protected]',]););

Recuerda que Laravel inyecta el autenticado usuario a la puerta de forma automática. Si su aplicación proporciona seguridad de Horizon a través de otro método, como restricciones de IP, es posible que sus usuarios de Horizon no necesiten “iniciar sesión”. Por lo tanto, necesitará cambiar function ($user) arriba a function ($user = null) para obligar a Laravel a no requerir autenticación.

Actualización de Horizon

Al actualizar a una nueva versión principal de Horizon, es importante que revise detenidamente la guía de actualización

.

Además, al actualizar a cualquier nueva versión de Horizon, debe volver a publicar los activos de Horizon:

php artisan horizon:publish

Para mantener los activos actualizados y evitar problemas en futuras actualizaciones, puede agregar el comando al post-update-cmd guiones en tu composer.json expediente:

"scripts":"post-update-cmd":["@php artisan horizon:publish --ansi"]

Ejecutando Horizonte

Una vez que haya configurado sus trabajadores en el config/horizon.php archivo de configuración, puede iniciar Horizon usando el horizon Mando artesanal. Este único comando iniciará todos sus trabajadores configurados:

php artisan horizon

Puede pausar el proceso de Horizon e indicarle que continúe procesando trabajos mediante el horizon:pause y horizon:continue Comandos artesanos:

php artisan horizon:pause

php artisan horizon:continue

También puede pausar y continuar supervisores específicos de Horizon (grupos de trabajadores) mediante el horizon:pause-supervisor y horizon:continue-supervisor Comandos artesanos:

php artisan horizon:pause-supervisor supervisor-1

php artisan horizon:continue-supervisor supervisor-1

Puede verificar el estado actual del proceso de Horizon usando el horizon:status Mando artesano:

php artisan horizon:status

Puede finalizar correctamente el proceso maestro de Horizon en su máquina utilizando el horizon:terminate Mando artesanal. Todos los trabajos que Horizon esté procesando actualmente se completarán y luego Horizon se cerrará:

php artisan horizon:terminate

Implementación de Horizon

Si está implementando Horizon en un servidor en vivo, debe configurar un monitor de proceso para monitorear el php artisan horizon y reinícielo si se cierra inesperadamente. Al implementar código nuevo en su servidor, deberá indicarle al proceso maestro de Horizon que finalice para que su supervisor de procesos pueda reiniciarlo y recibir los cambios de código.

Supervisor de instalación

Supervisor es un monitor de proceso para el sistema operativo Linux y reiniciará automáticamente su horizon proceso si falla. Para instalar Supervisor en Ubuntu, puede usar el siguiente comando:

sudo apt-get install supervisor

Si configurar Supervisor usted mismo suena abrumador, considere usar Forja de Laravel, que instalará y configurará Supervisor automáticamente para sus proyectos de Laravel.

Configuración del supervisor

Los archivos de configuración del supervisor normalmente se almacenan en el /etc/supervisor/conf.d directorio. Dentro de este directorio, puede crear cualquier número de archivos de configuración que indiquen al supervisor cómo se deben monitorear sus procesos. Por ejemplo, creemos un horizon.conf archivo que inicia y supervisa un horizon proceso:

[program:horizon]
process_name=%(program_name)s
command=php /home/forge/app.com/artisan horizon
autostart=true
autorestart=true
user=forge
redirect_stderr=true
stdout_logfile=/home/forge/app.com/horizon.log
stopwaitsecs=3600

Debe asegurarse de que el valor de stopwaitsecs es mayor que el número de segundos consumidos por su trabajo de ejecución más larga. De lo contrario, Supervisor puede finalizar el trabajo antes de que termine de procesarse.

Supervisor inicial

Una vez que se ha creado el archivo de configuración, puede actualizar la configuración del Supervisor e iniciar los procesos usando los siguientes comandos:

sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start horizon

Para obtener más información sobre Supervisor, consulte el Documentación del supervisor.

Etiquetas

Horizon le permite asignar “etiquetas” a los trabajos, incluidos los mensajes por correo, las transmisiones de eventos, las notificaciones y los oyentes de eventos en cola. De hecho, Horizon etiquetará de forma inteligente y automática la mayoría de los trabajos según los modelos de Eloquent que se adjuntan al trabajo. Por ejemplo, eche un vistazo al siguiente trabajo:

namespaceAppJobs;useAppModelsVideo;useIlluminateBusQueueable;useIlluminateContractsQueueShouldQueue;useIlluminateFoundationBusDispatchable;useIlluminateQueueInteractsWithQueue;useIlluminateQueueSerializesModels;classRenderVideoimplementsShouldQueueuseDispatchable, InteractsWithQueue, Queueable, SerializesModels;/**
     * The video instance.
     *
     * @var AppModelsVideo
     */public$video;/**
     * Create a new job instance.
     *
     * @param  AppModelsVideo  $video
     * @return void
     */publicfunction__construct(Video$video)$this->video=$video;/**
     * Execute the job.
     *
     * @return void
     */publicfunctionhandle()//

Si este trabajo está en cola con un AppModelsVideo instancia que tiene una id de 1, recibirá automáticamente la etiqueta AppModelsVideo:1. Esto se debe a que Horizon examinará las propiedades del trabajo para cualquier modelo de Eloquent. Si se encuentran modelos Eloquent, Horizon etiquetará inteligentemente el trabajo usando el nombre de clase del modelo y el key:

$video=AppModelsVideo::find(1);AppJobsRenderVideo::dispatch($video);

Etiquetado manual

Si desea definir manualmente las etiquetas para uno de sus objetos en cola, puede definir un tags método en la clase:

classRenderVideoimplementsShouldQueue/**
     * Get the tags that should be assigned to the job.
     *
     * @return array
     */publicfunctiontags()return['render','video:'.$this->video->id];

Notificaciones

Nota: Al configurar Horizon para enviar notificaciones de Slack o SMS, debe revisar los requisitos previos para el controlador de notificación relevante.

Si desea recibir una notificación cuando una de sus colas tenga un tiempo de espera prolongado, puede utilizar el Horizon::routeMailNotificationsTo, Horizon::routeSlackNotificationsTo, y Horizon::routeSmsNotificationsTo métodos. Puede llamar a estos métodos desde el HorizonServiceProvider:

Horizon::routeMailNotificationsTo('[email protected]');Horizon::routeSlackNotificationsTo('slack-webhook-url','#channel');Horizon::routeSmsNotificationsTo('15556667777');

Configuración de umbrales de tiempo de espera de notificación

Puede configurar cuántos segundos se consideran una “larga espera” dentro de su config/horizon.php archivo de configuración. los waits La opción de configuración dentro de este archivo le permite controlar el umbral de larga espera para cada combinación de conexión / cola:

'waits'=>['redis:default'=>60,'redis:critical,high'=>90,],

Métrica

Horizon incluye un panel de métricas que proporciona información sobre su trabajo y los tiempos de espera y el rendimiento de la cola. Para completar este tablero, debe configurar Horizon snapshot Comando Artisan para ejecutarse cada cinco minutos a través del programador de su aplicación:

/**
 * Define the application's command schedule.
 *
 * @param  IlluminateConsoleSchedulingSchedule  $schedule
 * @return void
 */protectedfunctionschedule(Schedule$schedule)$schedule->command('horizon:snapshot')->everyFiveMinutes();

Eliminación de trabajos fallidos

Si desea eliminar un trabajo fallido, puede utilizar el horizon:forget mando. los horizon:forget El comando acepta el ID del trabajo fallido como su único argumento:

php artisan horizon:forget 5

Borrar trabajos de las colas

Si desea eliminar todos los trabajos de la cola predeterminada, puede hacerlo utilizando el horizon:clear Mando artesano:

php artisan horizon:clear

También puede proporcionar el queue opción para eliminar trabajos de una cola específica:

php artisan horizon:clear --queue=emails