AEM Edge函数中的缓存 edge-functions-caching

IMPORTANT
AEM Edge Functions是​ 测试版 ​功能。 功能和文档可能会发生更改,恕不另行通知。 若要加入提前访问计划并提供反馈,请发送电子邮件至aemcs-edgecompute-feedback@adobe.com

本页提供了有关缓存如何在AEM Edge Functions中工作的详细技术指导,包括双缓存架构,如何控制代码中的缓存行为,以及如何在内容发生更改时清除缓存条目。

有关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