Spring Webflux中的背压

时间:2019-07-08 16:48:33

标签: java java-stream 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个元素存储在哪里?它存储在队列中吗?

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

1 个答案:

答案 0 :(得分:0)

  

WebFlux(或反应式编程)是否可以解决大量请求的问题?这意味着我将如何针对多个并发请求优化以上代码

Webflux的核心设计是通过从“每个请求一个线程”的思想转变为实现基于事件的链,其中线程仅在发出的事件期间工作,以应对繁重的请求。

文档说明:

  

可以通过两种方法来提高程序的性能:

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

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

  •   

反应式程序试图满足第二个要点。

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

某人订阅了您的服务并发布了一堆行星。您可以将插入速率限制为10,以便insert方法获得一个Flux,该Flux会发出10个批次以插入到您要插入的内容中。因此,我在这里不太了解您的问题。

第二个问题:

  

planetFlux的其余元素到底存储在哪里

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

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