node.js - GraphQL:一个大查询与大量小查询
问题描述
我知道这个问题与时间一样古老 - 他们不是灵丹妙药。但我认为那里可能有一个可靠的模式,我不想发明轮子。
考虑以下两个模式选项:
方法1)我的原始实现
type Query {
note(id: ID!): Note
notes(input: NotesQueryInput): [Note!]!
}
方法2)我目前的实验方法
type DatedId {
date: DateTime!
id: ID!
}
type Query {
note(id: ID!): Note
notes(input: NotesQueryInput): [DatedId!]!
}
区别在于:
使用方法 1) notes 查询将返回一个可能很大的 Note 对象列表
使用方法 2)注释查询将返回更轻的有效负载,但需要执行n 个额外的查询
所以我的问题是带有内存缓存的Apollo 客户端/服务器堆栈,这是最好的方法。用可扩展的服务器实现响应式客户端。
笔记
使用方法 1——我的 500mb 测功机(heroku 服务器)内存不足。
我希望无论采用哪种方法,我都会使用连接/边缘模式实现分页
graphql 服务器主要是为我自己的前端服务。
解决方案
如果您的服务器内存不足,可能是时候升级了。如果您现在内存不足,想象一下当您有多个用户访问您的端点时会发生什么。
解决该特定问题的唯一其他方法是将查询分解为几个较小的查询。但是,您提出的方法存在几个问题:
- 你最终会用更多的请求来锤击你的服务器和你的数据库
- 您的 UI 可能需要更长的时间来加载,具体取决于是否需要立即呈现请求的数据
- 当您的一个请求失败或尝试重试失败的请求时处理这种情况可能具有挑战性
您已经建议添加分页,我认为将单个大型查询分解为较小的查询会更好。分页不仅有助于提供更好的用户体验,而且通过强制限制页面大小,您可以有效地限制给定查询的大小。
您可以考虑探索的另一种选择是使用延迟查询。考虑到昂贵的查询,此实验性功能是专门添加的。通过Note
延迟类型上的一个或多个字段,您将有效地为它们最初返回 null,并且它们的值将在它们最终解析后在第二个“补丁”响应中发送。这对于解析成本高昂的字段非常有用,但也可能有助于返回大量数据的字段。
推荐阅读
- php - Laravel Nova 找不到一些模型
- java - 用于运行和调试的 ByteBuffer 的不同行为
- python - 使用 for 循环重命名多个列(python)
- vhdl - 如何在保持向后兼容聚合的同时扩展记录类型?
- c - 链接器在 MINIX3.2.1 下抱怨未定义的引用
- facebook - 删除个人 Facebook Keep 开发者帐户
- .net - 如何使用 dotnet aries 框架内的中介代理连接两个超级账本 aries 边缘代理?
- c++ - 点云线搜索算法
- asp.net-mvc - 将文件从视图上传到.net Core中的控制器
- image - 为什么使用烧瓶上传会破坏模板中的图像?