我应该在基于控制器的 Spring Webflux 服务中使用 Flow 作为返回类型吗

yur*_*s87 6 kotlin spring-boot spring-webflux spring-data-r2dbc kotlin-coroutines

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

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

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

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

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

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