首页 > 解决方案 > Spring Webflux 中的背压

问题描述

我对 Spring Webflux 和整个反应式想法都很陌生。我有一些关于 Spring Webflux 如何根据其响应式发布者(Flux/Mono)处理请求的问题。以一个简单的控制器为例:

@PostMapping("/planets")
public Mono<Void> createNewPlanets(Flux<Planet> planetFlux) {

    return planetService
                       .insert(planetFlux.limitRate(10))
                       .then();
}

我了解 limitRate() 充当下游请求的限制器。我的问题是,这种背压机制仅基于我的参数(planetFlux)的单个请求。WebFlux(或响应式编程)是否无论如何都解决了请求负载过重的问题?这意味着我将如何针对多个并发请求优化上述代码?

我的第二个问题是,假设我应用了一些背压机制,planetFlux 的剩余元素究竟存储在哪里?再看上面的代码,如果我在 planetFlux 中有 100 个元素,当我的下游处理它时,剩下的 90 个存储在哪里?它是否存储在队列中?

如果您有任何参考资料,我很乐意阅读。希望我的问题足够清楚。

标签: javajava-streamspring-webflux

解决方案


WebFlux(或响应式编程)是否无论如何都解决了请求负载过重的问题?这意味着我将如何针对多个并发请求优化上述代码

Webflux 的核心设计是通过摆脱“每个请求一个线程”的理念,转而实现基于事件的链,其中线程仅在发出的事件期间工作,从而处理大量请求。

正如文档所述:

有两种方法可以提高程序的性能:

  • 并行化:使用更多线程和更多硬件资源。

  • 在如何使用当前资源方面寻求更高的效率。

反应式程序试图实现第二个要点。

你的一小段代码没有什么可优化的,所以我真的不明白你想要优化什么,插入?

有人订阅了您的服务并发布了一堆行星。您采用它并将插入速率限制为 10,以便 insert 方法获得一个 Flux,它将发出 10 个批次以插入到您要插入的任何内容中。所以我不太明白你的问题。

你的第二个问题:

PlanetFlux 的剩余元素究竟存储在哪里

如果您查看源代码,您可以看到以下内容。

在通量中,单个项目FluxJust<T>.class作为直接值存储在类中。而多个值存储在FluxArray<T>.class一个简单的数组中。


推荐阅读