【发布时间】:2019-10-02 13:08:32
【问题描述】:
我想根据某些条件组合结果表两个Mono。 Mono 都是 WebClient 调用的结果:
- 第一个是单个呼叫,期望快速响应。
- 第二个是多个响应缓慢的呼叫的组合。
如果第一个结果满足某些条件,则“取消”第二个Mono 的想法是为了节省时间并避免不必要的网络调用。如果第一个的Mono 结果不够zip 它与第二个Mono。
一个 Kotlin 代码示例来解释我的想法:
fun getResult(): Mono<Result> {
val trivialResultMono: Mono<Result> = webClient.getResult()
val nonTrivialResultMono: Mono<Result> = webClient
.getResult()
.flatMap { webClient.getResult1(it) }
.flatMap { webClient.getResult2(it) }
.flatMap { webClient.getResult2(it) }
//here I need to check if trivial result satisfies some condition,
//for example trivialResult.size > 5 if it's true I just return
//trivialResultMono from getResult() function,
//it it's false something like this:
return Mono.zip(trivialResultMono, nonTrivialResultMono) { trivialResult, nonTrivialResult ->
trivialResult + nonTrivialResult
}
}
更新:
为了更清楚,假设 trivialResult 在 1 秒内出现,nonTrivialResult 在 2 秒内出现。如果是trivialResult.size > 5,我想在 1 秒内得到最终结果,否则在 2 秒内得到。
仅使用Mono.zip(trivialResultMono, nonTrivialResultMono),我总是会在 2 秒内得到最终结果。
使用filter + switchIfEmpty,如果trivialResult.size > 5 需要1 秒,否则需要3 秒。如果我错了,请纠正我。
【问题讨论】:
-
鉴于第一次调用很快,难道不可以直接等待它完成,然后过滤掉不合适的结果并切换到第二次调用吗?
-
假设第二次调用比第一次长 1.5 倍。在这种情况下,这个解决方案并不是那么理想。
标签: reactive-programming spring-webflux project-reactor