Project reactor 弹性4J速率限制器在项目反应堆中工作不正常?

Project reactor 弹性4J速率限制器在项目反应堆中工作不正常?,project-reactor,resilience4j,Project Reactor,Resilience4j,我目前正在研究resilience4j库,由于某些原因,以下代码无法按预期工作: @Test public void testRateLimiterProjectReactor() { // The configuration below will allow 2 requests per second and a "timeout" of 2 seconds. RateLimiterConfig config = RateLimiterConfig.cust

我目前正在研究resilience4j库,由于某些原因,以下代码无法按预期工作:

@Test
public void testRateLimiterProjectReactor()
{
    // The configuration below will allow 2 requests per second and a "timeout" of 2 seconds.
    RateLimiterConfig config = RateLimiterConfig.custom()
                                                .limitForPeriod(2)
                                                .limitRefreshPeriod(Duration.ofSeconds(1))
                                                .timeoutDuration(Duration.ofSeconds(2))
                                                .build();

    // Step 2.
    // Create a RateLimiter and use it.
    RateLimiterRegistry registry = RateLimiterRegistry.of(config);
    RateLimiter rateLimiter = registry.rateLimiter("myReactorServiceNameLimiter");

    // Step 3.
    Flux<Integer> flux = Flux.from(Flux.range(0, 10))
                             .transformDeferred(RateLimiterOperator.of(rateLimiter))
                             .log()

        ;

    StepVerifier.create(flux)
                .expectNextCount(10)
                .expectComplete()
                .verify()
    ;
}

我看不出有什么不对?

正如上面评论中已经回答的那样,RateLimiter跟踪的是订阅数量,而不是元素。要实现对元素的速率限制,可以使用limitRate(和buffer+delayElements)。 比如说,

通量范围(1100) .delayElements(Duration.ofMillis(100))//模仿以一定速率生成元素的发布者 .log() .limitRate(10)//用于从发布服务器请求最多10个元素 .buffer(10)//将整数按10个元素分组 .delayElements(Duration.ofSeconds(2))//每2秒发出一组整数 .subscribe(System.out::println);
resilience4j rate limiter限制订阅数量,而不是elementsFlux也有内置的rate limiter作为替代:感谢您的确认!是的,在过去的几个小时里,我一直在看代码,并注意到javadocs中也有这样的代码。我对
limitRate
的问题是它是固定的-一旦你组装了
Flux
你就不能改变速率,这就是我尝试弹性4j的原因。这是一个延续,我目前正在研究,一旦有太多的错误/重试开始堆积,您可以通过某种方式逐渐降低限制。有什么想法吗?请随意回答最初的问题(它确实限制了订阅)。
15:08:24.587 [main] DEBUG reactor.util.Loggers - Using Slf4j logging framework
15:08:24.619 [main] INFO reactor.Flux.Defer.1 - onSubscribe(RateLimiterSubscriber)
15:08:24.624 [main] INFO reactor.Flux.Defer.1 - request(unbounded)
15:08:24.626 [main] INFO reactor.Flux.Defer.1 - onNext(0)
15:08:24.626 [main] INFO reactor.Flux.Defer.1 - onNext(1)
15:08:24.626 [main] INFO reactor.Flux.Defer.1 - onNext(2)
15:08:24.626 [main] INFO reactor.Flux.Defer.1 - onNext(3)
15:08:24.626 [main] INFO reactor.Flux.Defer.1 - onNext(4)
15:08:24.626 [main] INFO reactor.Flux.Defer.1 - onNext(5)
15:08:24.626 [main] INFO reactor.Flux.Defer.1 - onNext(6)
15:08:24.626 [main] INFO reactor.Flux.Defer.1 - onNext(7)
15:08:24.626 [main] INFO reactor.Flux.Defer.1 - onNext(8)
15:08:24.626 [main] INFO reactor.Flux.Defer.1 - onNext(9)
15:08:24.626 [main] INFO reactor.Flux.Defer.1 - onComplete()