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

Iwa*_*aru 1 http cache-control netlify

我有一个 Netlify 部署的应用程序,它带有一个 lambda 函数,它调用外部 API 来获取一些数据。外部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',
    },
  });
};
Run Code Online (Sandbox Code Playgroud)

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

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

foo*_*ool 5

免责声明:我为 Netlify 工作,并会在帮助台中为您提供相同的答案。

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

Cache-control关于如何影响 Netlify 的缓存,您对设置标头的直觉是正确的,并且应该做您想做的事情!然而,它的影响将仅限于单个 CDN 节点,而 Netlify 有几十个 CDN 节点(和几个独立的 CDN,但这里没有起作用)。

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

所以 - 您的实现将完成的不一定是“在接下来的 24 小时内在第二次+加载时返回缓存的内容”,而是“# of CDN nodes Netlify has in rotation如果内容经常使用,则获取内容的频率不超过每天多次”。这种“经常使用”的情况听起来很奇怪——但 Netlify 运行缓存 CDN 并且没有无限缓存容量,因此如果最近请求了足够多的其他内容,您的结果可能不会在缓存中停留一整天。

如果你想实现你的既定目标——每天只从 API 加载一次数据——你应该将它加载到某个持久的地方,然后在你的函数中从那里获取它。

但我认为您的预期目标实际上是“避免不断重新获取数据”,您的实现应该为此目的。:)