You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
RateLimiter rateLimiter = RateLimiter.create(10, 500, TimeUnit.MILLISECONDS);
for (int i = 0; i < 100; i++) {
boolean ret = rateLimiter.tryAcquire();
log.info("tryAcquire result:{}", ret);
Thread.sleep(120);
}
The log is follow:
15:16:02.816 [main] INFO com.xiaohongshu.kula.test.guava.Test - tryAcquire result:true
15:16:02.938 [main] INFO com.xiaohongshu.kula.test.guava.Test - tryAcquire result:false
15:16:03.060 [main] INFO com.xiaohongshu.kula.test.guava.Test - tryAcquire result:true
15:16:03.186 [main] INFO com.xiaohongshu.kula.test.guava.Test - tryAcquire result:false
15:16:03.311 [main] INFO com.xiaohongshu.kula.test.guava.Test - tryAcquire result:true
15:16:03.433 [main] INFO com.xiaohongshu.kula.test.guava.Test - tryAcquire result:false
Set permitsPerSecond to 10. Every time call tryAcquire, sleep 120ms. The expect tryAcquire result is always true after a while, but the log show that tryAcquire result is true,false,true,false forever. The max rate can reach only 5 per second.
The text was updated successfully, but these errors were encountered:
I made some debug and found the reason of the bug.But I have no idea to fix the bug unless I break original structrue of the code.
This bug was resulted by the initial value of the storedPermits in SmoothWarmingUp.Although not any stable interval passed by ,the the initial value of the storedPermits equals to maxPermits which can ensure the throttling time follow the image of function below(form high to low).
^ throttling
|
cold + /
interval | / .
| / .
| / . ← "warmup period" is the area of the trapezoid between
| / . thresholdPermits and maxPermits
| / .
| / .
| / .
stable +---------- / WARM .
nterval | . UP .
| . PERIOD.
| . .
0 +----------+-------+--------------→ storedPermits
0 thresholdPermits maxPermits
However,if the consumption of permit is slower than the production of permit,the SmoothWarmingUp would always run in warm up period regardless of whether it is in the warmup phase.
Last but not least,I would be very grateful if someone can give me suggestions for fixing this bug. @kevinb9n@xhd731568849@kulallwang
RateLimiter rateLimiter = RateLimiter.create(10, 500, TimeUnit.MILLISECONDS);
for (int i = 0; i < 100; i++) {
boolean ret = rateLimiter.tryAcquire();
log.info("tryAcquire result:{}", ret);
Thread.sleep(120);
}
The log is follow:
15:16:02.816 [main] INFO com.xiaohongshu.kula.test.guava.Test - tryAcquire result:true
15:16:02.938 [main] INFO com.xiaohongshu.kula.test.guava.Test - tryAcquire result:false
15:16:03.060 [main] INFO com.xiaohongshu.kula.test.guava.Test - tryAcquire result:true
15:16:03.186 [main] INFO com.xiaohongshu.kula.test.guava.Test - tryAcquire result:false
15:16:03.311 [main] INFO com.xiaohongshu.kula.test.guava.Test - tryAcquire result:true
15:16:03.433 [main] INFO com.xiaohongshu.kula.test.guava.Test - tryAcquire result:false
Set permitsPerSecond to 10. Every time call tryAcquire, sleep 120ms. The expect tryAcquire result is always true after a while, but the log show that tryAcquire result is true,false,true,false forever. The max rate can reach only 5 per second.
The text was updated successfully, but these errors were encountered: