gpt4 book ai didi

kotlin - GraphQL服务器端流式实现

转载 作者:行者123 更新时间:2023-12-02 12:57:29 24 4
gpt4 key购买 nike

因此,过去我能够创建一个REST端点,并使它能够流式传输大文件。我使用Java和Jersey(REST库)进行了此操作。我可以创建一个类似于以下代码的终结点-客户端可以命中它,并且服务器将流出大文件而无需使用大量内存,并且客户端将立即开始下载文件。

@GET
@Path("/getFile")
public Response getFile(){
InputStream file = getFileStreamFromDB();
Response response = Response.ok().entity(stream);

return response;
}

现在,我正在尝试弄清楚如何使用GraphQL应用类似的模式。用例有些不同-现在我从数据库而不是文件中提取大型结果集。我有在Kotlin和KGraphQL中构建的GraphQL服务器。从我所做的研究来看,似乎需要发送整个对象作为对GraphQL调用的响应。

我的用例是在基于React的仪表板上显示数据。在某些情况下,我们会有大量的数据,并且可能需要花费一些时间才能将响应发送到客户端,因为必须发送整个结果集。我希望将数据流式传输到仪表板中,以便用户可以立即开始查看一些数据,而不必等待15或20秒才能显示它。

GraphQL解析器可以是某种对象或字符串:
query("returnString"){
resolver { -> "this is a string"}
}

但是,如果我尝试返回如下所示的InputStream:
query("returnStream"){
resolver { -> ({
val stream = ByteArrayInputStream("this is a string".toByteArray(Charsets.UTF_8))
stream
})
}
}

尝试启动GraphQL服务器时出现以下异常:

Caused by: com.apurebase.kgraphql.schema.SchemaException: Generic types are not supported by GraphQL, found () -> java.io.ByteArrayInputStream at com.apurebase.kgraphql.schema.structure2.SchemaCompilation.handlePossiblyWrappedType(SchemaCompilation.kt:147) at com.apurebase.kgraphql.schema.structure2.SchemaCompilation.handleOperation(SchemaCompilation.kt:131) at com.apurebase.kgraphql.schema.structure2.SchemaCompilation.handleQueries(SchemaCompilation.kt:112) at com.apurebase.kgraphql.schema.structure2.SchemaCompilation.perform(SchemaCompilation.kt:55) at com.apurebase.kgraphql.schema.dsl.SchemaBuilder.build(SchemaBuilder.kt:26) at com.apurebase.kgraphql.KGraphQL$Companion.schema(KGraphQL.kt:8)



我们在前端使用apollo,所以我觉得我们可以在客户端利用stream指令-我只是不确定如何设计GraphQL解析器来返回流。

有没有一种方法可以流式传输对GraphQL调用的响应?还是我目前必须使用REST?

最佳答案

流响应的最接近GraphQL等效项可能是订阅:https://graphql.org/blog/subscriptions-in-graphql-and-relay/。对我来说,实现您对DB行“事件”的订阅实现的工作似乎很合理。

看来目前KGraphQL中尚未实现:https://github.com/aPureBase/KGraphQL/issues/10

然而,graphql-kotlin项目(https://github.com/ExpediaGroup/graphql-kotlin)的订阅是在spring-boot的基础上实现的:https://expediagroup.github.io/graphql-kotlin/docs/server/subscriptions

如果您习惯 Jersey 并且希望坚持使用它,我们将利用graphql-kotlin的基础库汇总一个单独的实现,以在dropwizard( Jersey 等)基础上实现订阅:https://github.com/trib3/leakycauldron/tree/master/graphql

关于kotlin - GraphQL服务器端流式实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58328920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com