محمدتقی نقیبی
محمدتقی نقیبی
خواندن ۲ دقیقه·۲ سال پیش

چجوری حین استقرار یک پایان خوش برای وُرکرها رقم بزنیم

فرض این مقاله اینه که شما با لاراول و هورایزن آشنا هستین. یکی از قابلیت های خوبی که هورایزن میده اینه که به راحتی میشه بدون اینکه چیزی از دست بره خاموشش کرد (php artisan horizon:terminate) یعنی اگر کاری توسط ورکرها در حال پروسس باشه منتظر میمونه تا کارشون تموم شه و بعد خاموش میشه که به اصطلاح gracefully shutdown میگن بهش. اینجا Mohamed Said یه مقاله کوتاه راجع به تنظیم پارامترهایی که برای بهتر انجام شدن gracefully shutdown لازم هست نوشته.

حالا فرض کنید ورکرهای شما که کار پروسس جاب ها رو برعهده دارن روی پادهای کوبرنتیز مستقر شده باشن. پادها روی کوبرنتیز قابل جابجا شدن یا به اصطلاح ephemeral هستن بدین معنی که هر زمان مثلا حین انتشار نسخه ی جدید پاد میتونه خاموش بشه و جاش رو به یه پاد دیگه بده. این یه ویژگی خوب برای کوبرنتیز هستش ولی چجوری باید از خاموش شدن پادها ( زمانیکه در حال اجرای یکسری پروسس هستن) جلوگیری کنیم.
کوبرنتیز برای این کار یکسری هوک برای Lifecycleش در نظر گرفته (postStart و preStop ) که با اونها میشه خاموش شدن پاد رو به تاخیر انداخت. زمانیکه به هر شکلی پاد kill بشه از حالت Running به حالت Terminating تغییر وضعیت میده و در همون لحظه سیگنال SIGTERM برای تمام کانتینرهای داخل پاد ارسال میشه که ما میتونیم داخل کانتینرهامون این سیگنال رو دریافت کنیم و عمل مناسب رو قبل خاموش شدن انجام بدیم.

پادی که در وضعیت Terminating هست دقیقا مثل قبل کارش را ادامه میده یعنی از همون منابعی که بهش اختصاص داده شده استفاده می کنه اما درخواست های جدید از طرف کوبرنتیز برای اون ارسال نمیشه. یک پاد تا ابد نمی تونه در وضعیت Terminating باقی بمونه به همین دلیل یک پارامتر تحت عنوان terminationGracePeriodSeconds وجود داره که بصورت پیشفرض برابر با 30 ثانیه است و پاد نهایتا تا این زمان می تونه در وضعیت Terminating باقی بمونه. البته لازم به ذکر هست که هر زمان که کانتینرها کارشون تموم شه قبل از رسیدن به این زمان؛ پاد از وضعیت Terminating در میاد و حذف میشه.
حالا که با امکاناتی که کوبرنتیز برای gracefully shutdown در اختیار ما گذاشته آشنا شدیم برمی گردیم سر مسئله خودمون یعنی نحوه ی خاموش کردن هورایزن زمانی که روی پاد اجرا می شه. احتمالا الان حدس زده باشین که برای این کار کافیه یه زمان مناسب مثلا یخورده بیشتر از اندازه ی اجرای طولانی ترین جابی که داریم رو برای terminationGracePeriodSeconds در نظر بگیریم و برای هوک preStop هم اجرای دستور php artisan horizon:terminate کفایت میکنه.

به شکل نمونه دیپلویمنتی مثلا به شکل زیر خواهیم داشت:

در این مقاله بیشتر سعی شد که سرنخ هایی به شما داده بشه که اگر راجع به gracefully shutdown مساله ای دارین راحت تر بتونید دنبال چیزی که میخواین بگردین در ادامه شما رو به خوندن این مقاله دعوت میکنم.

امیدوارم براتون مفید بوده باشه

پیروز باشید...

laravelk8sلاراول
بدون تلاش هیچی به دست نمیاد و همیشه خاطرم میمونه برای بدست آوردن چیزی که نیاز به زمان داره باید صبر کنم.
شاید از این پست‌ها خوشتان بیاید