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

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

سپر REST A2

A2 REST Shield یک افزونه‌ی must-use کوچک است که برای فروشگاه ووکامرسمان نوشتم. پروفایلینگ نشان داد هر درخواست REST ناشناس، هزینه‌ی سنگین بالاآمدن المنتور را هم می‌دهد. این افزونه در فراخوان‌های REST مهمان، کوئری‌های قالب را از وسط قطع می‌کند و چند اندپوینت گران را کش می‌کند.

مسئله تجاری

پروفایلینگ نشان داد هر بازدید مهمان روی /wp-json/ المنتور را بالا می‌آورد و کوئری‌های elementor_library را می‌زند، در حالی که پاسخ هیچ‌وقت از آن‌ها استفاده نمی‌کند. خزنده‌ها و یکپارچه‌سازی‌ها این مسیرها را شبانه‌روز گرم نگه می‌داشتند، پس این کوئری‌های بی‌مصرف به بار واقعی روی دیتابیس تبدیل می‌شد. گیر کار اینجا بود: مسیرهای wcpe برای ثبت‌شدن واقعاً به جست‌وجوی قالب المنتور نیاز دارند، پس یک بستن یکسره آن‌ها را می‌شکست.

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

  • یک فیلتر posts_pre_query مخصوص مهمان: در درخواست‌های REST، کوئری elementor_library نتیجه‌ی خالی می‌گیرد و اصلاً به دیتابیس نمی‌رسد.
  • یک معافیت صریح برای مسیرهای /wcpe/ تا ثبتشان همچنان کار کند.
  • کش ترنزینت برای یک فهرست کوتاه از اندپوینت‌ها: types و taxonomies و oembed به‌مدت ۳۰ دقیقه، محصولات wcpe به‌مدت ۱۸۰ ثانیه.
  • یک هدر پاسخ X-A2-REST-CACHE با مقادیر HIT و MISS-STORED و MISS-NOSTORE، تا رفتار کش را مستقیم با curl بشود تأیید کرد.

رویکرد فنی

  • به‌جای کش صفحه، روی rest_pre_dispatch و rest_post_dispatch هوک زدم؛ کش داخل چرخه‌ی خود REST می‌ماند و فقط پاسخ‌های ۲۰۰ ذخیره می‌شود.
  • کلید کش از مسیر و متد و پارامترهای مرتب‌شده‌ی کوئری ساخته می‌شود، تا ترتیب پارامترها کش را تکه‌تکه نکند.
  • هر مسیر کد پشت is_user_logged_in() و is_admin() محافظت شده؛ ترافیک کاربر واردشده و ادمین دست‌نخورده رد می‌شود.
  • مقدار TTL مربوط به wcpe از فیلتر a2_wcpe_rest_cache_ttl بیرون داده شده، تا بدون دست‌زدن به افزونه تنظیم شود.

نتیجه و شواهد

p95 این مسیرهای REST از ۲٫۸ ثانیه به ۰٫۹ ثانیه رسید. کل سپر یک فایل MU است، a2-rest-shield.php، الان روی نسخه‌ی ۰٫۱٫۲ و در پروداکشن. هدر کش هم کار بررسی سلامت سریع را می‌کند.

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

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

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

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

خلاصه_اجرایی {
  پروژه: "A2 REST Shield"
  پشته: "افزونه‌ی MU وردپرس، PHP، ووکامرس"
  فایل: "mu-plugins/a2-rest-shield.php (v0.1.2)"
  هوک‌ها: "posts_pre_query، rest_pre_dispatch، rest_post_dispatch"
  دامنه: "فقط REST مهمان؛ مسیرهای wcpe و ترافیک ادمین معاف"
  کش: "types/taxonomies/oembed ۳۰دقیقه، محصولات wcpe ۱۸۰ثانیه"
  هدر: "X-A2-REST-CACHE: HIT | MISS-STORED | MISS-NOSTORE"
  نتیجه: "p95 REST از ۲٫۸ ثانیه به ۰٫۹ ثانیه، در پروداکشن"
}

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

چیزی که دوست دارم به آن نگاه شود، هدر X-A2-REST-CACHE است. کشی که از بیرون قابل بررسی نباشد، روز خرابی فقط جای حدس‌زدن باقی می‌گذارد.

معافیت صریح wcpe هم نشان می‌دهد بهینه‌سازی باید بداند کجا نباید دست بزند. سریع‌کردن همه‌چیز، همان راهی است که یکپارچه‌سازی‌ها را می‌شکند.