Project reactor 弹性4J速率限制器在项目反应堆中工作不正常?
我目前正在研究resilience4j库,由于某些原因,以下代码无法按预期工作: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
@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()