当前位置: 首页 > 知识库问答 >
问题:

spring Webflux中的背压

云瑞
2023-03-14

我对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(或reactive programming)是否解决了请求负载过大的问题?这意味着我将如何针对多个并发请求优化上述代码?

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

如果你有的话,我很乐意读一些参考资料。希望我的问题足够清楚。

共有1个答案

丁灿
2023-03-14

WebFlux(或reactive programming)是否解决了请求负载过大的问题?这意味着我将如何针对多个并发请求优化上述代码

Webflux的核心是针对重负载请求而设计的,它从“每个请求一个线程”的思想转变为实现基于事件的链,其中线程只在发出的事件期间工作。

文件所述:

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

>

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

    在如何使用现有资源方面寻求更高的效率。

    而反应性程序则试图实现第二个要点。

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

    有人订阅了你的服务并发布了一堆行星。然后将插入速率限制为10,这样insert方法将获得一个通量,该通量将发出10个批量以插入到您正在插入的任何内容中。所以我不太明白你的问题。

    你的第二个问题:

    行星通量的剩余元素到底储存在哪里

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

    在flux中,单个项作为直接向上的值存储在类FluxJust .class 中。而多个值则存储在FluxArray .class 中,作为一个简单的数组

  •  类似资料:
    • 我的理解是单声道 我说得对吗? 如果没有,单声道之间的区别是什么

    • 请查看以下使用RestTemplate的controller代码(添加注释): 现在,我正试图通过反应式编程实现同样的目标。我现在使用WebFlux中的WebClient和Mono。但是,我很困惑如何将结果结合起来?看一看下面的代码(在任何地方都使用Mono,其余代码保持不变) 问题1:我们如何整合一切,形成一个Mono对象,并将其作为响应发送出去? 问题2:“CourseInfo CourseI

    • 我希望为每个请求生成唯一的traceId,并将其传递给所有服务。在SpringMVC中,使用MDC上下文并将traceId放在头文件中相当容易,但在反应式堆栈中,由于ThreadLocal,它根本不起作用。 一般来说,我希望使用单个traceId记录我拥有的每个服务上的每个请求和响应,该traceId可以识别整个系统中的特定操作。 我试图根据文章创建自定义过滤器:https://azizulhaq

    • 我试图让服务器发送的事件与Mozilla Firefox一起工作。给定一个Spring Boot的网络服务 使用Chrome浏览器或Edge(始终是最新版本)可以正常工作。我可以在网络分析器选项卡中看到未完成的请求,并且每秒都会显示一个新的时间戳。 然而,当我使用Firefox(84.0.2或更早版本)时,请求也会显示在网络选项卡中,但不会显示响应头或流数据。当我终止Spring后端时,Firef

    • 我不熟悉反应式/网络流量,正在尝试理解网络流量中的背压。我有以下控制器。我们的应用程序接收一个JSON搜索请求,并用流量流进行响应。 背压是应用于流的一个实例还是整个实例?i、 e.如果我有一个流,其中请求通过webflux控制器传入,那么在以前的请求中会减慢速度吗?会对将来的请求施加反向压力吗?或者只会因为基于当前活动请求的放缓而导致活动通量流的放缓而施加背压吗?

    • 我正在使用SpringWebSockets,我想从存储库返回一个项目列表 我怎么能在WebSocket会话中发送此列表 这是如何将项目列表发送到websocket的处理程序方法