Вступление
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 позволяет выбрать один из трех уравновешивающих стратегий: simple
, auto
, и false
. simple
Стратегия, которая по умолчанию файла конфигурации, расщепляет поступающие задания равномерно между процессами:
'balance' => 'simple',
auto
Стратегия регулирует количество рабочих процессов в очередь на основе текущей рабочей нагрузки очереди. Например, если в вашей notifications
очереди 1000 ожидающих заданий, а ваша render
очередь пуста, Horizon будет выделять больше рабочих в вашу notifications
очередь, пока она не станет пустой. Если для этого balance
параметра установлено значение false
, будет использоваться поведение Laravel по умолчанию, которое обрабатывает очереди в порядке, указанном в вашей конфигурации.
Обрезка работы
horizon
Файл конфигурации позволяет настроить , как долго в последнее время и не рабочие места должны быть сохранены (в минутах). По умолчанию последние задания сохраняются в течение одного часа, а невыполненные задания - в течение недели:
'trim' => [
'recent' => 60,
'failed' => 10080,
],
Авторизация панели инструментов
Горизонт выставляет приборную панель в /horizon
. По умолчанию вы сможете получить доступ к этой панели только в этой local
среде. В вашем файле есть метод. Этот шлюз авторизации контролирует доступ к Horizon в нелокальных средах. Вы можете изменять эти ворота по мере необходимости, чтобы ограничить доступ к вашей установке Horizon:app/Providers/HorizonServiceProvider.php
gate
/**
* 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.php
horizon
php artisan horizon
Вы можете приостановить процесс Horizon и дать ему команду продолжить обработку заданий, используя команды и Artisan:horizon:pause
horizon: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\Video
id
1
App\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::routeMailNotificationsTo
Horizon::routeSlackNotificationsTo
Horizon::routeSmsNotificationsTo
HorizonServiceProvider
Horizon::routeMailNotificationsTo('example@example.com');
Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel');
Horizon::routeSmsNotificationsTo('15556667777');
Настройка порогов времени ожидания уведомлений
Вы можете настроить, сколько секунд считаются «долгим ожиданием» в вашем файле конфигурации. Параметр конфигурации в этом файле позволяет вам контролировать порог длительного ожидания для каждой комбинации подключения / очереди:config/horizon.php
waits
'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();
}
0 комментариев