Quarkus 返回 Multi<> 作为 Rest 响应

Quarkus returning a Multi<> as Rest response

提问人:T. Franz 提问时间:11/4/2023 最后编辑:T. Franz 更新时间:11/4/2023 访问量:27

问:

我有一个关于 Quarkus 和 Rest Responses 的问题。我对微服务没有那么有经验。

我有一个 Quarkus 后端,它正在处理不同类型的 rest 请求。上传文件,获取一些用户信息等。

其中一个请求是处理时间尺度数据库查询请求,并将大量时间序列数据返回给请求者。我正在为此使用 reactive-pg-client。

我目前正在处理请求,并且资源具有多<>返回类型,而不是流式传输响应。

我的问题尤其在较大的请求上,我首先必须等到数据库查询完成,然后再返回。当有人请求大量数据时,可能会发生内存不足异常。这就是为什么我正在考虑使用一些分页并逐步将查询分批流回的原因。

但是我不确定的地方是,我怎样才能分批流回 Multi<>,而不仅仅是一次?

目前我有这样的东西:

@POST
        @Consumes(MediaType.APPLICATION_JSON)
        @Produces(MediaType.APPLICATION_JSON)
        @Path("/request")
        public Multi<[SomeType]> getTimeseries(String id) {
            return SomeFunction.getMulti( id );
        }

我正在寻找一种解决方案来将其更改为如下所示:

@POST
        @Consumes(MediaType.APPLICATION_JSON)
        @Produces(MediaType.APPLICATION_JSON)
        @Path("/request")
        public Multi<[SomeType]> getTimeseries(String id) {
            while( SomeFunction.getPart( id ) != null ) {
              [Return-current-page-as-multi-and-move-on-to-next-page] 
            }
            return ;
        }

是否可以使用类似

Response.ok(currentPage).build();

谢谢。

Quarkus 反应式 时间标度DB

评论

0赞 jonatasdp 11/6/2023
我不是 quarkus 框架用户,但我认为您还应该对 timescaledb 的数据返回进行分页以避免长请求。此外,请记住不要使用偏移量,而是使用时间戳作为查询的 where 子句,以便快速切片要导出的数据帧。

答: 暂无答案