首页 > 解决方案 > 我应该在基于控制器的 Spring Webflux 服务中使用 Flow 作为返回类型吗

问题描述

我正在尝试在我们的下一个 Spring Boot 服务中使用 Kotlincoroutinesspring-data-r2dbc( )。databaseClient我已经熟悉这两个概念,但是当我们深入研究实现的细节时,我开始问自己这个问题。

在我看到的大多数示例中,每个返回某种集合的端点在迁移到反应式方法时都将返回 Flow。

虽然没有其他(非阻塞)方式可以使用Mono/来完成它Flux,但由于我们想将订阅移交给 engine( Webflux),但 Kotlin 的情况非常不同Flows。Flow 的终端操作是暂停的,这使得它们本质上是非阻塞的。这意味着我可以在我得到它的时间和地点以非阻塞方式终止 Flow,并继续进行常规List,例如。

当然,底层热发布者、反应式传输/协议等可能存在更复杂的场景,但在我的情况下,这是一个非常传统的服务。我们决定使用响应式方法的唯一原因是它受 IO 限制:对于每个 API 调用,我们需要通过 HTTP/REST 从多个其他服务获取数据,然后执行一些数据库查询,然后返回组合结果。List所以,问题是:如果我可以当场将其简化为常规,例如在存储库中,那么在多个应用程序层(控制器、服务、存储库)中散布 Flow 是否有意义:

    suspend fun findByEvent(id: String): List<MyEntity> =
        databaseClient.execute(MY_QUERY)....all().asFlow().toList()

这样我的应用程序层的其余部分甚至都不知道Flow(整个调用链无论如何都将保持可挂起)?

标签: spring-bootkotlinspring-webfluxkotlin-coroutinesspring-data-r2dbc

解决方案


推荐阅读