API to throttle/rate-limit requests
This API implements two popular throttling strategies, namely:
- Fixed token bucket
- Leaky token bucket
Details for this implementation can be found at: Token Bucket
Details for this implementation can be found at: Leaky Bucket With in the API, Leaky buckets have been implemented as two types
- StepDownLeakyTokenBucketStrategy
- StepUpLeakyTokenBucketStrategy
StepDownLeakyTokenBucketStrategy resembles a bucket which has been filled with tokens at the beginning but subsequently leaks tokens at a fixed interval. StepUpLeakyTokenBucketStrategy resemembles an empty bucket at the beginning but get filled will tokens over a fixed interval.
// construct strategy
ThrottleStrategy strategy = new FixedTokenBucketStrategy(100, 1, TimeUnit.MINUTES);
// provide the strategy to the throttler
Throttle throttle = new Throttle(strategy);
// throttle :)
boolean isThrottled = throttle.canProceed();
if(!isThrottled){
// your logic
}
// construct strategy
ThrottleStrategy strategy = new StepUpLeakyTokenBucketStrategy(100, 1, TimeUnit.MINUTES, 25, 15, TimeUnit.SECONDS);
// provide the strategy to the throttler
Throttle throttle = new Throttle(strategy);
// throttle :)
boolean isThrottled = throttle.canProceed();
if(!isThrottled){
// your logic
}
// construct strategy
ThrottleStrategy strategy = new StepDownLeakyTokenBucketStrategy(100, 1, TimeUnit.MINUTES, 25, 15, TimeUnit.SECONDS);
// provide the strategy to the throttler
Throttle throttle = new Throttle(strategy);
// throttle :)
boolean isThrottled = throttle.canProceed();
if(!isThrottled){
// your logic
}
// construct strategy
ThrottleStrategy strategy = new FixedTokenBucketStrategy(100, 1, TimeUnit.MINUTES);
// provide the strategy to the throttler
Throttle throttle = new Throttle(strategy);
while(!throttle.canProceed()){
Thread.sleep(throttle.waitTime(TimeUnit.MILLISECONDS));
}
// your logic