[英]How to limit concurrent http requests with Mono & Flux
我想处理Flux
以限制 Mono 列表发出的并发Mono
请求。
当一些请求完成(收到响应)时,服务会请求另一个请求,直到等待请求的总数为 15。
单个请求返回一个列表并根据结果触发另一个请求。
此时,我想以有限的并发发送请求。 因为消费者端,过多的HTTP请求使得对端服务器陷入困境。
我像下面那样使用flatMapMany
。
public Flux<JsonNode> syncData() {
return service1
.getData(param1)
.flatMapMany(res -> {
List<Mono<JsonNode>> totalTask = new ArrayList<>();
Map<String, Object> originData = service2.getDataFromDB(param2);
res.withArray("data").forEach(row -> {
String id = row.get("id").asText();
if (originData.containsKey(id)) {
totalTask.add(service1.updateRequest(param3));
} else {
totalTask.add(service1.deleteRequest(param4));
}
originData.remove(id);
});
for (left) {
totalTask.add(service1.createRequest(param5));
}
return Flux.merge(totalTask);
});
}
void syncData() {
syncDataService.syncData().????;
}
我尝试链接.window(15)
,但它不起作用。 所有请求同时发送。
我如何处理Flux
以达到我的目标?
恐怕 Project Reactor 不提供任何速率或时间限制的实现。
但是,您可以找到一堆提供此类功能并与 Project Reactor 兼容的 3rd 方库。 据我所知, resilience4-reactor支持这一点,并且还与 Spring 和 Spring Boot 框架兼容。
RateLimiterOperator
检查下游订阅者/观察者是否可以获得订阅上游发布者的权限。 如果超过速率限制,RateLimiterOperator
可以延迟从上游请求数据,也可以向下游订阅者发出RequestNotPermitted
错误。
RateLimiter rateLimiter = RateLimiter.ofDefaults("name");
Mono.fromCallable(backendService::doSomething)
.transformDeferred(RateLimiterOperator.of(rateLimiter))
更多关于 RateLimiter 模块本身的信息: https : //resilience4j.readme.io/docs/ratelimiter
flatMap
采用concurrency
参数: https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#flatMap-java.util.function.Function-int-
Mono<User> getById(int userId) { ... }
Flux.just(1, 2, 3, 4).flatMap(client::getById, 2)
将并发请求数限制为 2。
您可以在 Flux 上使用limitRate
。 您可能需要稍微重新格式化您的代码,但请参阅此处的文档: https : //projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#limitRate-int-
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.