ذخیره سازی توسط کارگر سرویس و ذخیره سازی HTTP

مزایا و معایب استفاده از منطق انقضای سازگار یا متفاوت در لایه‌های حافظه پنهان سرویس‌دهنده و حافظه پنهان HTTP.

جاناتان چن
Jonathan Chen

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

  • موارد استفاده و تفاوت‌های بین ذخیره‌سازی سرویس‌دهنده و ذخیره‌سازی HTTP.
  • مزایا و معایب استراتژی‌های مختلف انقضای حافظه پنهان سرویس‌دهنده در مقایسه با استراتژی‌های ذخیره‌سازی HTTP معمولی.

مروری بر جریان ذخیره‌سازی

در سطح بالا، یک مرورگر هنگام درخواست منبع، ترتیب ذخیره‌سازی زیر را دنبال می‌کند:

  1. حافظه پنهان سرویس ورکر : سرویس ورکر بررسی می‌کند که آیا منبع در حافظه پنهان آن وجود دارد یا خیر و بر اساس استراتژی‌های ذخیره‌سازی برنامه‌ریزی‌شده خود تصمیم می‌گیرد که آیا خود منبع را برگرداند یا خیر. توجه داشته باشید که این اتفاق به طور خودکار رخ نمی‌دهد. شما باید یک کنترل‌کننده رویداد واکشی (fetch event handler) در سرویس ورکر خود ایجاد کنید و درخواست‌های شبکه را رهگیری کنید تا درخواست‌ها از حافظه پنهان سرویس ورکر به جای شبکه ارائه شوند.
  2. حافظه پنهان HTTP (همچنین به عنوان حافظه پنهان مرورگر شناخته می‌شود) : اگر منبع در حافظه پنهان HTTP یافت شود و هنوز منقضی نشده باشد، مرورگر به طور خودکار از منبع موجود در حافظه پنهان HTTP استفاده می‌کند.
  3. سمت سرور: اگر چیزی در حافظه پنهان سرویس‌دهنده یا حافظه پنهان HTTP یافت نشود، مرورگر برای درخواست منبع به شبکه می‌رود. اگر منبع در CDN ذخیره نشده باشد، درخواست باید به سرور مبدا برگردد.

تصویر کلی جریان ذخیره‌سازی در حافظه پنهان.

لایه‌های ذخیره‌سازی

ذخیره سازی سرویس ورکر

یک سرویس ورکر درخواست‌های HTTP از نوع شبکه را رهگیری می‌کند و از یک استراتژی ذخیره‌سازی برای تعیین اینکه چه منابعی باید به مرورگر بازگردانده شوند، استفاده می‌کند. حافظه پنهان سرویس ورکر و حافظه پنهان HTTP هدف کلی یکسانی را دنبال می‌کنند، اما حافظه پنهان سرویس ورکر قابلیت‌های ذخیره‌سازی بیشتری مانند کنترل دقیق بر روی آنچه که دقیقاً ذخیره‌سازی می‌شود و نحوه انجام ذخیره‌سازی را ارائه می‌دهد.

کنترل حافظه پنهان سرویس ورکر

یک سرویس ورکر درخواست‌های HTTP را با استفاده از شنونده‌های رویداد (معمولاً رویداد fetch ) رهگیری می‌کند. این قطعه کد منطق استراتژی ذخیره‌سازی Cache-First را نشان می‌دهد.

نموداری که نشان می‌دهد چگونه سرویس ورکرها درخواست‌های HTTP را رهگیری می‌کنند.

اکیداً توصیه می‌شود از Workbox استفاده کنید تا از اختراع مجدد چرخ جلوگیری شود. برای مثال، می‌توانید مسیرهای URL منابع را با یک خط کد عبارت منظم ثبت کنید .

import {registerRoute} from 'workbox-routing';

registerRoute(new RegExp('styles/.*\\.css'), callbackHandler);

استراتژی‌ها و موارد استفاده از ذخیره‌سازی سرویس ورکرها

