AEM Edge函式中的快取 edge-functions-caching
本頁提供有關快取如何在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.)
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時以程式設計方式指派的替代金鑰影響。
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後方作為後端(可透過原始選取器連線),因此清除一個快取層而不清除另一個快取層可能會產生非預期的結果:
- 只清除CDN快取會導致下一個要求叫用Edge函式。 如果Edge函式的擷取快取仍保有過時資料,則會傳回舊內容,然後CDN會再次快取這些內容。
- 僅清除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-about、product-456和category-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
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);
--all旗標,並儘可能使用目標替代金鑰清除。