AEM Edge函式中的快取 edge-functions-caching

IMPORTANT
AEM Edge功能是​ 測試版 ​功能。 功能和檔案可能會有所變更,恕不另行通知。 若要加入搶先體驗計畫並提供意見回饋,請寄電子郵件至aemcs-edgecompute-feedback@adobe.com

本頁提供有關快取如何在AEM Edge函式中運作的詳細技術指引,包括雙快取架構、如何控制程式碼中的快取行為,以及如何在內容變更時清除快取專案。

如需AEM as a Cloud Service快取運作方式的一般背景,請參閱在AEM as a Cloud Service中快取在AEM as a Cloud Service中的CDN。 如需程式碼範例,請參閱AEM Edge函式樣板 — 快取

快取架構 architecture

AEM Edge函式位於CDN和函式所擷取的後端服務之間。 這些後端可以是AEM發佈執行個體、第三方API、外部資料庫,或您的程式碼呼叫的任何HTTP端點。 要求流程中有​兩個不同的快取,每個都獨立運作:

Browser → AEM CDN (CDN Cache) → AEM Edge Functions (Fetch Cache) → Backend (AEM, APIs, etc.)
快取
快取的內容
影響因素
如何清除
CDN快取
Edge函式對瀏覽器的回應
Edge函式設定的回應標頭(Cache-ControlSurrogate-ControlSurrogate-Key)
CDN快取清除API
Edge函式擷取快取
後端回應Edge函式中的fetch()呼叫,以及透過核心快取API儲存的資料
後端回應標頭、擷取呼叫上的CacheOverride或透過核心快取API的程式化代理金鑰
aio aem edge-functions purge-cache CLI命令或purgeSurrogateKey()

瞭解此兩層架構非常重要,因為每個快取都有不同的範圍、不同的控制項和不同的清除機制。 有效的快取需要在兩個層級進行審慎的設定。

CDN快取(外部) cdn-cache

CDN快取位於瀏覽器和Edge函式之間。 它會快取Edge函式的​回應。 您可以在Edge函式回應上設定標準HTTP快取標題,藉此控制其行為:

return new Response(body, {
  headers: {
    'Surrogate-Key': 'page-home product-123',
    'Cache-Control': 'public, max-age=3600'
  }
});

多個替代索引鍵會以空格分隔。 這些替代金鑰可用來使用CDN快取清除API來清除CDN快取。 替代金鑰清除的概念與清除資源群組的快取中所述的概念相同,主要差異在於此處的CDN替代金鑰是由Edge函式程式碼設定,而非由後端設定。

Edge函式擷取快取(內部) fetch-cache

Edge函式擷取快取位於Edge函式與其呼叫的後端之間。 它會快取​後端回應,以在您的Edge函式程式碼中呼叫fetch()。 它也會保留程式碼透過​ 核心快取API 或​ 簡單快取API 儲存的任何資料 — 程式化的快取介面,讓您可微調控制要快取哪些資料、快取時間長短,以及替代金鑰的位置。

不是​受到您在Edge函式的傳出回應上設定的標頭影響 — 只有後端的回應標頭、擷取呼叫上的CacheOverride選項或您在寫入核心快取API時以程式設計方式指派的替代金鑰影響。

NOTE
您在Edge函式的​ 傳出回應 ​上設定給瀏覽器的Surrogate-Key標頭會控制​外部CDN快取,而非此內部快取。 內部快取的替代金鑰來自後端的Surrogate-Key回應標頭,或來自您在寫入核心快取API時指派的金鑰。

快取後端回應 cache-override

快取特定期間的後端回應:

import { CacheOverride } from "fastly:cache-override";

const response = await fetch(request, {
  backend: "my-origin",
  cacheOverride: new CacheOverride({ ttl: 300 })
});

略過快取 cache-pass

若要完全略過擷取快取並一律從後端擷取,請使用pass模式:

import { CacheOverride } from "fastly:cache-override";

const response = await fetch(request, {
  backend: "my-origin",
  cacheOverride: new CacheOverride({ mode: "pass" })
});

快取清除 cache-purging

快取內容過時時,您必須明確將其清除。 因為這兩個快取是獨立運作的,所以請務必瞭解您要讓哪一個圖層失效以及它們如何互動。