جدول بعدی، استراتژی‌های رایج ذخیره‌سازی در سرویس ورکر و زمان مفید بودن هر استراتژی را شرح می‌دهد.

استراتژی‌ها منطق تازگی موارد استفاده
فقط شبکه محتوا باید همیشه به‌روز باشد.
  • پرداخت‌ها و تسویه حساب‌ها
  • صورت‌های مالی
شبکه‌ای که به حافظه پنهان برمی‌گردد ترجیحاً محتوای جدید ارائه شود. با این حال اگر شبکه از کار بیفتد یا ناپایدار باشد، ارائه محتوای کمی قدیمی قابل قبول است.
  • داده‌های به‌موقع
  • قیمت‌ها و نرخ‌ها (نیاز به سلب مسئولیت دارد)
  • وضعیت‌های سفارش
اعتبارسنجی مجدد در حین بی‌اعتبارسازی ارائه محتوای ذخیره شده در حافظه موقت (cache) بلافاصله اشکالی ندارد، اما محتوای ذخیره شده به‌روزرسانی شده باید در آینده مورد استفاده قرار گیرد.
  • فیدهای خبری
  • صفحات فهرست محصولات
  • پیام‌ها
ابتدا حافظه پنهان، سپس به شبکه برگردید این محتوا غیر بحرانی است و می‌تواند برای افزایش عملکرد از حافظه پنهان (cache) ارائه شود، اما سرویس ورکر باید گاهی اوقات به‌روزرسانی‌ها را بررسی کند.
  • پوسته‌های برنامه
  • منابع مشترک
فقط حافظه پنهان محتوا به ندرت تغییر می‌کند.
  • محتوای استاتیک

مزایای دیگر ذخیره‌سازی سرویس ورکر

علاوه بر کنترل دقیق منطق ذخیره‌سازی، ذخیره‌سازی سرویس ورکر موارد زیر را نیز فراهم می‌کند:

  • حافظه و فضای ذخیره‌سازی بیشتر برای مبدا شما: مرورگر منابع کش HTTP را بر اساس هر مبدا اختصاص می‌دهد. به عبارت دیگر، اگر چندین زیردامنه داشته باشید، همه آنها از یک کش HTTP مشترک استفاده می‌کنند. هیچ تضمینی وجود ندارد که محتوای مبدا/دامنه شما برای مدت طولانی در کش HTTP باقی بماند. به عنوان مثال، یک کاربر ممکن است با پاک کردن دستی از رابط کاربری تنظیمات مرورگر یا راه‌اندازی بارگذاری مجدد سخت در یک صفحه، کش را پاک کند. با یک کش سرویس ورکر، احتمال بسیار بیشتری وجود دارد که محتوای کش شده شما کش بماند. برای کسب اطلاعات بیشتر به ذخیره‌سازی پایدار مراجعه کنید.
  • انعطاف‌پذیری بیشتر با شبکه‌های ناپایدار یا تجربیات آفلاین: با حافظه پنهان HTTP شما فقط یک انتخاب دوتایی دارید: یا منبع ذخیره شود یا خیر. با حافظه پنهان سرویس‌دهنده، می‌توانید «مشکلات» کوچک را بسیار آسان‌تر کاهش دهید (با استراتژی «stale-while-revalidate»)، یک تجربه آفلاین کامل (با استراتژی «cache only») یا حتی چیزی بین این دو، مانند رابط‌های کاربری سفارشی با بخش‌هایی از صفحه که از حافظه پنهان سرویس‌دهنده می‌آیند و برخی از قسمت‌ها که در صورت لزوم حذف می‌شوند (با استراتژی «Set catch handler»).

ذخیره سازی HTTP

اولین باری که یک مرورگر یک صفحه وب و منابع مرتبط را بارگذاری می‌کند، این منابع را در حافظه پنهان HTTP خود ذخیره می‌کند. حافظه پنهان HTTP معمولاً به طور خودکار توسط مرورگرها فعال می‌شود، مگر اینکه کاربر نهایی آن را به صراحت غیرفعال کرده باشد.

