Laravel Horizon
- معرفی
- نصب و راه اندازی
- ارتقاء Horizon
- Running Horizon
- برچسب ها
- اطلاعیه
- معیارهای
- حذف مشاغل ناموفق
- پاک کردن مشاغل از صف
معرفی
قبل از جستجو در Laravel Horizon، باید با خدمات صف پایه لاراول آشنا شوید . Horizon صف لاراول را با ویژگیهای اضافی افزایش میدهد که اگر از قبل با ویژگیهای صف اولیه ارائه شده توسط لاراول آشنا نباشید، ممکن است گیجکننده باشد.
Laravel Horizon یک داشبورد زیبا و پیکربندی کد محور برای صفهای Redis با قدرت لاراول شما فراهم میکند . Horizon به شما این امکان را می دهد تا به راحتی معیارهای کلیدی سیستم صف خود را مانند توان عملیاتی، زمان اجرا و خرابی های شغلی نظارت کنید.
هنگام استفاده از Horizon، تمام تنظیمات queue worker شما در یک فایل پیکربندی ساده ذخیره می شود. با تعریف پیکربندی کارگر برنامه خود در یک فایل کنترلشده نسخه، میتوانید به راحتی تعداد کارگران صف برنامه خود را در هنگام استقرار برنامه خود تغییر دهید.
نصب و راه اندازی
Laravel Horizon مستلزم این است که از Redis برای قدرت بخشیدن به صف خود استفاده کنید . بنابراین، باید اطمینان حاصل کنید که اتصال صف شما
redis
در فایل پیکربندی برنامه شما تنظیم شده استconfig/queue.php
.
می توانید Horizon را با استفاده از مدیریت بسته Composer در پروژه خود نصب کنید:
composer require laravel/horizon
پس از نصب Horizon، دارایی های آن را با استفاده از
horizon:install
دستور Artisan منتشر کنید:
php artisan horizon:install
پیکربندی
پس از انتشار دارایی های Horizon، فایل پیکربندی اولیه آن در آدرس قرار خواهد گرفت
config/horizon.php
. این فایل پیکربندی به شما امکان می دهد تا گزینه های queue worker را برای برنامه خود پیکربندی کنید. هر گزینه پیکربندی شامل شرحی از هدف خود است، بنابراین حتما این فایل را به طور کامل بررسی کنید.
Horizon از یک اتصال Redis به نام
horizon
داخلی استفاده می کند. این نام اتصال Redis رزرو شده است و نباید به یک اتصال Redis دیگر درdatabase.php
فایل پیکربندی یا به عنوان مقدارuse
گزینه موجود درhorizon.php
فایل پیکربندی اختصاص داده شود.
محیط ها
پس از نصب، گزینه اولیه پیکربندی Horizon که باید با آن آشنا شوید،
environments
گزینه پیکربندی است. این گزینه پیکربندی آرایهای از محیطهایی است که برنامه شما روی آن اجرا میشود و گزینههای پردازش کارگر را برای هر محیط تعریف میکند. به طور پیش فرض، این ورودی حاوی یک
production
و
local
محیط است. با این حال، میتوانید در صورت نیاز محیطهای بیشتری را اضافه کنید:
'environments' => [ 'production' => [ 'supervisor-1' => [ 'maxProcesses' => 10, 'balanceMaxShift' => 1, 'balanceCooldown' => 3, ], ], 'local' => [ 'supervisor-1' => [ 'maxProcesses' => 3, ], ],],
هنگامی که Horizon را راه اندازی می کنید، از گزینه های پیکربندی فرآیند کارگر برای محیطی که برنامه شما در آن اجرا می شود استفاده می کند. به طور معمول، محیط با مقدار
APP_ENV
متغیر محیطی
تعیین می شود . به عنوان مثال، محیط پیشفرض
local
Horizon به گونهای پیکربندی شده است که سه فرآیند کارگر را شروع کند و به طور خودکار تعداد پردازشهای کارگر اختصاص داده شده به هر صف را متعادل کند. محیط
پیشفرض
production
به گونهای پیکربندی شده است که حداکثر 10 فرآیند کارگر را شروع کند و به طور خودکار تعداد پردازشهای کارگر اختصاص داده شده به هر صف را متعادل کند.
باید اطمینان حاصل کنید که
environments
بخشی از فایل پیکربندی شماhorizon
حاوی یک ورودی برای هر محیطی است که قصد دارید Horizon را در آن اجرا کنید.
ناظران
همانطور که در فایل تنظیمات پیشفرض Horizon میبینید، هر محیط میتواند شامل یک یا چند "سرپرست" باشد. به طور پیش فرض، فایل پیکربندی این سرپرست را به صورت
supervisor-1
; با این حال، شما آزادید که نام سرپرستان خود را هر چه می خواهید بنویسید. هر ناظر اساساً مسئول "نظارت" گروهی از فرآیندهای کارگری است و از ایجاد تعادل بین فرآیندهای کارگر در صف ها مراقبت می کند.
اگر میخواهید گروه جدیدی از فرآیندهای کارگری را تعریف کنید که باید در آن محیط اجرا شوند، میتوانید سرپرستهای اضافی را به یک محیط معین اضافه کنید. اگر میخواهید یک استراتژی متوازن متفاوت یا تعداد فرآیند کارگری برای یک صف معین که توسط برنامه شما استفاده میشود، تعریف کنید، میتوانید این کار را انجام دهید.
حالت تعمیر و نگهداری
در حالی که برنامه شما در
حالت نگهداری
است ، کارهای در صف توسط Horizon پردازش نمی شوند مگر اینکه گزینه سرپرست به
صورت فایل پیکربندی Horizon
force
تعریف شده باشد :
true
'environments' => [ 'production' => [ 'supervisor-1' => [ // ... 'force' => true, ], ],],
مقادیر پیش فرض
در فایل پیکربندی پیش فرض Horizon، یک
defaults
گزینه پیکربندی را مشاهده خواهید کرد. این گزینه پیکربندی مقادیر پیش فرض را برای
سرپرستان
برنامه شما مشخص می کند
. مقادیر پیکربندی پیشفرض سرپرست در پیکربندی ناظر برای هر محیط ادغام میشود و به شما این امکان را میدهد که از تکرار غیرضروری هنگام تعریف سرپرستهای خود جلوگیری کنید.
استراتژی های متعادل سازی
برخلاف سیستم صف پیشفرض لاراول، Horizon به شما این امکان را میدهد تا از بین سه استراتژی متعادلسازی کارگر انتخاب کنید:
simple
,
auto
و
false
. این
simple
استراتژی مشاغل ورودی را به طور مساوی بین فرآیندهای کارگر تقسیم می کند:
'balance' => 'simple',
این
auto
استراتژی که پیشفرض فایل پیکربندی است، تعداد فرآیندهای کارگر در هر صف را بر اساس حجم کاری فعلی صف تنظیم میکند. به عنوان مثال، اگر
notifications
صف شما دارای 1000 شغل معلق باشد در حالی که
render
صف شما خالی است، Horizon کارگران بیشتری را به
notifications
صف شما اختصاص می دهد تا زمانی که صف خالی شود.
هنگام استفاده از
auto
استراتژی، میتوانید گزینهها
minProcesses
و
maxProcesses
پیکربندی را برای کنترل حداقل و حداکثر تعداد فرآیندهای کارگری تعریف کنید که Horizon باید به بالا و پایینتر مقیاس شود:
'environments' => [ 'production' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'auto', 'autoScalingStrategy' => 'time', 'minProcesses' => 1, 'maxProcesses' => 10, 'balanceMaxShift' => 1, 'balanceCooldown' => 3, 'tries' => 3, ], ],],
مقدار
autoScalingStrategy
پیکربندی تعیین میکند که Horizon بر اساس کل مدت زمانی که برای پاک کردن صف (
time
استراتژی) طول میکشد یا تعداد کل کارهای موجود در صف (
size
استراتژی) فرآیندهای کارگر بیشتری را به صفها اختصاص میدهد.
مقادیر پیکربندی
balanceMaxShift
و
balanceCooldown
پیکربندی تعیین میکنند که Horizon با چه سرعتی مقیاس میشود تا تقاضای کارگران را برآورده کند. در مثال بالا، حداکثر یک فرآیند جدید در هر سه ثانیه ایجاد یا از بین میرود. شما آزاد هستید که این مقادیر را در صورت لزوم بر اساس نیازهای برنامه خود تغییر دهید.
وقتی این
balance
گزینه روی تنظیم شود
false
، رفتار پیشفرض لاراول استفاده میشود، که در آن صفها به ترتیبی که در پیکربندی شما فهرست شدهاند پردازش میشوند.
مجوز داشبورد
داشبورد Horizon ممکن است از طریق
/horizon
مسیر قابل دسترسی باشد. به طور پیش فرض، شما فقط می توانید در
local
محیط به این داشبورد دسترسی داشته باشید. با این حال، در فایل شما ، یک تعریف
دروازه مجوز
app/Providers/HorizonServiceProvider.php
وجود دارد
. این گیت مجوز دسترسی به Horizon را در محیط های
غیر محلی
کنترل می کند . شما آزاد هستید که این گیت را در صورت نیاز برای محدود کردن دسترسی به نصب Horizon خود تغییر دهید:
/** * Register the Horizon gate. * * This gate determines who can access Horizon in non-local environments. */protected function gate(): void{ Gate::define('viewHorizon', function (User $user) { return in_array($user->email, [ 'taylor@laravel.com', ]); });}
استراتژی های احراز هویت جایگزین
به یاد داشته باشید که لاراول به طور خودکار کاربر تأیید شده را به بسته شدن گیت تزریق می کند. اگر برنامه شما امنیت Horizon را از طریق روش دیگری مانند محدودیت IP فراهم می کند، کاربران Horizon شما ممکن است نیازی به "ورود به سیستم" نداشته باشند. بنابراین،
برای اینکه لاراول را مجبور کنید نیازی به احراز هویت نداشته باشد،
باید
function (User $user)
امضای بسته شدن بالا را به تغییر دهید.
function (User $user = null)
مشاغل خاموش
گاهی اوقات، ممکن است علاقه ای به مشاهده مشاغل خاصی که توسط برنامه یا بسته های شخص ثالث ارسال شده اند نباشید. به جای اینکه این مشاغل در لیست «کارهای تکمیل شده» شما فضایی اشغال کنند، می توانید آنها را ساکت کنید. برای شروع، نام کلاس کار را به
silenced
گزینه پیکربندی در فایل پیکربندی برنامه خود اضافه کنید
horizon
:
'silenced' => [ App\Jobs\ProcessPodcast::class,],
از طرف دیگر، کاری که میخواهید بیصدا کنید، میتواند
Laravel\Horizon\Contracts\Silenced
رابط را پیادهسازی کند. اگر یک کار این رابط را پیاده سازی کند، به طور خودکار خاموش می شود، حتی اگر در
silenced
آرایه پیکربندی وجود نداشته باشد:
use Laravel\Horizon\Contracts\Silenced; class ProcessPodcast implements ShouldQueue, Silenced{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; // ...}
ارتقاء Horizon
هنگام ارتقاء به نسخه اصلی جدید Horizon، مهم است که راهنمای ارتقا را به دقت مرور کنید . علاوه بر این، هنگام ارتقاء به هر نسخه جدید Horizon، باید دارایی های Horizon را مجدداً منتشر کنید:
php artisan horizon:publish
برای به روز نگه داشتن دارایی ها و جلوگیری از مشکلات در به روز رسانی های بعدی، می توانید این
vendor:publish --tag=laravel-assets
دستور را به
post-update-cmd
اسکریپت های فایل برنامه خود اضافه کنید
composer.json
:
{ "scripts": { "post-update-cmd": [ "@php artisan vendor:publish --tag=laravel-assets --ansi --force" ] }}
Running Horizon
هنگامی که سرپرستان و کارگران خود را در فایل پیکربندی برنامه خود پیکربندی کردید
config/horizon.php
، می توانید Horizon را با استفاده از
horizon
دستور Artisan راه اندازی کنید. این دستور واحد تمام فرآیندهای کارگر پیکربندی شده برای محیط فعلی را شروع می کند:
php artisan horizon
می توانید فرآیند Horizon را متوقف کنید و به آن دستور دهید تا با استفاده از دستورات
horizon:pause
و
horizon:continue
Artisan به پردازش کارهای خود ادامه دهد:
php artisan horizon:pause php artisan horizon:continue
همچنین میتوانید
با استفاده از دستورات
و Artisan،
سرپرستهای
خاص Horizon را متوقف کرده و ادامه دهید :
horizon:pause-supervisor
horizon:continue-supervisor
php artisan horizon:pause-supervisor supervisor-1 php artisan horizon:continue-supervisor supervisor-1
می توانید وضعیت فعلی فرآیند Horizon را با استفاده از
horizon:status
دستور Artisan بررسی کنید:
php artisan horizon:status
میتوانید با استفاده از
horizon:terminate
دستور Artisan، فرآیند Horizon را بهخوبی خاتمه دهید. همه کارهایی که در حال حاضر توسط آنها پردازش می شود تکمیل می شود و سپس Horizon اجرای آن را متوقف می کند:
php artisan horizon:terminate
استقرار Horizon
هنگامی که آماده استقرار Horizon در سرور واقعی برنامه خود هستید، باید یک مانیتور فرآیند را برای نظارت بر فرمان پیکربندی کنید
php artisan horizon
و در صورت خروج غیرمنتظره آن را مجددا راه اندازی کنید. نگران نباشید، در ادامه به نحوه نصب مانیتور فرآیند خواهیم پرداخت.
در طول فرآیند استقرار برنامه خود، باید به فرآیند Horizon دستور دهید تا پایان یابد تا توسط مانیتور فرآیند شما مجدداً راه اندازی شود و تغییرات کد شما را دریافت کند:
php artisan horizon:terminate
نصب سوپروایزر
Supervisor یک مانیتور فرآیند برای سیستم عامل لینوکس است و
horizon
در صورت توقف اجرای فرآیند شما به طور خودکار مجدداً راه اندازی می شود. برای نصب Supervisor در اوبونتو، می توانید از دستور زیر استفاده کنید. اگر از اوبونتو استفاده نمی کنید، احتمالاً می توانید Supervisor را با استفاده از مدیریت بسته سیستم عامل خود نصب کنید:
sudo apt-get install supervisor
اگر پیکربندی Supervisor به نظر می رسد بسیار دشوار است، از Laravel Forge استفاده کنید ، که به طور خودکار Supervisor را برای پروژه های Laravel شما نصب و پیکربندی می کند.
پیکربندی سرپرست
فایل های پیکربندی ناظر معمولاً در دایرکتوری سرور شما ذخیره می شوند
/etc/supervisor/conf.d
. در این فهرست، میتوانید هر تعداد فایل پیکربندی ایجاد کنید که به سرپرست آموزش میدهد که چگونه فرآیندهای شما باید نظارت شوند. به عنوان مثال، بیایید یک
horizon.conf
فایل ایجاد کنیم که یک
horizon
فرآیند را شروع و نظارت کند:
[program:horizon]process_name=%(program_name)scommand=php /home/forge/example.com/artisan horizonautostart=trueautorestart=trueuser=forgeredirect_stderr=truestdout_logfile=/home/forge/example.com/horizon.logstopwaitsecs=3600
هنگام تعریف پیکربندی Supervisor خود، باید مطمئن شوید که مقدار از
stopwaitsecs
تعداد ثانیه های مصرف شده توسط طولانی ترین کار شما بیشتر باشد. در غیر این صورت، Supervisor ممکن است کار را قبل از اتمام پردازش آن از بین ببرد.
در حالی که مثال های بالا برای سرورهای مبتنی بر اوبونتو معتبر هستند، مکان و پسوند فایل مورد انتظار از فایل های پیکربندی Supervisor ممکن است بین سایر سیستم عامل های سرور متفاوت باشد. لطفاً برای اطلاعات بیشتر به اسناد سرور خود مراجعه کنید.
راه اندازی سرپرست
پس از ایجاد فایل پیکربندی، می توانید پیکربندی Supervisor را به روز کنید و فرآیندهای نظارت شده را با استفاده از دستورات زیر شروع کنید:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start horizon
برای اطلاعات بیشتر در مورد اجرای Supervisor، به مستندات Supervisor مراجعه کنید .
برچسب ها
Horizon به شما این امکان را میدهد که «برچسبها» را به مشاغل، از جمله پستهای ارسالی، رویدادهای پخش، اعلانها و شنوندگان رویداد در صف اختصاص دهید. در واقع، Horizon به طور هوشمندانه و خودکار اکثر مشاغل را بسته به مدل های Eloquent که به شغل متصل شده اند برچسب گذاری می کند. برای مثال به شغل زیر نگاهی بیندازید:
<?php namespace App\Jobs; use App\Models\Video;use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Foundation\Bus\Dispatchable;use Illuminate\Queue\InteractsWithQueue;use Illuminate\Queue\SerializesModels; class RenderVideo implements ShouldQueue{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * Create a new job instance. */ public function __construct( public Video $video, ) {} /** * Execute the job. */ public function handle(): void { // ... }}
اگر این کار با نمونه ای در صف قرار گیرد
App\Models\Video
که دارای
id
ویژگی باشد
1
، به طور خودکار تگ را دریافت می کند
App\Models\Video:1
. این به این دلیل است که Horizon ویژگی های شغل را برای هر مدل Eloquent جستجو می کند. اگر مدلهای Eloquent پیدا شوند، Horizon با استفاده از نام کلاس و کلید اصلی مدل، کار را هوشمندانه برچسبگذاری میکند:
use App\Jobs\RenderVideo;use App\Models\Video; $video = Video::find(1); RenderVideo::dispatch($video);
برچسب زدن دستی مشاغل
اگر می خواهید به صورت دستی تگ ها را برای یکی از اشیاء در صف خود تعریف کنید، می توانید یک
tags
متد در کلاس تعریف کنید:
class RenderVideo implements ShouldQueue{ /** * Get the tags that should be assigned to the job. * * @return array<int, string> */ public function tags(): array { return ['render', 'video:'.$this->video->id]; }}
برچسب زدن دستی شنوندگان رویداد
هنگام بازیابی برچسب ها برای شنونده رویداد در صف، Horizon به طور خودکار نمونه رویداد را به
tags
متد ارسال می کند و به شما امکان می دهد داده های رویداد را به برچسب ها اضافه کنید:
class SendRenderNotifications implements ShouldQueue{ /** * Get the tags that should be assigned to the listener. * * @return array<int, string> */ public function tags(VideoRendered $event): array { return ['video:'.$event->video->id]; }}
اطلاعیه
هنگام پیکربندی Horizon برای ارسال اعلانهای Slack یا SMS، باید پیشنیازهای کانال اعلان مربوطه را بررسی کنید .
اگر میخواهید زمانی که یکی از صفهای شما زمان انتظار طولانی دارد به شما اطلاع داده شود، میتوانید از روشهای
Horizon::routeMailNotificationsTo
،
Horizon::routeSlackNotificationsTo
و و استفاده کنید
Horizon::routeSmsNotificationsTo
. می توانید این متدها را از
boot
متد برنامه خود فراخوانی کنید
App\Providers\HorizonServiceProvider
:
/** * Bootstrap any application services. */public function boot(): void{ parent::boot(); Horizon::routeSmsNotificationsTo('15556667777'); Horizon::routeMailNotificationsTo('example@example.com'); Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel');}
پیکربندی آستانه های زمان انتظار اعلان
می توانید پیکربندی کنید که چند ثانیه در
config/horizon.php
فایل پیکربندی برنامه شما به عنوان "انتظار طولانی" در نظر گرفته شود. گزینه
waits
پیکربندی در این فایل به شما امکان می دهد آستانه انتظار طولانی را برای هر ترکیب اتصال / صف کنترل کنید. هر ترکیب نامشخص اتصال / صف به طور پیش فرض در آستانه انتظار طولانی 60 ثانیه است:
'waits' => [ 'redis:critical' => 30, 'redis:default' => 60, 'redis:batch' => 120,],
معیارهای
Horizon شامل یک داشبورد معیار است که اطلاعاتی را در مورد زمان انتظار شغل و صف و توان ارائه می دهد. برای پر کردن این داشبورد، باید
snapshot
دستور Artisan Horizon را طوری پیکربندی کنید که هر پنج دقیقه در فایل برنامه شما اجرا شود
routes/console.php
:
use Illuminate\Support\Facades\Schedule; Schedule::command('horizon:snapshot')->everyFiveMinutes();
حذف مشاغل ناموفق
اگر می خواهید یک کار ناموفق را حذف کنید، می توانید از
horizon:forget
دستور استفاده کنید. این
horizon:forget
فرمان ID یا UUID کار ناموفق را به عنوان تنها آرگومان خود می پذیرد:
php artisan horizon:forget 5
پاک کردن مشاغل از صف
اگر می خواهید همه کارها را از صف پیش فرض برنامه خود حذف کنید، می توانید این کار را با استفاده از
horizon:clear
دستور Artisan انجام دهید:
php artisan horizon:clear
می توانید
queue
گزینه ای برای حذف مشاغل از یک صف خاص ارائه دهید:
php artisan horizon:clear --queue=emails