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 的连接
如果解析器之间没有依赖关系,您可以 运行 并行解析器。
我正在使用 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 的连接如果解析器之间没有依赖关系,您可以 运行 并行解析器。