استفاده از HTTP caching به معنای تکیه بر سرور برای تعیین زمان و مدت زمان ذخیره سازی یک منبع است.

کنترل انقضای کش HTTP با هدرهای پاسخ HTTP

وقتی یک سرور به درخواست مرورگر برای یک منبع پاسخ می‌دهد، از هدرهای پاسخ HTTP برای اطلاع دادن به مرورگر استفاده می‌کند که چه مدت باید منبع را در حافظه پنهان (cache) نگه دارد. برای اطلاعات بیشتر به بخش هدرهای پاسخ: پیکربندی وب سرور خود مراجعه کنید.

استراتژی‌ها و موارد استفاده از ذخیره‌سازی HTTP

ذخیره سازی HTTP بسیار ساده تر از ذخیره سازی سرویس دهنده است، زیرا ذخیره سازی HTTP فقط با منطق انقضای منابع مبتنی بر زمان (TTL) سروکار دارد. برای کسب اطلاعات بیشتر در مورد استراتژی های ذخیره سازی HTTP، به کدام مقادیر هدر پاسخ باید استفاده کنید؟ و جلوگیری از درخواست های غیرضروری شبکه با حافظه پنهان HTTP (خلاصه) مراجعه کنید.

طراحی منطق انقضای حافظه پنهان

این بخش مزایا و معایب استفاده از منطق انقضای سازگار در لایه‌های حافظه پنهان سرویس‌دهنده و حافظه پنهان HTTP، و همچنین مزایا و معایب منطق انقضای جداگانه در این لایه‌ها را توضیح می‌دهد.

منطق انقضای سازگار برای همه لایه‌های حافظه پنهان

برای نشان دادن مزایا و معایب، به سه سناریو نگاه خواهیم کرد: بلندمدت، میان‌مدت و کوتاه‌مدت.

سناریوها ذخیره سازی طولانی مدت ذخیره سازی میان مدت ذخیره سازی کوتاه مدت
استراتژی ذخیره‌سازی سرویس ورکرها حافظه پنهان، بازگشت به شبکه اعتبارسنجی مجدد در حین بی‌اعتبارسازی شبکه‌ای که به حافظه پنهان برمی‌گردد
TTL حافظه پنهان سرویس دهنده ۳۰ روز ۱ روز ۱۰ دقیقه
حداکثر سن حافظه پنهان HTTP ۳۰ روز ۱ روز ۱۰ دقیقه

سناریو: ذخیره‌سازی بلندمدت (ذخیره‌سازی، بازگشت به شبکه)

  • وقتی یک منبع ذخیره شده معتبر باشد (کمتر از 30 روز): سرویس ورکر منبع ذخیره شده را بلافاصله و بدون مراجعه به شبکه برمی‌گرداند.
  • وقتی یک منبع ذخیره شده در حافظه پنهان (cache) منقضی می‌شود (بیش از 30 روز): سرویس ورکر برای دریافت منبع به شبکه می‌رود. مرورگر کپی از منبع را در حافظه پنهان HTTP خود ندارد، بنابراین برای دریافت منبع به سمت سرور می‌رود.

معایب: در این سناریو، ذخیره‌سازی HTTP ارزش کمتری ارائه می‌دهد زیرا مرورگر همیشه وقتی حافظه پنهان در سرویس ورکر منقضی می‌شود، درخواست را به سمت سرور ارسال می‌کند.

سناریو: ذخیره‌سازی میان‌مدت (Stale-while-revalidate)

  • وقتی یک منبع ذخیره شده معتبر باشد (<= 1 روز): سرویس ورکر بلافاصله منبع ذخیره شده را برمی‌گرداند و برای دریافت منبع به شبکه می‌رود. مرورگر یک کپی از منبع را در حافظه پنهان HTTP خود دارد، بنابراین آن کپی را به سرویس ورکر برمی‌گرداند.
  • وقتی یک منبع ذخیره شده منقضی می‌شود (بیش از ۱ روز): سرویس ورکر بلافاصله منبع ذخیره شده را برمی‌گرداند و برای دریافت منبع به شبکه می‌رود. مرورگر کپی از منبع را در حافظه پنهان HTTP خود ندارد، بنابراین برای دریافت منبع به سمت سرور می‌رود.

