繁体   English   中英

GraphQL:一个大查询与大量小查询

[英]GraphQL: One Big Query vs Lots of Little Queries

我知道这个问题和时间一样古老-他们不是万灵丹。 但是我认为那里可能有一个坚实的模式,我不想发明轮子。

考虑以下两个架构选项:

方法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)注释查询将返回可能较大的注释对象的列表

使用方法2)注释查询将返回轻得多的有效负载,但随后需要执行n个其他查询

因此,我的问题是带有内存缓存的Apollo客户端/服务器堆栈,这是最好的方法。 通过可扩展的服务器来实现响应式客户端。


笔记
  • 使用方法1-我的500mb dyno(heroku服务器)内存不足。

  • 我希望无论采用哪种方法,我都将使用连接/边缘模式实现分页

  • graphql服务器主要是为我自己的前端服务。

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

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

  • 您最终将需要更多的请求来重击服务器和数据库
  • 您的UI加载时间可能会更长,具体取决于是否需要立即呈现所请求的数据
  • 当您的请求之一失败或尝试重试失败的请求时,应对方案可能会很困难

您已经建议添加分页,并且我认为将单个大型查询分解为较小的查询是一种更好的方法。 分页不仅可以带来更好的用户体验,而且可以通过限制页面大小来有效地限制给定查询的大小。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM