Node.js 使用GraphQL的Cloudfront缓存?
在我的公司,我们将graphql用于生产应用程序,但仅用于私人资源 目前,我们的公共API是RESTAPI,带有用于缓存的Cloudfront服务。我们希望将它们转换为GraphQL API,但问题是:如何使用GraphQL正确处理缓存 我们曾考虑使用GET-graphql端点,并在查询字符串上缓存,但我们对请求的URL的大小有点吃惊(因为我们支持IE9+,并向学校出售有时真正虚拟的代理和防火墙) 因此,我们希望使用POST-graphQL端点,但……cloudfront无法基于请求体缓存请求 有人有想法/最佳实践可以分享吗?Node.js 使用GraphQL的Cloudfront缓存?,node.js,amazon-web-services,amazon-cloudfront,graphql,Node.js,Amazon Web Services,Amazon Cloudfront,Graphql,在我的公司,我们将graphql用于生产应用程序,但仅用于私人资源 目前,我们的公共API是RESTAPI,带有用于缓存的Cloudfront服务。我们希望将它们转换为GraphQL API,但问题是:如何使用GraphQL正确处理缓存 我们曾考虑使用GET-graphql端点,并在查询字符串上缓存,但我们对请求的URL的大小有点吃惊(因为我们支持IE9+,并向学校出售有时真正虚拟的代理和防火墙) 因此,我们希望使用POST-graphQL端点,但……cloudfront无法基于请求体缓存请求
谢谢现在最好的两个选择是:
- 使用专门的缓存解决方案,如
- 在GET中使用持久化查询,其中一些查询保存在服务器上,并通过GET按名称访问
*全面披露:我在遇到这些问题后启动了FastQL,但没有找到好的解决方案。我不确定它是否有特定的名称,但我在野外看到了一种模式,即graphQL查询本身以特定的id托管在后端。 它的灵活性要低得多,因为它需要嵌入预定义的查询 客户端只需发送参数/参数和所述预定义查询的ID以供使用,这将是您的缓存密钥。类似于HTTP缓存如何处理对
/my profile
的经过身份验证的请求,CloudFront根据头中的身份验证令牌提供不同的响应
客户端发送它的方式取决于graphQL的后端实现。
您可以将其作为白名单标题或查询字符串传递
因此,如果后端定义了一个如下所示的查询
(使用伪代码)
然后您的请求将是类似于api.app.com/graphQL/MyQuery?eposion=3
的内容
也就是说,您是否实际测量过您的查询不适合GET请求?如果您需要CDN缓存,我会说使用GET请求,并对不符合限制的请求使用上述方法
编辑:似乎它有一个名称:自动持久化查询
另一种保留POST请求的方法是使用Lambda@Edge在CloudFront上,使用DynamoDB表存储缓存,类似于CloudFlare workers的做法
async function handleRequest(event) {
let cache = caches.default
let response = await cache.match(event.request)
if (!response){
response = await fetch(event.request)
if (response.ok) {
event.waitUntil(cache.put(event.request, response.clone()))
}
}
return response
}
一些关于这个的阅读材料
async function handleRequest(event) {
let cache = caches.default
let response = await cache.match(event.request)
if (!response){
response = await fetch(event.request)
if (response.ok) {
event.waitUntil(cache.put(event.request, response.clone()))
}
}
return response
}