معایب: سرویس ورکر برای اینکه بتواند از مرحله‌ی «تأیید مجدد» نهایت استفاده را ببرد، به عملیات اضافی برای حذف کش HTTP نیاز دارد.

سناریو: ذخیره‌سازی کوتاه‌مدت (شبکه به حافظه پنهان برمی‌گردد)

  • وقتی یک منبع ذخیره‌شده معتبر باشد (کمتر از ۱۰ دقیقه): سرویس ورکر برای دریافت منبع به شبکه می‌رود. مرورگر یک کپی از منبع را در حافظه پنهان HTTP خود دارد، بنابراین آن را بدون مراجعه به سمت سرور به سرویس ورکر برمی‌گرداند.
  • وقتی یک منبع ذخیره شده منقضی می‌شود (بیش از ۱۰ دقیقه): سرویس ورکر بلافاصله منبع ذخیره شده را برمی‌گرداند و برای دریافت منبع به شبکه می‌رود. مرورگر کپی از منبع را در حافظه پنهان HTTP خود ندارد، بنابراین برای دریافت منبع به سمت سرور می‌رود.

معایب: مشابه سناریوی ذخیره‌سازی میان‌مدت، سرویس ورکر برای لغو حافظه پنهان HTTP به منطق اضافی برای از بین بردن داده‌های ذخیره‌شده نیاز دارد تا بتواند آخرین منبع را از سمت سرور دریافت کند.

کارمند سرویس در همه سناریوها

در تمام سناریوها، حافظه پنهان سرویس‌دهنده می‌تواند منابع ذخیره‌شده را در صورت ناپایداری شبکه بازگرداند. از سوی دیگر، حافظه پنهان HTTP در صورت ناپایداری یا قطعی شبکه قابل اعتماد نیست.

منطق انقضای کش متفاوت در لایه‌های کش سرویس ورکر و HTTP

برای نشان دادن مزایا و معایب، دوباره به سناریوهای بلندمدت، میان‌مدت و کوتاه‌مدت نگاه خواهیم کرد.

سناریوها ذخیره سازی طولانی مدت ذخیره سازی میان مدت ذخیره سازی کوتاه مدت
استراتژی ذخیره‌سازی سرویس ورکرها حافظه پنهان، بازگشت به شبکه اعتبارسنجی مجدد در حین بی‌اعتبارسازی شبکه‌ای که به حافظه پنهان برمی‌گردد
TTL حافظه پنهان سرویس دهنده ۹۰ روز ۳۰ روز ۱ روز
حداکثر سن حافظه پنهان HTTP ۳۰ روز ۱ روز ۱۰ دقیقه

سناریو: ذخیره‌سازی بلندمدت (ذخیره‌سازی، بازگشت به شبکه)

  • وقتی یک منبع ذخیره شده در حافظه پنهان سرویس دهنده معتبر باشد (<= 90 روز): سرویس دهنده منبع ذخیره شده را بلافاصله برمی‌گرداند.
  • وقتی یک منبع ذخیره شده در حافظه پنهان سرویس دهنده منقضی می‌شود (بیش از ۹۰ روز): سرویس دهنده برای دریافت منبع به شبکه می‌رود. مرورگر کپی از منبع را در حافظه پنهان HTTP خود ندارد، بنابراین به سمت سرور می‌رود.

مزایا و معایب:

  • مزایا: کاربران پاسخ فوری را تجربه می‌کنند زیرا سرویس ورکر بلافاصله منابع ذخیره شده را برمی‌گرداند.
  • مزایا: سرویس ورکر کنترل دقیق‌تری بر زمان استفاده از حافظه پنهان و زمان درخواست نسخه‌های جدید منابع دارد.
  • معایب: به یک استراتژی ذخیره‌سازی (caching) مشخص برای سرویس ورکر نیاز است.

سناریو: ذخیره‌سازی میان‌مدت (Stale-while-revalidate)

  • وقتی یک منبع ذخیره شده در حافظه پنهان سرویس دهنده معتبر باشد (<= 30 روز): سرویس دهنده منبع ذخیره شده را بلافاصله برمی‌گرداند.
  • وقتی یک منبع ذخیره شده در حافظه پنهان سرویس دهنده منقضی می‌شود (بیش از 30 روز): سرویس دهنده برای دریافت منبع به شبکه مراجعه می‌کند. مرورگر کپی از منبع را در حافظه پنهان HTTP خود ندارد، بنابراین به سمت سرور می‌رود.

مزایا و معایب:

  • مزایا: کاربران پاسخ فوری را تجربه می‌کنند زیرا سرویس ورکر بلافاصله منابع ذخیره شده را برمی‌گرداند.
  • مزیت: سرویس ورکر می‌تواند به لطف اعتبارسنجی مجددی که «در پس‌زمینه» اتفاق می‌افتد، اطمینان حاصل کند که درخواست بعدی برای یک URL مشخص، از پاسخ جدیدی از شبکه استفاده می‌کند.
  • معایب: به یک استراتژی ذخیره‌سازی (caching) مشخص برای سرویس ورکر نیاز است.

سناریو: ذخیره‌سازی کوتاه‌مدت (شبکه به حافظه پنهان برمی‌گردد)

  • وقتی یک منبع ذخیره شده در حافظه پنهان سرویس دهنده معتبر باشد (<= 1 روز): سرویس دهنده برای منبع به شبکه می‌رود. اگر منبع در آنجا باشد، مرورگر آن را از حافظه پنهان HTTP برمی‌گرداند. اگر شبکه قطع باشد، سرویس دهنده منبع را از حافظه پنهان سرویس دهنده برمی‌گرداند.
  • وقتی یک منبع ذخیره شده در حافظه پنهان سرویس دهنده منقضی می‌شود (بیش از ۱ روز): سرویس دهنده برای دریافت منبع به شبکه می‌رود. مرورگر منابع را از طریق شبکه دریافت می‌کند زیرا نسخه ذخیره شده در حافظه پنهان HTTP آن منقضی شده است.

مزایا و معایب:

  • مزایا: وقتی شبکه ناپایدار یا از کار افتاده باشد، سرویس ورکر بلافاصله منابع ذخیره شده را برمی‌گرداند.
  • معایب: سرویس ورکر برای لغو کش HTTP و ارسال درخواست‌های «اولویت با شبکه» به پردازش کش اضافی نیاز دارد.

نتیجه‌گیری

با توجه به پیچیدگی ترکیب سناریوهای ذخیره‌سازی، طراحی یک قانون که همه موارد را پوشش دهد، امکان‌پذیر نیست. با این حال، بر اساس یافته‌های بخش‌های قبلی، چند پیشنهاد وجود دارد که می‌توانید هنگام طراحی استراتژی‌های ذخیره‌سازی خود در نظر بگیرید:

  • منطق ذخیره‌سازی سرویس ورکر نیازی نیست با منطق انقضای ذخیره‌سازی HTTP سازگار باشد. در صورت امکان، از منطق انقضای طولانی‌تر در سرویس ورکر استفاده کنید تا به سرویس ورکر کنترل بیشتری بدهید.
  • ذخیره‌سازی HTTP هنوز نقش مهمی ایفا می‌کند، اما وقتی شبکه ناپایدار یا از کار افتاده باشد، قابل اعتماد نیست.
  • استراتژی‌های ذخیره‌سازی خود را برای هر منبع مجدداً بررسی کنید تا مطمئن شوید که استراتژی ذخیره‌سازی سرویس ورکر شما، بدون تداخل با حافظه پنهان HTTP، ارزش خود را ارائه می‌دهد.

بیشتر بدانید