کشکردن یه سایت پرترافیک و داینامیک روی Edge
خلاصهٔ کاملتر
Eric Barnes، سازندهٔ Laravel News، تعریف میکنه که چطور با کمک Jason McCreary (JMac) و دورهٔ Fast Laravel، خودِ سایت Laravel News رو بهعنوان یه نمونهٔ عملی روی Edge با Cloudflare کش کردن. نکتهٔ اصلی اینه که خیلیها فکر میکنن یه سایت پرترافیک که محتواش مدام عوض میشه رو نمیشه کش کرد، ولی این تجربه نشون میده که میشه.
به گفتهٔ نویسنده، Jason یه روش سیستماتیک داشت: از روی ترافیک درخواستها پربازدیدترین صفحهها رو پیدا میکنی و اول همونها رو کش میکنی. برای این سایت این شد حدود پنج صفحه: صفحهٔ اصلی، صفحهٔ بلاگ، صفحهٔ جزئیات مقاله، و دو صفحهٔ لینکهای کامیونیتی.
سهتا چالش اصلی داشتن. اول اینکه تقریباً همهچی با Livewire ساخته شده بود درحالیکه فقط فرم خبرنامه واقعاً به واکنشگرایی Livewire نیاز داشت؛ بقیه رو به Blade سادهٔ معمولی برگردوندن. دوم، بخشهای داینامیک مثل نوتیفیکیشن، خبرنامه و اسلات چرخشی اسپانسرها رو با Alpine AJAX بعد از لود صفحه جدا لود میکنن تا فریز نشن.
سومین چالش دوتا لایهٔ کش بود که با هم رقابت میکردن: Laravel Cloud خودش Edge Caching داره و زیرِ کاپوتش از Cloudflare استفاده میکنه، ولی چون تیم مستقیم هم روی Cloudflare بود، معلوم نبود کدوم سیاست اعمال میشه. نویسنده میگه در نهایت سادهتر بود که قواعد Laravel Cloud رو دور بزنن و مستقیم از Cloudflare خودشون استفاده کنن.
برای پاککردن کش موقع تغییر محتوا، بیشترش رو با Model Eventهای لاراول انجام میدن؛ مثلاً وقتی مقالهای آپدیت میشه، همون مقاله بهعلاوهٔ صفحهٔ اصلی و بلاگ پاک میشن. مورد سختش مقالههای زمانبندیشده بود که چون رویدادی موقع انتشار فایر نمیشه، پاککردن کش رو سوار همون دستوری کردن که پستها رو تو شبکههای اجتماعی به اشتراک میذاره.
به گفتهٔ Jason هیچکدوم از اینها مخصوص Laravel Cloud نیست و روی هر سروری که Cloudflare جلوش باشه کار میکنه؛ خودش Laravel Shift رو روی یه سرور ۵ دلاری با روزی حدود ۵۰٬۰۰۰ درخواست و پاسخدهی حدود ۲۰ میلیثانیه از Edge اجرا میکنه. برای Laravel News هم نرخ کش از حدود دهدرصد به اوجهای نزدیک ۷۰٪ رسید. تنها استثنا فعلاً Livewireئه که بهخاطر وابستگی به session هنوز خوب کش نمیشه.
نکات کلیدی:
- حتی سایتهای پرترافیک و داینامیک رو هم میشه روی Edge کش کرد
- اول پربازدیدترین صفحهها رو کش کن، بعد برو سراغ بقیه
- Livewire رو فقط جایی نگه دار که واقعاً به واکنشگرایی نیاز داره
- بخشهای داینامیک رو با Alpine AJAX بعد از لود صفحه جدا بیار
- پاککردن کش رو به Model Eventها و دستور انتشار زمانبندیشده وصل کن




