ذخیره محتوای برنامه در حافظه نهان

‫Cloud CDN بخش مهمی از پشتیبانی App Hosting از برنامه وب شما است. هر درخواست به باطن شما ابتدا از Cloud CDN عبور می‌کند. محتوایی که قبلاً در CDN ذخیره شده است، بلافاصله به کاربر ارائه می‌شود و نیازی به رفتن به سرویس Cloud Run که کد سرور برنامه وب شما را اجرا می‌کند، نیست. می‌توانید درباره مزایای کلی CDN در web.dev بیشتر بدانید.

اگرچه پیکربندی پایه Cloud CDN توسط App Hosting تنظیم شده است و نمی‌توان آن را تغییر داد، اما کارهای زیادی می‌توانید برای بهینه‌سازی ذخیره‌سازی در حافظه نهان انجام دهید تا سرعت بار کردن صفحه را افزایش دهید، محتوای ذخیره‌نشده در حافظه نهان را که برای آن صورت‌حساب صادر شده است کاهش دهید، و ترافیک Cloud Run را به حداقل برسانید.

محتوای قابل‌ذخیره در حافظه نهان

اگر همه شرایط زیر برقرار باشد، Cloud CDN پاسخ‌ها را در حافظه نهان ذخیره می‌کند:

  1. درخواست از نوع GET است

  2. پاسخ دارای کد وضعیت 200، 203، 204، 206، 300، 301، 302، 307، 308، 404، 405، 410، 421، 451، یا 501 است.

  3. پاسخ دارای سرایند Cache-Control با دستورالعمل max-age یا s-maxage، یا سرایند Expires با مُهر زمان در آینده است.

  4. پاسخ دارای سرایند Age یا سرایند Cache-Control با دستور صریح public است.

  5. اندازه پاسخ کمتر یا برابر با ۱۰ مبی‌بایت باشد.

و هیچ‌کدام از موارد زیر درست نباشد:

  1. پاسخ دارای سرصفحه Set-Cookie است

  2. پاسخ دارای سرصفحه Vary با مقداری غیراز Accept، Accept-Encoding، Access-Control-Request-Headers، Access-Control-Request-Method، Origin، Sec-Fetch-Dest، Sec-Fetch-Mode، Sec-Fetch-Site، X-Goog-Allowed-Resources، X-Origin، RSC، Next-Router-State-Tree، Next-Router-Prefetch، Next-Router-Segment-Prefetch، یا Next-Url است.

  3. پاسخ دارای سرایند Cache-Control با دستورالعمل no-store یا private است.

  4. درخواست دارای سرصفحه Cache-Control با دستورالعمل no-store است.

  5. درخواست دارای سرصفحه Authorization است، مگر اینکه پاسخ دارای دستورالعمل صریح کنترل حافظه نهان باشد.

سفارشی‌سازی رفتار با دستورالعمل‌های کنترل حافظه نهان

Next.js

‫Next.js دستورالعمل‌های کنترل حافظه نهان را به‌طور ضمنی براساس تعدادی از عوامل تنظیم می‌کند. بااین‌حال، می‌توانید با تنظیم دستی سرصفحه در فایل next.config.js، این موارد را لغو کنید. برای مثال، برای اطمینان از اینکه صفحه‌ای در Cloud CDN ذخیره نشده است:

  /** @type {import('next').NextConfig} */
  const nextConfig = {
      headers: async () => [{
          source: "/YOUR_PRIVATE_PAGE",
          headers: [{
              key: "Cache-Control",
              value: "private"
          }],
      }],
  };

Angular

Angular SSR به‌طور پیش‌فرض دستورالعمل‌های صریح cache-control را تنظیم نمی‌کند. می‌توانید با مشخص کردن سراینده‌های کنترل حافظه نهان در مسیرهای سرور، سراینده‌های خودتان را اضافه کنید. برای مثال، برای اینکه به Cloud CDN اجازه دهید همه صفحه‌ها را برای یک ساعت در حافظه پنهان ذخیره کند:

import { RenderMode, ServerRoute } from '@angular/ssr';

export const serverRoutes: ServerRoute[] = [
  {
    path: '**',
    renderMode: RenderMode.Prerender,
    headers: {
      'Cache-Control': 'public, max-age=3600',
    }
  }
];

یا برای اطمینان از اینکه صفحه خاصی در حافظه نهان ذخیره نخواهد شد:

import { RenderMode, ServerRoute } from '@angular/ssr';

export const serverRoutes: ServerRoute[] = [
  // ... other routes
  {
    path: 'YOUR_PRIVATE_PAGE',
    renderMode: RenderMode.Server,
    headers: {
      'Cache-Control': 'private',
    }
  }
];

