繁体   English   中英

如何使用 Mono & Flux 限制并发 http 请求

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM