- پلتفرم: Laracasts
- مدرس: Mohamed Said
- مدت: ۰۱:۴۱:۰۰
- تاریخ انتشار: ۷ ژوئن ۲۰۲۱
- لینک دوره: https://laracasts.com/series/laravel-queue-mastery
این فایل، نکات مهم دوره رو خلاصه میکند. اگر فرصت داری، دیدن خود دوره خیلی مفیدتر است.
- من معمولاً نکات کلیدی دورههای مفید را خلاصه میکنم تا هم برای یادگیری اولیه و هم مرور سریع بهدرد بخورند.
- برای اینکه در هر بخش عمیقتر بشوی، کافی است روی لینکهای «Ask AI» کلیک کنی.
Teach Me: 5 Years Old | Beginner | Intermediate | Advanced | (reset auto redirect)
Learn Differently: Analogy | Storytelling | Cheatsheet | Mindmap | Flashcards | Practical Projects | Code Examples | Common Mistakes
Check Understanding: Generate Quiz | Interview Me | Refactor Challenge | Assessment Rubric | Next Steps
- خلاصه: این بخش توضیح میدهد چطور کارهای زمانبر را بهصورت async با Queue انجام بدهی. یاد میگیری یک Job بسازی، آن را Dispatch کنی، Driver دیتابیس برای Queue تنظیم کنی و Worker را برای پردازش Jobها در پسزمینه بالا بیاوری تا پاسخ HTTP سریع به کاربر برگردد.
- مثال: فرض کن میخواهی یک ایمیل خوشآمدگویی بفرستی که چند ثانیه طول میکشد؛ یک Job به اسم
SendWelcomeEmailبا دستورphp artisan make:job SendWelcomeEmailبساز، داخل متدhandleمثلاًsleep(3)بگذار تا کار سنگین را شبیهسازی کند، بعد باdispatch(new SendWelcomeEmail())آن را Dispatch کن و با اجرایphp artisan queue:workکاری کن که در پسزمینه پردازش شود، بدون اینکه پاسخ HTTP معطل بماند. - لینک برای جزئیات بیشتر: از AI بپرس: Dispatching and Running Jobs
- خلاصه: این بخش دربارهٔ تنظیم رفتار Jobهاست؛ مثلاً Delay دادن قبل از اجرا، تعیین Timeout برای جلوگیری از گیرکردن Job، تنظیم تعداد Retry در صورت Failure و استفاده از Backoff برای فاصلهگذاری هوشمند بین Retryها.
- مثال: اگر Jobی داری که احتمالاً گیر میکند، میتوانی
public $timeout = 1;روی کلاس Job ست کنی و درhandleازsleep(3)استفاده کنی. وقتی Job را Dispatch کنی، Worker بعد از ۱ ثانیه آن را Terminate میکند و Job بهعنوان Failed علامت میخورد؛ این نشان میدهد Timeout چطور سیستم را محافظت میکند. - لینک برای جزئیات بیشتر: از AI بپرس: Configuring Jobs
- خلاصه: این بخش روی مدیریت Failureها تمرکز دارد؛ از جمله Retry خودکار همراه با Backoff، برگرداندن دستی Job به Queue، تفاوت Release شدن Job با Failure ناشی از Exception و نوشتن کد دلخواه وقتی Job در نهایت Fail میشود.
- مثال: در متد
handleیک Exception پرتاب کن و روی Job مقادیرpublic $tries = 3;وpublic $backoff = 2;بگذار. Worker این Job را ۳ بار Retry میکند و بین هر تلاش ۲ ثانیه صبر میکند. اگر همچنان Fail شود، متدfailedاجرا میشود و میتوانی آنجا خطا را Log یا هندل کنی. - لینک برای جزئیات بیشتر: از AI بپرس: Handling Attempts Failures
-
خلاصه: این بخش دربارهٔ گروهبندی Jobها در قالب Workflow است؛ Chain برای اجراهای ترتیبی (که در صورت Fail شدن یکی، بقیه متوقف میشوند) و Batch برای اجرای موازی، همراه با امکاناتی برای هندل شکستها و Track کردن وضعیت در دیتابیس.
-
مثال: برای یک پروسهٔ Deployment میتوانی از این ساختار استفاده کنی:
Bus::chain([ new PullRepo(), new RunTests(), new Deploy(), ])->dispatch();
اگر تستها Fail شوند، مرحلهٔ Deploy اجرا نمیشود و این باعث میشود فرایند روی خطا متوقف شود.
-
لینک برای جزئیات بیشتر: از AI بپرس: Dispatching Workflows
-
خلاصه: روی مباحث قبلی سوار میشود و نشان میدهد چطور Callbackهای مخصوص Failure (
catch)، موفقیت (then) و تکمیل (finally) را روی Chain و Batchها تنظیم کنی، و همینطور چطور Chainها را داخل Batch یا برعکس، تو در تو کنی. -
مثال: یک Batch با دو Chain Dispatch کن:
Bus::batch([ [new PullRepoProject1(), new RunTestsProject1()], [new PullRepoProject2(), new RunTestsProject2()], ])->dispatch();
هر پروژه بهصورت موازی پردازش میشود، اما مراحل داخل هر پروژه بهصورت ترتیبی اجرا میشوند.
-
لینک برای جزئیات بیشتر: از AI بپرس: More Complex Workflows
-
خلاصه: این بخش دربارهٔ جلوگیری از Race Conditionها است؛ با استفاده از Atomic Lock، Redis Funnel برای محدود کردن Concurrency، Throttle برای Rate Limiting و Middlewareهایی مثل
WithoutOverlappingبرای جلوگیری از اجرای همزمان Jobهای مشابه. -
مثال: در یک Job مربوط به Deployment میتوانی از Lock استفاده کنی:
Cache::lock('deployments')->block(10, function () { // deployment code });
اگر Worker دیگری همزمان بخواهد Deploy انجام بدهد، مجبور است منتظر بماند یا Fail شود و اینطوری از Conflict روی فایلها جلوگیری میشود.
-
لینک برای جزئیات بیشتر: از AI بپرس: Controlling and Limiting Jobs
- خلاصه: در این بخش با مفهوم Unique بودن Jobها برای جلوگیری از Jobهای تکراری در Queue آشنا میشوی، همینطور Circuit Breaker با Middleware مثل
ThrottlesExceptionsبرای Pause کردن در صورت تکرار خطاها و اینکه چه زمانی Lock مربوط به Unique بودن آزاد شود. - مثال: اگر روی کلاس Job از Interface
ShouldBeUniqueاستفاده کنی، هرچقدر هم که آن را Dispatch کنی، فقط یک نمونه در Queue قرار میگیرد؛ این برای کارهایی مثل Sync کردن دیتا عالی است که نسخههای تکراری فقط منابع را هدر میدهند. - لینک برای جزئیات بیشتر: از AI بپرس: More Job Configurations
- خلاصه: چند نکته برای طراحی Jobهای مقاوم و Reliable: Dispatch کردن Job بعد از Commit شدن تراکنش دیتابیس، نگه داشتن Job بهصورت Self-contained و بدون وابستگی به State بیرونی، کم کردن Dependencyها و Encrypt کردن دادههای حساس داخل Payload.
- مثال: وقتی داخل یک Transaction دیتابیس هستی، میتوانی Job را با
->afterCommit()Dispatch کنی؛ در این حالت Job فقط وقتی وارد Queue میشود که Transaction با موفقیت Commit شده باشد، و این از سناریوهایی مثل ارسال ایمیل برای کاربری که در نهایت در دیتابیس ذخیره نشده جلوگیری میکند. - لینک برای جزئیات بیشتر: از AI بپرس: Designing Reliable Jobs
-
خلاصه: در این بخش با مدیریت Workerها هنگام Deployment آشنا میشوی؛ مثلاً استفاده از Supervisor برای Monitoring، دستور
queue:restartبرای بارگذاری مجدد کد و استفاده از امکانات Supervisor برای خاموش کردن آرام Workerها تا Jobهای در حال اجرا نشکنند. -
مثال: میتوانی در اسکریپت Deployment این دستور را اضافه کنی:
php artisan queue:restart
بعد از Deploy نسخهٔ جدید، Workerها بهصورت Graceful خارج میشوند و دوباره با کدهای جدید بالا میآیند و این باعث میشود همهچیز Consistent بماند.
-
لینک برای جزئیات بیشتر: از AI بپرس: Deployments
-
خلاصه: این بخش توضیح میدهد چطور Workerها را پویا Scale کنی؛ با Cron برای اجرای دورهای Workerهای اضافی، Supervisor برای Pool ثابت از Workerها و Horizon برای Auto-balancing بر اساس تعداد Jobهای Queue و زمان پردازش.
-
مثال: یک Cron Job تنظیم کن که هر ۱۰ دقیقه این دستور را اجرا کند:
php artisan queue:work --stop-when-empty --max-time=540
این دستور یک Worker راه میاندازد که اگر Queue خالی باشد یا بعد از ۹ دقیقه، خودش را متوقف میکند. این کار باعث میشود متناسب با Load سیستم، Workerها بالا بیایند بدون اینکه سرور تحت فشار شدید قرار بگیرد.
-
لینک برای جزئیات بیشتر: از AI بپرس: Scaling Workers
- خلاصه: در این قسمت یک مرور جامع روی گزینههای
queue:work(مثل Timeout، مقدار Sleep، محدودیت Memory) و Propertyهای Job (مثل Connection، Retry، Unique بودن و غیره) انجام میشود تا بتوانی تنظیمات Queue را دقیقتر Fine-tune کنی. - مثال: استفاده از
--sleep=1در دستورqueue:workباعث میشود Worker با فاصلهٔ ۱ ثانیهای برای Job جدید چک کند؛ این کار Latency را کم میکند اما مصرف CPU را بالا میبرد، و برای Queueهای با Priority بالا مناسب است. - لینک برای جزئیات بیشتر: از AI بپرس: Configurations Reference
- خلاصه: این بخش نگاهی به درون هستهٔ Queueهای Laravel دارد؛ اینکه Dispatch چطور Job را Serialize میکند، Workerها چطور آن را با Timeout و Eventهای مختلف پردازش میکنند و مسیر Job از لحظهٔ Dispatch تا اجرای
handleدقیقاً چطور است. - مثال: Helper مربوط به
dispatchاز Traitای به نامDispatchableاستفاده میکند تا یک Pending Dispatch بسازد، Job و دادههایش را برای ذخیره در Queue Serialize کند و بعد Worker آن را Unserialize کرده و از طریقCallQueuedHandlerاجرا میکند. - لینک برای جزئیات بیشتر: از AI بپرس: Under the Hood
برای مشاهدهٔ دورهٔ کامل میتوانی به این لینک سر بزنی: https://laracasts.com/series/laravel-queue-mastery
من Ali Sol هستم؛ Backend Developer.
- وبسایت: alisol.ir
- لینکدین: linkedin.com/in/alisolphp