我知道这个问题由来已久——而且这并不是什么 Elixir 。但我认为可能有一个固定的模式,我不想发明轮子。
考虑以下两个架构选项:
方法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),注释查询将返回可能较大的 Note 对象的列表
使用方法 2),笔记查询将返回更轻的负载,但随后需要执行n个额外的查询
所以我的问题是 Apollo Client / Server堆栈与内存缓存是最好的方法。实现具有可扩展服务器的响应式客户端。
<小时/> 笔记采用方法 1 - 我的 500mb dyno(heroku 服务器)内存不足。
我希望无论采用哪种方法,我都会使用 connection / edge pattern 来实现分页。
graphql 服务器主要是为我自己的前端提供服务。
最佳答案
如果您的服务器内存不足,则可能需要升级。如果您现在内存不足,想象一下当您有多个用户访问您的端点时会发生什么。
解决该特定问题的唯一其他方法是将查询分解为几个较小的查询。但是,您提出的方法存在一些问题:
- 您最终将通过更多的请求来打击您的服务器和数据库
- 您的 UI 可能需要更长时间才能加载,具体取决于是否需要立即呈现请求的数据
- 处理某个请求失败时的情况或尝试重试失败的请求可能会很困难
您已经建议添加分页,我认为这是将单个大型查询分解为较小查询的更好方法。分页不仅可以提供更好的用户体验,而且通过对页面大小实现限制,您可以有效地对给定查询的大小实现限制。
您可以考虑探索的另一个选项是使用 deferred queries 。这个实验性功能是专门考虑到昂贵的查询而添加的。通过延迟 Note
类型上的一个或多个字段,您实际上会在最初为它们返回 null,并且它们的值将在最终解析后在第二个“补丁”响应中向下发送。这对于解析成本高昂的字段非常有效,但也可能对返回大量数据的字段有所帮助。
关于node.js - GraphQL:一个大查询与大量小查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55291773/