Unetway

Laravel - Horizon

Вступление

Horizon предоставляет прекрасную панель мониторинга и управляемую кодом конфигурацию для ваших очередей Redis с питанием от Laravel. Horizon позволяет вам легко отслеживать ключевые показатели вашей системы очередей, такие как пропускная способность, время выполнения и сбои заданий.

Вся ваша рабочая конфигурация хранится в одном простом файле конфигурации, что позволяет вашей конфигурации оставаться в системе контроля версий, где вся ваша команда может сотрудничать.

 

 

Монтаж

Вы должны убедиться, что ваш драйвер очереди установлен redisв вашем queueфайле конфигурации.

Вы можете использовать Composer для установки Horizon в ваш проект Laravel:

composer require laravel/horizon

После установки Horizon опубликуйте его ресурсы с помощью команды Artisan:horizon:install

php artisan horizon:install

Вам также следует создать failed_jobsтаблицу, которую Laravel будет использовать для хранения любых неудачных заданий очереди :

php artisan queue:failed-table

php artisan migrate

 

Обновление Horizon

При обновлении до новой основной версии Horizon важно внимательно изучить руководство по обновлению .

Кроме того, вы должны повторно опубликовать активы Horizon:

php artisan horizon:assets

 

Конфигурация

После публикации ресурсов Horizon его основной файл конфигурации будет находиться по адресу . Этот файл конфигурации позволяет вам сконфигурировать ваши рабочие параметры, и каждый параметр конфигурации содержит описание его назначения, поэтому обязательно внимательно изучите этот файл.config/horizon.php

Вы должны убедиться, что environmentsчасть вашего horizonфайла конфигурации содержит запись для каждой среды, в которой вы планируете запускать Horizon.

Варианты баланса

Horizon позволяет выбрать один из трех уравновешивающих стратегий: simpleauto, и falsesimpleСтратегия, которая по умолчанию файла конфигурации, расщепляет поступающие задания равномерно между процессами:

'balance' => 'simple',

autoСтратегия регулирует количество рабочих процессов в очередь на основе текущей рабочей нагрузки очереди. Например, если в вашей notificationsочереди 1000 ожидающих заданий, а ваша renderочередь пуста, Horizon будет выделять больше рабочих в вашу notificationsочередь, пока она не станет пустой. Если для этого balanceпараметра установлено значение false, будет использоваться поведение Laravel по умолчанию, которое обрабатывает очереди в порядке, указанном в вашей конфигурации.

Обрезка работы

horizonФайл конфигурации позволяет настроить , как долго в последнее время и не рабочие места должны быть сохранены (в минутах). По умолчанию последние задания сохраняются в течение одного часа, а невыполненные задания - в течение недели:

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

 

Авторизация панели инструментов

Горизонт выставляет приборную панель в /horizon. По умолчанию вы сможете получить доступ к этой панели только в этой localсреде. В вашем файле есть метод. Этот шлюз авторизации контролирует доступ к Horizon в нелокальных средах. Вы можете изменять эти ворота по мере необходимости, чтобы ограничить доступ к вашей установке Horizon:app/Providers/HorizonServiceProvider.phpgate

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

 

Бегущий Horizon

После того, как вы сконфигурировали своих работников в файле конфигурации, вы можете запустить Horizon с помощью команды Artisan. Эта единственная команда запустит всех ваших настроенных рабочих:config/horizon.phphorizon

php artisan horizon

Вы можете приостановить процесс Horizon и дать ему команду продолжить обработку заданий, используя команды и Artisan:horizon:pausehorizon:continue

php artisan horizon:pause

php artisan horizon:continue

Вы можете корректно завершить основной процесс Horizon на своем компьютере с помощью команды Artisan. Все задания, которые в данный момент обрабатывает Horizon, будут завершены, а затем Horizon завершит работу:horizon:terminate

php artisan horizon:terminate

 

Развертывание Horizon

Если вы развертываете Horizon на работающем сервере, вы должны настроить монитор процесса для мониторинга php artisan horizonкоманды и перезапустить ее, если она неожиданно завершит работу. При развертывании свежего кода на вашем сервере вам нужно будет дать команду основному процессу Horizon завершить его, чтобы он мог быть перезапущен вашим монитором процесса и получить изменения кода.

Конфигурация супервизора

Если вы используете монитор процессов Supervisor для управления вашим horizonпроцессом, вам может подойти следующий файл конфигурации:

[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

Если вам неудобно управлять своими серверами, подумайте об использовании Laravel Forge . Forge предоставляет серверы PHP 7+ со всем необходимым для запуска современных надежных приложений Laravel с Horizon.

 

Теги

Horizon позволяет назначать «теги» для заданий, включая почтовые сообщения, трансляции событий, уведомления и прослушиватели событий в очереди. Фактически, Horizon будет автоматически и автоматически помечать большинство заданий в зависимости от моделей Eloquent, прикрепленных к заданию. Например, взгляните на следующую работу:

<?php

namespace App\Jobs;

use App\Video;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class RenderVideo implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * The video instance.
     *
     * @var \App\Video
     */
    public $video;

    /**
     * Create a new job instance.
     *
     * @param  \App\Video  $video
     * @return void
     */
    public function __construct(Video $video)
    {
        $this->video = $video;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //
    }
}

Если это задание поставлено в очередь с экземпляром, имеющим о , оно автоматически получит тег . Это связано с тем, что Horizon проверит свойства задания для любых моделей Eloquent. Если найдены модели Eloquent, Horizon интеллектуально пометит задание, используя имя класса модели и первичный ключ:App\Videoid1App\Video:1

$video = App\Video::find(1);

App\Jobs\RenderVideo::dispatch($video);

Маркировка вручную

Если вы хотите вручную определить теги для одного из объектов в очереди, вы можете определить tagsметод для класса:

class RenderVideo implements ShouldQueue
{
    /**
     * Get the tags that should be assigned to the job.
     *
     * @return array
     */
    public function tags()
    {
        return ['render', 'video:'.$this->video->id];
    }
}

 

Уведомления

Примечание. При настройке Horizon для отправки уведомлений Slack или SMS необходимо проверить предварительные условия для соответствующего драйвера уведомлений .

Если вы хотите получать уведомления , когда один из ваших очередей имеют длительное время ожидания, вы можете использовать , и методу. Вы можете вызвать эти методы из вашего приложения :Horizon::routeMailNotificationsToHorizon::routeSlackNotificationsToHorizon::routeSmsNotificationsToHorizonServiceProvider

Horizon::routeMailNotificationsTo('example@example.com');
Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel');
Horizon::routeSmsNotificationsTo('15556667777');

Настройка порогов времени ожидания уведомлений

Вы можете настроить, сколько секунд считаются «долгим ожиданием» в вашем файле конфигурации. Параметр конфигурации в этом файле позволяет вам контролировать порог длительного ожидания для каждой комбинации подключения / очереди:config/horizon.phpwaits

'waits' => [
    'redis:default' => 60,
],

 

Метрика

Horizon включает панель показателей, которая предоставляет информацию о вашей работе, времени ожидания и пропускной способности очереди. Чтобы заполнить эту панель, вы должны настроить snapshotкоманду Horizon Artisan для запуска каждые пять минут через планировщиквашего приложения :

/**
 * Define the application's command schedule.
 *
 * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
 * @return void
 */
protected function schedule(Schedule $schedule)
{
    $schedule->command('horizon:snapshot')->everyFiveMinutes();
}