我对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个元素存储在哪里?它存储在队列中吗?
如果您有任何参考,我会很乐意阅读。希望我的问题很清楚。
答案 0 :(得分:0)
WebFlux(或反应式编程)是否可以解决大量请求的问题?这意味着我将如何针对多个并发请求优化以上代码
Webflux的核心设计是通过从“每个请求一个线程”的思想转变为实现基于事件的链,其中线程仅在发出的事件期间工作,以应对繁重的请求。
文档说明:
可以通过两种方法来提高程序的性能:
并行化:使用更多线程和更多硬件资源。
在使用当前资源方面寻求更高的效率。
反应式程序试图满足第二个要点。
您的一小段代码没有什么要优化的,所以我真的不明白您要优化的是什么,插入吗?
某人订阅了您的服务并发布了一堆行星。您可以将插入速率限制为10,以便insert方法获得一个Flux,该Flux会发出10个批次以插入到您要插入的内容中。因此,我在这里不太了解您的问题。
第二个问题:
planetFlux的其余元素到底存储在哪里
如果您查看源代码,则可以看到以下内容。
在通量中,单个项目作为上拉值存储在类FluxJust<T>.class
中。而多个值作为简单的数组存储在FluxArray<T>.class
中。