gpt4 book ai didi

java - Spring Webflux 中的背压

转载 作者:行者123 更新时间:2023-12-02 03:19:04 25 4
gpt4 key购买 nike

我对 Spring Webflux 和整个响应式(Reactive)想法还很陌生。我对 Spring Webflux 如何基于其响应式(Reactive)发布者(Flux/Mono)处理请求有一些疑问。以一个简单的 Controller 为例:

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

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

我知道 limitRate() 充当下游请求的限制器。我的问题是,这种反压机制仅根据我的参数(planetFlux)的单个请求起作用。 WebFlux(或响应式(Reactive)编程)是否能解决请求负载过重的问题?这意味着我将如何针对多个并发请求优化上述代码?

我的第二个问题是,假设我应用一些反压机制,planetFlux 的剩余元素到底存储在哪里?再拿上面的代码来说,如果我在planetFlux中有100个元素,那么当我的下游处理它时,剩下的90个元素存储在哪里?它存储在队列中吗?

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

最佳答案

Does WebFlux (or reactive programming) in anyway address the issue of having a heavy load of requests? Meaning how would I go about optimizing the above code for multiple concurrent requests

Webflux 的核心设计是为了应对繁重的请求负载,它放弃了“每个请求一个线程”的理念,而是实现基于事件的链,其中线程仅在发出的事件期间工作。

正如文档所述:

There are broadly two ways one can improve a program’s performance:

  • parallelize: use more threads and more hardware resources.

  • seek more efficiency in how current resources are used.

响应式(Reactive)程序试图实现第二个要点。

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

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

你的第二个问题:

where exactly are the remaining elements of planetFlux stored

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

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

关于java - Spring Webflux 中的背压,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56939385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com