協調兩個圖層上的清除 coordinating-purges

由於Edge函式位於CDN後方作為後端(可透過原始選取器連線),因此清除一個快取層而不清除另一個快取層可能會產生非預期的結果:

  1. 只清除CDN快取​會導致下一個要求叫用Edge函式。 如果Edge函式的擷取快取仍保有過時資料,則會傳回舊內容,然後CDN會再次快取這些內容。
  2. 僅清除Edge函式快取​會清除內部狀態,但CDN會繼續提供其先前快取的復本,直到它過期或被個別清除為止。

最佳實務:​當基礎資料變更時,請清除​ 兩個 ​快取 — 使用CDN快取清除API用於外部層,使用purge-cache (或purgeSurrogateKey())用於內部Edge功能層。 跨兩個圖層使用一致的替代金鑰可簡化協調失效。 如需此模式的完整範例,請參閱AEM Edge函式樣板 — 清除

清除CDN快取 purge-cdn-cache

若要清除外部CDN快取(在CDN層快取的Edge函式回應),請使用CDN快取清除API。 這是適用於所有在CDN快取的AEM as a Cloud Service內容的相同清除機制 — 請參閱如何清除CDN快取以取得逐步指引。

在AEM as a Cloud Service架構中,Edge功能會透過來源選取器接收來自CDN的流量(另請參閱CDN路由)。 完整的請求流程為:

Client → AEM CDN (VCL) → Origin Selector → Edge Function → Backend

CDN會快取Edge函式傳回的最終回應。 CDN清除僅會清除外部快取回應的​ — 這對Edge函式的內部快取沒有影響。

清除Edge函式擷取快取 purge-fetch-cache

purge-cache CLI命令會清除​Edge函式擷取快取 (在Edge函式中快取的後端回應)。 它​ ​清除外部CDN快取。 如需完整的CLI選項和旗標,請參閱purge-cache命令參考

代理金鑰的來源 surrogate-key-origin

清除命令中使用的替代金鑰必須符合快取內容儲存時​標籤的金鑰。 這是與AEM CDN中使用的替代金鑰型清除相同的概念,但套用至Edge函式的內部快取。 這些鍵值來自:

  • Edge函式從後端擷取時,後端傳回的Surrogate-Key回應標頭。
  • 您在寫入核心快取API時以程式設計方式指派的金鑰(例如,在插入快取專案時透過surrogateKeys選項)。

例如,如果您的後端回應為:

HTTP/1.1 200 OK
Content-Type: text/html
Surrogate-Key: page-about product-456 category-shoes
Cache-Control: public, max-age=3600

接著會使用三個替代金鑰標籤快取回應: page-aboutproduct-456category-shoes。 您稍後可以使用下列任一索引鍵將其清除:

# Purge all cached content tagged with "product-456"
aio aem edge-functions purge-cache <function-name> --surrogateKey product-456

# Purge multiple keys at once
aio aem edge-functions purge-cache <function-name> -k page-about -k category-shoes
TIP
選擇對應到您的內容模型的代理金鑰命名慣例 — 例如,依頁面路徑(page-about)、內容ID (product-456)或內容型別(category-shoes)。 這樣一來,當內容變更時,目標快取會以直覺的方式失效。

全部清除 purge-all

# Purge all cached content (use with caution)
aio aem edge-functions purge-cache <function-name> --all

軟清除 soft-purge

使用--soft旗標來執行軟清除,保留快取中的過時專案並減少後端負載,同時啟用過時重新驗證:

aio aem edge-functions purge-cache <function-name> --surrogateKey product-456 --soft

程式化清除 programmatic-purge

您也可以使用purgeSurrogateKey,以程式設計方式從您的Edge函式程式碼中清除替代金鑰:

import { purgeSurrogateKey } from "fastly:compute";

// Hard purge (immediate removal)
purgeSurrogateKey("product-456");

// Soft purge (retain stale entries for revalidation)
purgeSurrogateKey("product-456", true);
CAUTION
清除所有快取內容會增加到後端的流量。 請謹慎使用--all旗標,並儘可能使用目標替代金鑰清除。
recommendation-more-help
experience-manager-cloud-service-help-main-toc