我可以使用 netlify 的 CDN 来防止每天多次执行 lambda 吗?

Can I use netlify's CDN to prevent lambda execution more than once a day?

我有一个 Netlify 部署的应用程序,它有一个调用外部 API 来获取一些数据的 lambda 函数。外部 API 数据每天更新一次,我希望 lambda 响应在 Netlify 的 CDN 中缓存 24 小时,所以我不调用 lambda 函数,因此调用外部 API,一天不止一次。

为了对此进行测试,我编写了一个简单的 lambda 函数:

exports.handler = function(event, context, callback) {
  callback(null, {
    statusCode: 200,
    body: new Date().toString(),
    headers: {
      'Cache-Control': 'public, s-maxage=86400',
    },
  });
};

当 10 秒后第二次调用端点时,我在响应 so 正文中得到了相同的时间,表明响应确实被缓存了。 但是当从两个不同的设备(我的电脑和我的 4G phone,所以不同的 IP 和 ISP)调用它时,我得到不同的日期,就好像每个设备都有不同的缓存响应,我可以在 Netlify 的仪表板中看到lambda 被调用了两次。

对于 Netlify 的 CDN 的工作原理,我有什么不明白的地方吗? 有没有办法实现我正在尝试做的事情?

免责声明:我在 Netlify 工作,会在服务台给你同样的答案。

简短的回答是,不,您不能完全按照您的意图执行此操作,是的,您可能不了解有关 CDN 的某些内容。继续阅读以了解 :)

您关于设置 Cache-control header 的直觉关于如何影响 Netlify 的缓存是正确的,并且应该做您正在尝试做的事情!然而,它的效果仅限于单个 CDN 节点,而 Netlify 有几十个 CDN 节点(和几个独立的 CDN,但这里没有发挥作用)。

每个 CDN 节点处理自己的缓存,因此当响应被缓存时(在本例中为一天),它仅缓存在单个 CDN 节点上。由于 Netlify 处理负载平衡的方式,您的 phone 和计算机,甚至 1 秒后您的计算机和同一台计算机,可能会在每次页面加载时与不同的 CDN 节点通信。

所以 - 您的实施将完成的不一定是 "return cached content on second+ load for next 24h",而是 "fetch content no more often than # of CDN nodes Netlify has in rotation times per day if the content is used constantly"。这种情况 "used constantly" 听起来很奇怪 - 但 Netlify 运行缓存 CDN 并且没有无限的缓存容量,因此如果最近请求了足够多的其他内容,您的结果可能不会在缓存中停留一整天。

如果您想实现既定目标 - 每天仅从 API 加载一次数据 - 您应该将其加载到持久的某个位置并在您的函数中从那里获取它。

但我认为您的预期目标实际上是 "avoid refetching the data constantly",并且您的实施应该可以实现该目的。 :)