Amirali Yaghoutiمهندس ارشد نرم‌افزار

مطالعه موردی مهندسی

هسته بهینه‌سازی Action Scheduler

داشبورد به‌طور تصادفی متوقف می‌شد و هیچ‌کس نمی‌توانست بگوید چرا. علتش ۳۸٬۰۰۰ اکشن پس‌زمینه‌ی صف‌شده بود که در طول درخواست‌های عادی وب کار می‌شدند، پس کارکنانی که فروشگاه را می‌گرداندند سر همان worker‌های PHP با صف رقابت می‌کردند.

مسئله تجاری

جاب‌های معلق در Action Scheduler روی فروشگاه ووکامرس ما به حدود ۳۸٬۰۰۰ رسیده بود. اجراکننده‌های صف در طول درخواست‌های وب معمولی شلیک می‌شدند، آنالیتیکس WC Admin مدام ایمپورت‌هایی زمان‌بندی می‌کرد که هیچ‌کس نمی‌خواندشان، و کارکنان این را به شکل داشبوردی حس می‌کردند که تصادفی گیر می‌کند. کار پس‌زمینه با آدم‌هایی که واقعاً فروشگاه را می‌گرداندند رقابت می‌کرد.

آنچه تحویل دادم

  • یک فایل یکپارچه‌ی واحد، mu-admin-as-core.php، که جایگزین تنظیمات Action Scheduler و سرعت ادمین شد که در پیکربندی‌های قدیمی‌تر پراکنده بودند.
  • محدودیت‌های اجراکننده‌ی صف از طریق فیلترهای هسته: اندازه‌ی دسته ۱۰، یک دسته‌ی هم‌زمان، محدودیت زمانی ۲۰ ثانیه و دوره‌ی نگهداری ۷ روزه برای اکشن‌های تمام‌شده.
  • خاموش‌کردن اجراکننده‌ی درخواست ناهم‌زمان، و غیرفعال‌کردن اجراکننده‌ی صف مبتنی بر درخواست وب هر وقت DISABLE_WP_CRON تنظیم شده باشد، تا جاب‌ها فقط از کرون سرور اجرا شوند.
  • یک پاک‌سازی روزانه که اکشن‌های باقی‌مانده‌ی WC Admin مثل wc_admin_daily و wc_admin_import_orders را از زمان‌بندی خارج می‌کند.
  • تسکین سمت ادمین: heartbeat به ۶۰ ثانیه محدود شد و بیرون از ویرایشگر از ثبت خارج شد، فهرست محصول و سفارش به ۲۰ ردیف محدود شد، و ستون‌های سنگین تاکسونومی از فهرست محصولات حذف شدند.

رویکرد فنی

  • همه‌چیز از فیلترهای مستند مثل action_scheduler_queue_runner_batch_size و action_scheduler_retention_period می‌گذرد، بدون هیچ کد وصله‌خورده‌ی هسته یا افزونه.
  • فیلتر woocommerce_admin_disabled مجموعه‌ی آنالیتیکس React را خاموش می‌کند، که تولیدکننده‌ی اصلی کار زمان‌بندی‌شده‌ای بود که هیچ‌وقت استفاده نمی‌کردیم.
  • پاس خارج‌کردن از زمان‌بندی با یک site transient محدود شده تا حداکثر روزی یک بار اجرا شود نه در هر درخواست.
  • اعداد تنظیم به‌عنوان ثابت‌های کلاس در بالای کلاس زندگی می‌کنند، پس تنظیم یک محدودیت یک تغییر تک‌خطی است که از گیت عبور می‌کند.

نتیجه و شواهد

صف معلق پس از جاافتادن تنظیمات و پاک‌سازی از حدود ۳۸٬۰۰۰ اکشن به ۴٬۹۰۰ افت کرد، یعنی ۸۷ درصد کاهش، و در همان سطح مانده. صفحات ادمین دیگر پشت دسته‌های پس‌زمینه منتظر نمی‌مانند.

اهمیت برای کارفرما

یک پشت‌صحنه که سریع پاسخ می‌دهد یک تیم آنلاین دوازده‌نفره را روی کار واقعی نگه می‌دارد به‌جای تماشای اسپینر، و همین این فایل کوچک را به یکی از پربازده‌ترین تغییرات پلتفرم تبدیل می‌کند.

خلاصه-اجرایی-پروژه

خلاصه اجرایی خوانا

خلاصه_اجرایی {
  پروژه: "Action Scheduler Core"
  فایل: "mu-plugins/mu-admin-as-core.php (یک فایل یکپارچه)"
  قبل: "حدود ۳۸٬۰۰۰ اکشن معلق"
  بعد: "حدود ۴٬۹۰۰ و پایدار (۸۷٪ کاهش)"
  محدودیت_صف: "اندازه‌ی دسته ۱۰، ۱ دسته‌ی هم‌زمان،
                محدودیت ۲۰ ثانیه، نگهداری ۷ روز"
  اجراکننده‌ها: "درخواست ناهم‌زمان خاموش؛ اجراکننده‌ی وب
                 وقتی DISABLE_WP_CRON تنظیم است غیرفعال"
  اجرا: "فقط کرون سرور، هرگز داخل یک درخواست صفحه"
  پاک‌سازی: "خارج‌کردن روزانه‌ی اکشن‌های باقی‌مانده‌ی WC Admin"
}

ارزش حرفه‌ای این پروژه

اصلاح، پیکربندی بود نه کد: اندازه‌ی دسته، هم‌زمانی، محدودیت زمانی، نگهداری، و بردن اجرا به کرون سرور. دانستن اینکه کدام فیلترها را باید تنظیم کرد کل کار است.

یکپارچه‌کردن تنظیمات پراکنده در یک فایل خوانا به‌اندازه‌ی خود مقادیر اهمیت داشت. تنظیمات کارایی که در چهار جا پخش شده‌اند تنظیماتی هستند که هیچ‌کس بعداً جرئت نمی‌کند تغییرشان دهد.