Lưu nội dung ứng dụng vào bộ nhớ đệm

Cloud CDN là một phần quan trọng trong dịch vụ hỗ trợ của App Hosting cho ứng dụng web của bạn. Mọi yêu cầu đến phần phụ trợ của bạn đều phải đi qua Cloud CDN trước tiên. Nội dung đã được lưu vào bộ nhớ đệm trong CDN sẽ được phân phát ngay cho người dùng, bỏ qua một chuyến đi đến dịch vụ Cloud Run đang chạy mã máy chủ của ứng dụng web. Bạn có thể tìm hiểu thêm về các lợi ích chung của CDN tại web.dev.

Mặc dù cấu hình Cloud CDN cơ bản do App Hosting đặt và không thể sửa đổi, nhưng bạn có thể làm một số việc để tối ưu hoá hoạt động lưu vào bộ nhớ đệm nhằm tăng tốc độ tải trang, giảm nội dung không được lưu vào bộ nhớ đệm và giảm thiểu lưu lượng truy cập vào Cloud Run.

Nội dung có thể lưu vào bộ nhớ đệm

Cloud CDN lưu trữ phản hồi trong bộ nhớ đệm nếu TẤT CẢ các điều kiện sau đây đều đúng:

  1. Yêu cầu là GET

  2. Phản hồi có mã trạng thái là 200, 203, 204, 206, 300, 301, 302, 307, 308, 404, 405, 410, 421, 451 hoặc 501.

  3. Phản hồi có tiêu đề Cache-Control kèm theo lệnh max-age hoặc s-maxage, hoặc tiêu đề Expires kèm theo dấu thời gian trong tương lai.

  4. Phản hồi có tiêu đề Age hoặc tiêu đề Cache-Control có lệnh public rõ ràng.

  5. Phản hồi có kích thước nhỏ hơn hoặc bằng 10 MiB.

và KHÔNG có điều kiện nào sau đây được đáp ứng:

  1. Phản hồi có tiêu đề Set-Cookie

  2. Phản hồi có tiêu đề Vary với giá trị không phải là 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 hoặc Next-Url.

  3. Phản hồi có tiêu đề Cache-Control kèm theo lệnh no-store hoặc private.

  4. Yêu cầu có tiêu đề Cache-Control kèm theo lệnh no-store.

  5. Yêu cầu có tiêu đề Authorization, trừ phi phản hồi có lệnh kiểm soát bộ nhớ đệm rõ ràng.

Tuỳ chỉnh hành vi bằng các lệnh kiểm soát bộ nhớ đệm

Next.js

Next.js đặt các lệnh kiểm soát bộ nhớ đệm một cách ngầm định dựa trên một số yếu tố. Tuy nhiên, bạn có thể ghi đè các giá trị này bằng cách đặt tiêu đề theo cách thủ công trong tệp next.config.js. Ví dụ: để đảm bảo một trang không được lưu vào bộ nhớ đệm trong Cloud CDN, hãy làm như sau:

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

Angular

Angular SSR không đặt các lệnh kiểm soát bộ nhớ đệm rõ ràng ngay từ đầu. Bạn có thể thêm tiêu đề của riêng mình bằng cách chỉ định tiêu đề kiểm soát bộ nhớ đệm trong các tuyến máy chủ. Ví dụ: Để cho phép Cloud CDN lưu tất cả các trang vào bộ nhớ đệm trong một giờ:

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

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

Hoặc để đảm bảo một trang cụ thể sẽ không được lưu vào bộ nhớ đệm:

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

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

Lệnh bắt buộc

Phiên bản Cloud CDN của Firebase App Hosting tuân thủ các lệnh kiểm soát bộ nhớ đệm sau:

Lệnh Yêu cầu Phản hồi
no-store Khi có trong yêu cầu, phản hồi sẽ không được lưu vào bộ nhớ đệm. Phản hồi có no-store không được lưu vào bộ nhớ đệm.
no-cache Chỉ thị yêu cầu no-cache bị bỏ qua để ngăn ứng dụng có thể bắt đầu hoặc buộc xác thực lại với nguồn gốc. Phản hồi có no-cache được lưu vào bộ nhớ đệm nhưng phải được xác thực lại với nguồn gốc trước khi được phân phát.
public Không áp dụng Chỉ thị này không bắt buộc đối với khả năng lưu vào bộ nhớ đệm, nhưng bạn nên đưa chỉ thị này vào nội dung cần được proxy lưu vào bộ nhớ đệm.
private Không áp dụng Cloud CDN không lưu phản hồi có lệnh private vào bộ nhớ đệm, ngay cả khi phản hồi đó được coi là có thể lưu vào bộ nhớ đệm. Ứng dụng khách (chẳng hạn như trình duyệt) vẫn có thể lưu kết quả vào bộ nhớ đệm. Sử dụng no-store để ngăn việc lưu tất cả phản hồi vào bộ nhớ đệm.
max-age=SECONDS Lệnh yêu cầu max-age bị bỏ qua. Phản hồi được lưu vào bộ nhớ đệm sẽ được trả về như thể tiêu đề này không có trong yêu cầu. Phản hồi có lệnh max-age được lưu vào bộ nhớ đệm trong tối đa số GIÂY đã xác định.
s-maxage=SECONDS Không áp dụng Phản hồi có lệnh s-maxage được lưu vào bộ nhớ đệm trong tối đa số GIÂY đã xác định. Nếu cả max-age và s-maxage đều có, thì Cloud CDN sẽ sử dụng s‑maxage. Những phản hồi có lệnh này sẽ không được phân phát khi đã cũ. s-max-age (hai dấu gạch nối) không hợp lệ cho mục đích lưu vào bộ nhớ đệm.
max-stale=SECONDS Chỉ thị yêu cầu max-stale chỉ định độ cũ tối đa (tính bằng giây) mà ứng dụng khách sẵn sàng chấp nhận. Cloud CDN tuân thủ điều này và chỉ trả về phản hồi đã lưu vào bộ nhớ đệm cũ nếu độ cũ của phản hồi nhỏ hơn lệnh max-stale. Nếu không, nó sẽ xác thực lại trước khi phân phát yêu cầu. Không áp dụng
stale-while-revalidate=SECONDS Không áp dụng Phản hồi có stale-while-revalidate được phân phát cho ứng dụng khách trong tối đa SECONDS trong khi quá trình xác thực lại diễn ra không đồng bộ.
must-revalidate Không áp dụng Phản hồi có must-revalidate sẽ được xác thực lại với máy chủ gốc sau khi hết hạn. Những phản hồi có lệnh này sẽ không được phân phát khi đã cũ.
proxy-revalidate Phản hồi có proxy-revalidate sẽ được xác thực lại với máy chủ gốc sau khi hết hạn. Các phản hồi có lệnh này sẽ không được phân phát khi đã cũ.
no-transform Không áp dụng Cloud CDN không áp dụng phép biến đổi nào.

Đo lường lưu lượng truy cập được lưu vào bộ nhớ đệm và không được lưu vào bộ nhớ đệm

Trong thẻ App Hosting > Usage (Mức sử dụng) trong bảng điều khiển Firebase, biểu đồ "Cloud CDN – Outgoing Bandwidth" (Cloud CDN – Băng thông đi) cho thấy số byte được phân phát đã lưu vào bộ nhớ đệm và chưa lưu vào bộ nhớ đệm, đồng thời có một dấu cho mỗi lần phát hành. Bạn có thể sử dụng biểu đồ này để đo lường hiệu quả của các nỗ lực tối ưu hoá bộ nhớ đệm.

Bạn cũng có thể xem tỷ lệ kết quả tìm kiếm trong bộ nhớ cache cho các tuyến cụ thể trong ứng dụng web bằng tính năng Giám sát dựa trên tuyến.