در دنیای شلوغ توسعه وب، لاراول به عنوان یک فریمورک قدرتمند PHP است که توسعه دهندگان را قادر می سازد تا برنامه های کاربردی پیچیده را با کارایی قابل توجه ایجاد کنند. در میان بسیاری از ویژگیهای آن، سیستم صف (Queue) لاراول به عنوان ابزاری حیاتی برای رسیدگی به جاب های وقتگیر بدون ایجاد مانع در پاسخگویی تعاملات کاربر ظاهر میشود. این مقاله به پیچیدگیهای مکانیسم صف لاراول میپردازد پس با ما تا آخر این مقاله همراه باشید.
صف و جاب چیست؟
صفهای لاراول یک API یکپارچه را برای به تعویق انداختن وظایف به زمانهای بعدی ارائه میکنند و به شما این امکان را میدهند تا کارهای پرمصرف منابع را در پسزمینه بدون تأثیر بر تجربه کاربر انجام دهید. با انتقال وظایفی مانند ارسال ایمیل یا پردازش فید به یک صف، میتوانید به درخواستهای کاربر به سرعت پاسخ دهید، در حالی که سرور با سرعت خودش از طریق جاب ها در صف کار میکند.
صفها و جاب ها با هم کار می کنند تا یک سیستم پردازش پس زمینه قوی ایجاد کنند و از اجرای یکپارچه وظایف به صورت ناهمزمان اطمینان حاصل کنند.
صف ها: صف ها اساساً لیست وظایفی هستند که جاب هایی را که نیاز به پردازش دارند نگهداری می کنند. سیستم صف لاراول شما را قادر می سازد تا کارها را به درایورهای صف مختلف مانند Redis
، Beanstalkd
، Amazon SQS
یا حتی دیتابیس فشار دهید. این درایورها جاب ها را در صف را به طور موثر مدیریت می کنند و به برنامه شما اجازه می دهند تا روی پردازش سایر وظایف تمرکز کند.
جاب ها: یک جاب نشان دهنده یک وظیفه یا واحد کاری خاص است که برای اجرای بعدی در صف قرار می گیرد. منطق لازم برای اجرا در پس زمینه را در بر می گیرد. لاراول روشی ساده برای تعریف و ارسال جاب ها ارائه می دهد و مدیریت وظایف پیچیده ناهمزمان را آسان می کند.
مزایای استفاده از صف ها و جاب ها
صف ها و جاب ها (queues and jobs) در هر پروژه ای نیاز است، بیاید به مزایای اصلی آن ها بپردازیم:
بهبود عملکرد برنامه: با واگذاری وظایف وقت گیر به سیستم صف، رشته اصلی برنامه رایگان باقی می ماند و منجر به زمان پاسخگویی سریع تر و تجربه کاربری بهتر می شود.
مقیاس پذیری: صف ها مقیاس پذیری افقی را فعال می کنند زیرا می توان از چندین ورکر برای پردازش جاب های صف استفاده کرد. این به برنامه اجازه می دهد تا بارهای کاری مهم تری را بدون ایجاد افت عملکرد مدیریت کند.
تحمل خطا: سیستم صف لاراول تضمین می کند که حتی اگر یک جاب در طول پردازش با شکست مواجه شود، می توان آن را بعداً دوباره امتحان کرد. جاب ها ناموفق را می توان به راحتی نظارت و پردازش مجدد کرد و احتمال از دست رفتن داده ها را کاهش داد.
کیفیت کد بهتر: از آنجایی که منطق پردازش سنگین به کلاس Job منتقل شده است، کنترلر های شما تمیزتر و خواناتر هستند. شما منطق کنترل Request خود را از پردازشی که باید انجام شود جدا می کنید.
چرا جاب های لاراول ضروری هستند؟
در یک سیستم همزمان، کاربران باید منتظر بمانند تا کار تکمیل شود. این منجر به زمان انتظار طولانی می شود، گاهی اوقات زمانی اتفاق می افتد که وظایف منابع فشرده هستند. در چنین شرایطی جاب های لاراول وارد بازی می شوند.
Laravel jobs عملکردی را برای انجام وظایف در پسزمینه به شما ارائه میکند، بنابراین به شما کمک میکند تا درخواستهای وب را سریع برگردانید.
چه زمانی از جاب های لاراول استفاده کنیم؟
سناریوهایی که جاب های لاراول موثر هستند به شرح زیر است:
1. ارسال ایمیل: در ارسال ایمیل به جاب های کاربر به شما در رسیدگی به درخواست ها کمک می کند. این تضمین می کند که کاربر نیازی به منتظر ماندن طولانی برای دریافت پاسخ ندارد. هنگامی که درخواست را با استفاده از جاب لاراول انجام می دهید، می توانید پاسخ را برای کاربر ارسال کنید در حالی که وظیفه جاب در پس زمینه کار می کند.
2. پردازش داده ها: گاهی اوقات هنگام ذخیره اشکال مختلف داده ها مانند تصویر، اسناد. شما باید آن دادهها را در یک پلتفرم خاص آپلود کنید، اما ذخیره آنها بدون جاب باعث میشود زمان بیشتری را صرف کنید. از این رو جاب های لاراول به شما کمک می کند تا این فرآیندها را در پس زمینه اجرا و مدیریت کنید و به به حداقل رساندن زمان چرخه درخواست-پاسخ کمک می کند.
3.Notifications: اگر سیستمی دارید که اعلان ها را برای کاربر ارسال می کند، می توانید از job برای ارسال آن اعلان ها استفاده کنید. شما می توانید کار اطلاع رسانی را برنامه ریزی کنید، لاراول همچنین تسهیلات برنامه ریزی برای این کار مانند روزانه، هفتگی و غیره را فراهم می کند.
تست معماری در لاراول چگونه است؟
ایجاد جاب ها در صف در لاراول 11
قلب سیستم صف بندی لاراول در کلاس های جابی آن نهفته است. این کلاس ها کدهایی را که باید به صورت ناهمزمان اجرا شوند، محصور می کنند. برای ایجاد یک کلاس جاب، به سادگی اینترفیس Illuminate\Contracts\Queue\ShouldQueue
را extend کنید و یک متد handle
تعریف کنید. این متد حاوی منطق خاصی است که در پسزمینه اجرا میشود.
برای تنظیم یک صف دیتابیس، ابتدا یک مایگرشن برای جدول jobs
ایجاد کنید:
php artisan queue:table
php artisan migrate
سپس، فایل env.
خود را برای استفاده از درایور صف database
به روز کنید:
// Other options
BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database
SESSION_DRIVER=file
SESSION_LIFETIME=120
// Other options
لاراول از درایور های صف مختلف مانند Redis، Amazon SQS و صف های مبتنی بر دیتابیس پشتیبانی می کند. برای مبتدیان، درایور صف دیتابیس نقطه شروع خوبی است زیرا به تنظیم موردی خاص نیاز ندارد. در فایل config/queue.php
، توسعه دهندگان می توانند اتصال و درایور مورد استفاده برای کارهای صف را مشخص کنند.
ایجاد جاب
در لاراول، وظایف در صف به صورت "Jobs" نمایش داده می شوند. می توانید با استفاده از دستور زیر یک کلاس جابی جدید ایجاد کنید:
php artisan make:job SendNewPostNotification
این دستور یک کلاس جاب جدید در دایرکتوری app/Jobs
ایجاد می کند. در این کلاس، وظیفه ای را که می خواهید انجام دهید تعریف می کنید. در اینجا یک جاب که هنگام انتشار یک پست جدید، یک اعلان ایمیل ارسال می کند:
<?php
namespace App\Jobs;
use App\Models\Post;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendNewPostNotification implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $post;
public function __construct(Post $post)
{
$this->post = $post;
}
public function handle()
{
$mailable = new Mailable(...); // Your mailable class with post details
Mail::to('subscribers@example.com')->send($mailable);
}
}
هنگامی که جاب خود را ایجاد کردید، ارسال آن ساده است. شما می توانید یک جاب را از هر جایی در برنامه خود ارسال کنید، مانند یک متد کنترلر زمانی که یک پست جدید ایجاد می شود:
<?php
namespace App\Http\Controllers;
use App\Jobs\SendNewPostNotification;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function store(Request $request)
{
// Other stuff
// Store the blog post...
$post = Post::create($request->all());
// Dispatch the job to send the notification
SendNewPostNotification::dispatch($post);
// Other stuff
}
}
متد ()dispatch
در خود کلاس از trait Dispatchable
می آید. به غیر از متد ()dispatch
معمولی، این trait چند متد دیگر را ارائه می دهد که به شما امکان می دهد یک جاب را با متد های مختلف پردازش کنید:
()dispatchIf
- در صورت صحیح بودن شرط، جاب را با آرگومان های داده شده ارسال کنید.
()dispatchUnless
- جاب را با آرگومان های داده شده ارسال کنید مگر اینکه شرط صدق داده شده قبول شود.
()dispatchSync
- یک فرمان را به کنترلر مناسب آن در فرآیند فعلی ارسال کنید.
()dispatchAfterResponse
- یک فرمان را پس از فرآیند فعلی به کنترلر مناسب خود ارسال کنید.
()withChain
- جاب هایی را تنظیم کنید که در صورت موفقیت آمیز بودن این جاب باید اجرا شوند.
40 تا از مهم ترین الکونت های لاراول
معماری ماژولار در لارول : بررسی تخصصی با مثال
اجرای صف worker
برای پردازش جاب های موجود در صف، باید queue worker را اجرا کنید. می توانید worker را با دستور شروع کنید:
php artisan queue:work
برای محیط های Production، باید یک مانیتور فرآیند را پیکربندی کنید تا اطمینان حاصل شود که کارفرمای صف متوقف نمی شود.
از سوی دیگر، کارها به یک job runner نیاز دارند تا آنها را جدا کند (Supervisor در هنگام استفاده از Laravel محبوبترین است) با دستور زیر می توانید آن را نصب کنید.
sudo apt-get install supervisor
فایل های پیکربندی Supervisor معمولاً در پوشه etc/supervisor/conf.d/
ذخیره می شوند. در این دایرکتوری، میتوانید هر تعداد فایل پیکربندی ایجاد کنید که به Supervisor آموزش میدهد که چگونه فرآیندهای شما باید نظارت شوند. به عنوان مثال، اجازه دهید یک فایل laravel-worker.conf
ایجاد کنیم که شروع می شود و فرآیندهای queue:work
را نظارت می کند:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
stopwaitsecs=3600
در این مثال، دستورالعمل numprocs به Supervisor دستور میدهد که هشت فرآیند queue:work
را اجرا کند و همه آنها را نظارت کند و در صورت شکست، بهطور خودکار آنها را مجدداً راهاندازی کند. شما باید دستور فرمان پیکربندی را تغییر دهید تا اتصال صف مورد نظر و گزینه های ورکر را منعکس کند.
امنیت در داکر: 14تا از بهترین تکنیک هایی که باید بدانید.
چگونه کامیت های بهتری بنویسیم؟
رسیدگی به جاب ها ناموفق
گاهی اوقات جاب ها با شکست مواجه می شوند. لاراول با قرار دادن آنها در جدول jobs_fault
راهی برای رسیدگی به جاب های ناموفق ارائه میکند. برای ایجاد این جدول، دستور زیر را اجرا کنید:
php artisan queue:failed-table
php artisan migrate
سپس می توانید حداکثر تعداد دفعاتی که یک جاب باید قبل از ثبت نام شکست خورده انجام شود را تعیین کنید:
php artisan queue:work --tries=3
کانکشن های صف ها
قبلاً در بخش های قبلی دیدهاید که لاراول با چندین اتصال از پیش پیکربندی شده ارائه میشود و تاکنون از database
استفاده کردهاید. در این بخش، کمی بیشتر در مورد سایر موارد یاد میگیریم و همچنین در صفها عمیقتر خواهیم شد. برای شروع، اجازه دهید به فایل config/queue.php
برگردیم و به تنظیمات اتصال موجود نگاهی بیندازیم.
'connections' => [
'sync' => [
'driver' => 'sync',
],
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 90,
'after_commit' => false,
],
'beanstalkd' => [
'driver' => 'beanstalkd',
'host' => 'localhost',
'queue' => 'default',
'retry_after' => 90,
'block_for' => 0,
'after_commit' => false,
],
'sqs' => [
'driver' => 'sqs',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
'queue' => env('SQS_QUEUE', 'default'),
'suffix' => env('SQS_SUFFIX'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'after_commit' => false,
],
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
'after_commit' => false,
],
],
همانطور که می بینید، آرایه connections
شامل پیکربندی های جداگانه برای صف های مختلف است. این پیکربندیها گزینههای مجزایی دارند، اما گزینههای درایور، صف و after_commit
بیشترین استفاده را دارند.
اغلب توسعه دهندگان در مورد تفاوت بین درایور و نام connection
گیج می شوند. نام connection
می تواند هر چیزی باشد. فقط به این دلیل که یک connection
صف از یک دیتابیس به عنوان انتهای خود استفاده می کند، لازم نیست نام آن را دیتابیس بگذارید. هر چیزی بخواهید می توانید بذارید.
حالا، آیا این بدان معناست که شما فقط به این پنج گزینه درایور محدود شده اید؟ اگر بخواهید از RabbitMQ به عنوان درایور صف استفاده کنید چه؟ در چنین مواردی، لاراول به شما اجازه می دهد از درایورهای صف شخص ثالث استفاده کنید. به عنوان مثال، vyuldashev/laravel-queue-rabbitmq
بسیار محبوب را در نظر بگیرید. این به شما امکان می دهد از RabbitMQ به عنوان درایور صف مانند موارد داخلی استفاده کنید.
نتیجه
صف های لاراول یک ویژگی قدرتمند است که می تواند به طور قابل توجهی پاسخگویی و کارایی برنامه شما را بهبود بخشد. با بارگذاری کارهای وقت گیر در پس زمینه، می توانید اطمینان حاصل کنید که کاربران شما از تجربه ای سریع و بدون وقفه در سایت خود لذت می برند.