将多个 GQL 变更捆绑到一个 HTTP 调用是一种好习惯吗

Is it good practice to bundle multiple GQL mutations to one HTTP call

我的 GQL 服务器发生了变化。这个解析器基本上只是将请求代理到处理 Dynamo table 映射的后端 Java 服务。我现在真的无法编辑该服务上的任何内容。

突变签名如下所示:

mutation {
  addItemRelation(child:"child1Id", parent:"parentId"),
}

mutation {
  removeItemRelation(child:"child1Id", parent:"parentId"),
}

在前端,我有一个界面,可以让我选中复选框以将某些属性与父项相关联。目前我处理这个问题的方法是将项目计算为 add/remove。然后向每个项目的 GQL 发送一个 HTTP 调用。

我想知道将这些全部捆绑到一个请求中会不会更好。例如,如果我添加 2 个项目并删除一个项目,我可以像这样计算 GQL 查询。

mutation {
  addItemRelation(child:"child1Id", parent:"parentId"),
  addItemRelation(child:"child2Id", parent:"parentId"),
  removeItemRelation(child: "child3id", parent: "parentId")
}

这是否比发送 3 个单独的 http 请求更好?

一方面,经验法则是网络请求越少越好。如果您将查询分成三个单独的 HTTP 请求,则有可能任何一个都可能由于连接不良而失败,而其他请求则成功。至少对于一个请求,要么执行所有三个突变,要么根本不执行 none。

另一方面,根级突变是顺序执行的(与实际上并行执行的所有其他字段相比)。根据您的业务案例,这种顺序执行本身可能是可取的。然而,从技术上讲,这也意味着 如果 您的服务器能够并行处理多个请求,将每个字段作为单独的请求发送可能会导致所有三个突变更快地完成。实际上,客户端和服务器之间的延迟通常是最大的因素,因此差异可能不明显。

请注意,当您的选择集多次包含同一字段时,您需要使用别名:

mutation {
  addItemRelation(child:"child1Id", parent:"parentId"),
  addItemRelation2: addItemRelation(child:"child2Id", parent:"parentId"),
  removeItemRelation(child: "child3id", parent: "parentId")
}