我有一个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',
},
});
};
当10秒后第二次调用端点时,我确实在响应so主体中获得了相同的时间,这表明响应确实被缓存了。但是,当从两个不同的设备(我的电脑和4G手机,所以不同的IP和ISP)调用它时,我会得到不同的日期,就好像每个设备都得到了不同的缓存响应,我可以在Netlify的仪表板中看到lambda被调用了两次。
关于Netlify的CDN是如何工作的,我有什么不了解的吗?有没有办法实现我正在努力做的事情?
免责声明:我在Netlify工作,会在服务台给你同样的答案。
简单的答案是,不,你不能完全按照你的意愿去做,是的,CDN可能有一些你不理解的地方。继续阅读以了解:)
关于如何影响Netlify的缓存,您设置Cache-control
标头的直觉是正确的,并且应该做您正在尝试做的事情!然而,它的影响将仅限于一个CDN节点,Netlify有几十个CDN节点(以及几个独立的CDN,但这在这里不起作用)。
每个CDN节点都处理自己的缓存,因此在缓存响应(在本例中为一天)时,它只缓存在单个CDN节点上。由于Netlify处理负载平衡的方式,您的手机和计算机,甚至您的计算机和同一台计算机在1秒后,可以在每次页面加载时与不同的CDN节点进行通信。
所以,您的实现不一定是"第二次返回缓存内容+在接下来的24小时内加载",而是"如果内容经常使用,则每天提取内容的频率不超过# of CDN nodes Netlify has in rotation
次"。这种"不断使用"的条件听起来很奇怪,但Netlify运行缓存CDN,并且没有无限的缓存容量,因此如果最近请求了足够多的其他内容,您的结果可能不会在缓存中保存一整天。
如果你想实现你的既定目标——每天只从API加载一次数据——你应该将它加载到持久的地方,并在你的函数中从那里获取它。
但我认为您的预期目标实际上是"避免不断地重新蚀刻数据",您的实现应该为此目的而工作。:)