首页 > 解决方案 > 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 客户端/服务器堆栈,这是最好的方法。用可扩展的服务器实现响应式客户端。


笔记

标签: node.jsgraphqlapolloapollo-clientapollo-server

解决方案


如果您的服务器内存不足,可能是时候升级了。如果您现在内存不足,想象一下当您有多个用户访问您的端点时会发生什么。

解决该特定问题的唯一其他方法是将查询分解为几个较小的查询。但是,您提出的方法存在几个问题:

  • 你最终会用更多的请求来锤击你的服务器和你的数据库
  • 您的 UI 可能需要更长的时间来加载,具体取决于是否需要立即呈现请求的数据
  • 当您的一个请求失败或尝试重试失败的请求时处理这种情况可能具有挑战性

您已经建议添加分页,我认为将单个大型查询分解为较小的查询会更好。分页不仅有助于提供更好的用户体验,而且通过强制限制页面大小,您可以有效地限制给定查询的大小。

您可以考虑探索的另一种选择是使用延迟查询。考虑到昂贵的查询,此实验性功能是专门添加的。通过Note延迟类型上的一个或多个字段,您将有效地为它们最初返回 null,并且它们的值将在它们最终解析后在第二个“补丁”响应中发送。这对于解析成本高昂的字段非常有用,但也可能有助于返回大量数据的字段。


推荐阅读