It’s been a while since I’ve been working on this project. It is a rate limiter based on the atomic rate limiter from Resilience4j. The key difference is that the atomic rate limiter gets the permissions assigned per cycle while the refill-rate-limiter will split the permissions in a cycle and gradually refill them. In an essence it simulates a token bucket algorithm however it uses the atomic rate limiter internals
Using it is very simple.
Import it using maven.
<dependencies> ... <dependency> <groupId>io.github.gkatzioura</groupId> <artifactId>refill-rate-limiter</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-ratelimiter</artifactId> <version>1.7.1</version> </dependency> ... </dependencies>
And use it in your code base.
... RefillRateLimiterConfig refillRateLimiterConfig = new RefillRateLimiterConfig.Builder() .limitRefreshPeriod(Duration.of(2, ChronoUnit.SECONDS)) .limitForPeriod(1) .permitCapacity(1) .build(); refillRateLimiter = new RefillRateLimiter("default", refillRateLimiterConfig, io.vavr.collection.HashMap.empty()); ... boolean allowed = refillRateLimiter.acquirePermission(1);
Just like Resilience4j it also has Apache Licence V2.
It spawned from an pr on the Resilience4j, since the merge time took longer I made it available as a standalone implementation. It would not hurt if you thumps up on pr so it ends up to the place it belongs 😉
A description of the algorithm can be found on GitHub. Benchmarks and integrations will follow.