spring-boot - 我应该在基于控制器的 Spring Webflux 服务中使用 Flow 作为返回类型吗
问题描述
我正在尝试在我们的下一个 Spring Boot 服务中使用 Kotlincoroutines
和spring-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
(整个调用链无论如何都将保持可挂起)?
解决方案
推荐阅读
- sql - 获取答案的 SQL 查询
- javascript - 在 ScrollView 中使用 react-native-collapsible 每行渲染两个项目
- spring - 如何让 Spring Boot 使用 MultiTenantSpringLiquibase?
- sql-server - SQL Server 从 2 个表中选择项目总和
- regex - 搜索具有“。”的 mongodb 记录。记录名称中的(点)
- assembly - or (%eax),%eax 的目的是什么?
- javascript - 用于创建简单图表的 d3 数据选择
- kentico - 带有来自媒体库 Kentico 11 的图像的图像轮播
- scala - Scala - 基于 Spark 中的键合并两个 RDD
- android - 反应原生道具allowFontScaling在android上不起作用