java - 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 个存储在哪里?它是否存储在队列中?
如果您有任何参考资料,我很乐意阅读。希望我的问题足够清楚。
解决方案
WebFlux(或响应式编程)是否无论如何都解决了请求负载过重的问题?这意味着我将如何针对多个并发请求优化上述代码
Webflux 的核心设计是通过摆脱“每个请求一个线程”的理念,转而实现基于事件的链,其中线程仅在发出的事件期间工作,从而处理大量请求。
正如文档所述:
有两种方法可以提高程序的性能:
并行化:使用更多线程和更多硬件资源。
在如何使用当前资源方面寻求更高的效率。
反应式程序试图实现第二个要点。
你的一小段代码没有什么可优化的,所以我真的不明白你想要优化什么,插入?
有人订阅了您的服务并发布了一堆行星。您采用它并将插入速率限制为 10,以便 insert 方法获得一个 Flux,它将发出 10 个批次以插入到您要插入的任何内容中。所以我不太明白你的问题。
你的第二个问题:
PlanetFlux 的剩余元素究竟存储在哪里
如果您查看源代码,您可以看到以下内容。
在通量中,单个项目FluxJust<T>.class
作为直接值存储在类中。而多个值存储在FluxArray<T>.class
一个简单的数组中。
推荐阅读
- php - 如何通过 HTML 表单传递 MediaRecorder 录制的视频
- sql - 重新构建查询以使用具有相似数据但之间没有每个日期的表
- ios - SwiftUI 中带循环的动态按钮
- arrays - 我想将 id 值存储在变量 ex $id=76 中
- ruby-on-rails - 在 ActiveRecord 中寻找常用词/短语
- json - 我必须解析动态 json
- asp.net-mvc-4 - 如何在 Asp.Net MVC5 中启用 CORS
- laravel - 在 vuex 操作中调用时未定义路由器
- java - 如何在android中使用bitcoinj(walletappkit)从助记符创建比特币钱包
- tempus-dominus-datetimepicker - 如何在 Tempus Dominus Bootstrap-4 日期时间选择器中仅突出显示和启用特定的工作日?