node.js - GraphQL:一个大查询与大量小查询

标签 node.js graphql apollo apollo-client apollo-server

我知道这个问题由来已久——而且这并不是什么 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/

相关文章:

javascript - TypeError : usert. addItem 不是函数

javascript - Nodejs回调过程

graphql - Graphcool 登录后更新中继存储

graphql - 使用 Prisma 查询 NOT NULL GraphQL

reactjs - Apollo 的 MockedProvider 没有明确警告丢失的模拟

javascript - 使用 webpack 捆绑 NodeJS/TypeScript 应用程序的好处

javascript - POST 请求中的测试和 stub 参数

laravel - Laravel Lighthouse 中的授权

graphql - 如何将 GraphQL 查询从 Node.js 发送到 Prisma

graphql - 如何将嵌套变量传递给 Apollo 中的 GraphQL 查询?