GrpahQL 的 DataFetcher 是否应该始终使用多线程?

Should multi-threading always be used in GrpahQL's DataFetcher?

我正在使用 GraphQL java 实现。

虽然 GraphQL 的优势之一是并行获取不同的字段,但我发现如果不使用像[=10=这样的多线程方法,只有一个线程在使用] 在 DataFetchers 中。

所以我的问题是,我是否应该始终在 DataFetcher 中使用多线程,如下面 official doc 所示,即使它只是从一个来源(例如数据库)而不是多个来源获取?

看来这是推荐的方法,至少不会有什么坏处。

但我想听听更有经验的开发者的意见。

提前致谢!

在 graphql-java 实现中,默认情况下,所有的解析器都是顺序调用的。

考虑以下架构

type Query {
 allPost: [Post!]
}

type Post {
  id: ID!
  tittle: String!
  postDetail: PostDetail!
  comments: [Comments!]
}

type PostDetail {
  id: ID!
  # This can be converted into enum
  postMediaType: String! 
  postUrl: String!
}

type Comment{
 id:ID!
 name: String!
 description: String!
}

这是对上面给出的模式的查询

{
  allPost{
    id
    tittle
    postDetail {
     id
     postMediaType
     postUrl
    }
    comments{
     id
     name
     description
    }
  }
}

当服务器首先执行此查询时,将调用 Post 解析器,如果 Post 解析器没有 returns 注释或 post 详细数据,则 graphQL 将尝试搜索相应的解析器,如果找不到,服务器将在启动期间失败。

现在 graphQL 服务器将首先调用 PostDetail 解析器并等待其完成,然后调用 Comments Resolver 以获取 post 的所有评论列表。

正如我们所见,即使 Post详细信息解析器和评论解析器并不相互依赖,解析器也是按顺序调用的。 这是我们可以使用 CompletableFuture 使 PostDetail 解析器和 Comments 解析器异步的地方。

在这种情况下,首先会调用 Post 解析器,然后 graphql 会调用 Post 详细解析器,后者会 return CompletableFuture,然后它会调用评论解析器,后者也会 return CompletableFuture,稍后当这两个 future 都完成时,它会将响应发送回客户端。

因此它不取决于您拥有的数据源数量 GraphQL 不关心不同类型的数据源它只关心 type/field.

的 Datafecters 的连接

如果解析器之间没有依赖关系,您可以 运行 并行解析器。