دستورالعمل‌های رعایت‌شده

نمونه Cloud CDN مربوط به Firebase App Hosting از دستورالعمل‌های کنترل حافظه نهان زیر پیروی می‌کند:

بخشنامه درخواست پاسخ
no-store وقتی در درخواست وجود داشته باشد، پاسخ در حافظه نهان ذخیره نخواهد شد. پاسخ با no-store ذخیره نشده است.
no-cache دستور درخواست no-cache نادیده گرفته می‌شود تا از احتمال شروع یا اجبار به اعتبارسنجی مجدد به مبدأ توسط مشتریان جلوگیری شود. پاسخ با no-cache ذخیره شده است اما باید قبل‌از ارائه، با مبدأ دوباره اعتبارسنجی شود.
public نامربوط این دستورالعمل برای قابلیت ذخیره‌سازی در حافظه نهان الزامی نیست، اما روال مطلوب این است که برای محتوایی که باید توسط پراکسی‌ها در حافظه نهان ذخیره شود، گنجانده شود.
private نامربوط پاسخ با دستورالعمل private توسط Cloud CDN در حافظه نهان ذخیره نمی‌شود، حتی اگر پاسخ به‌گونه‌ای دیگر قابل‌ذخیره در حافظه نهان درنظر گرفته شود. کارخواه‌ها (مثل مرورگرها) ممکن است همچنان نتیجه را در حافظه نهان ذخیره کنند. برای جلوگیری از ذخیره شدن پاسخ‌ها در حافظه نهان، از no-store استفاده کنید.
max-age=SECONDS دستور درخواست max-age نادیده گرفته شد. پاسخ ذخیره‌شده در حافظه نهان به‌گونه‌ای برگردانده می‌شود که گویی این سرایند در درخواست گنجانده نشده است. پاسخ با دستورالعمل max-age تا «ثانیه» تعریف‌شده ذخیره می‌شود.
s-maxage=SECONDS نامربوط پاسخ با دستورالعمل s-maxage تا «ثانیه» تعریف‌شده ذخیره می‌شود. اگر هم max-age و هم s-maxage وجود داشته باشد، Cloud CDN از s‑maxage استفاده می‌کند. پاسخ‌های دارای این دستورالعمل به‌صورت کهنه ارائه نمی‌شوند. ‫s-max-age (دو خط تیره) برای اهداف ذخیره‌سازی در حافظه نهان معتبر نیست.
max-stale=SECONDS دستور درخواست max-stale حداکثر کهنگی (به ثانیه) را که مشتری مایل به پذیرش آن است تعیین می‌کند. Cloud CDN این را رعایت می‌کند و پاسخ ذخیره‌شده در حافظه نهان را فقط درصورتی برمی‌گرداند که کهنگی پاسخ کمتر از دستورالعمل max-stale باشد. درغیراین‌صورت، پیش‌از ارائه درخواست، دوباره اعتبارسنجی می‌کند. نامربوط
stale-while-revalidate=SECONDS نامربوط پاسخی با stale-while-revalidate تا SECONDS به مشتری ارائه می‌شود درحالی‌که اعتبارسنجی مجدد به‌صورت ناهمگام انجام می‌شود.
must-revalidate نامربوط پاسخ با must-revalidate پس‌از منقضی شدن با سرور مبدأ دوباره اعتبارسنجی می‌شود. پاسخ‌های دارای این دستورالعمل به‌صورت کهنه ارائه نمی‌شوند.
proxy-revalidate پاسخ با proxy-revalidate پس‌از منقضی شدن با سرور مبدأ دوباره اعتبارسنجی می‌شود. پاسخ‌های دارای این دستورالعمل به‌صورت کهنه ارائه نمی‌شوند.
no-transform نامربوط هیچ تبدیلی توسط Cloud CDN اعمال نمی‌شود.

اندازه‌گیری ترافیک ذخیره‌شده در حافظه پنهان و ذخیره‌نشده در حافظه پنهان

در برگه میزبانی برنامه > استفاده در کنسول Firebase، نمودار «Cloud CDN - پهنای باند خروجی» بایت‌های ذخیره‌شده و ذخیره‌نشده ارائه‌شده را نشان می‌دهد، و برای هر عرضه یک علامت دارد. می‌توانید از این نمودار برای اندازه‌گیری اثربخشی تلاش‌هایتان برای بهینه‌سازی حافظه نهان استفاده کنید.

همچنین می‌توانید نرخ اصابت حافظه نهان را برای مسیرهای خاص در برنامه وب خود با پایش مبتنی بر مسیر مشاهده کنید.