Interface RateLimiter<R>
-
- Type Parameters:
R- result type
- All Superinterfaces:
Policy<R>
- All Known Implementing Classes:
RateLimiterImpl
public interface RateLimiter<R> extends Policy<R>
A rate limiter allows you to control the rate of executions as a way of preventing system overload.There are two types of rate limiting: smooth and bursty. Smooth rate limiting will evenly spread out execution requests over-time, effectively smoothing out uneven execution request rates. Bursty rate limiting allows potential bursts of executions to occur, up to a configured max per time period.
Rate limiting is based on permits, which can be requested in order to perform rate limited execution. Permits are automatically refreshed over time based on the rate limiter's configuration.
This class provides methods that block while waiting for permits to become available, and also methods that return immediately. The blocking methods include:
acquirePermit()acquirePermits(int)acquirePermit(Duration)acquirePermits(int, Duration)tryAcquirePermit(Duration)tryAcquirePermits(int, Duration)
The methods that return immediately include:
tryAcquirePermit()tryAcquirePermits(int)reservePermit()reservePermits(int)tryReservePermit(Duration)tryReservePermits(int, Duration)
This class also provides methods that throw
RateLimitExceededExceptionwhen permits cannot be acquired, and also methods that return a boolean. Theacquiremethods all throwRateLimitExceededExceptionwhen permits cannot be acquired, and thetryAcquiremethods return a boolean.The
reservemethods attempt to reserve permits and return an expected wait time before the permit can be used. This helps integrate with scenarios where you need to wait externallyThis class is threadsafe.
-
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Default Methods Modifier and Type Method Description default voidacquirePermit()Attempts to acquire a permit to perform an execution against the rate limiter, waiting until one is available or the thread is interrupted.default voidacquirePermit(java.time.Duration maxWaitTime)Attempts to acquire a permit to perform an execution against the rate limiter, waiting up to themaxWaitTimeuntil one is available, else throwingRateLimitExceededExceptionif a permit will not be available in time.voidacquirePermits(int permits)Attempts to acquire the requestedpermitsto perform executions against the rate limiter, waiting until they are available or the thread is interrupted.default voidacquirePermits(int permits, java.time.Duration maxWaitTime)Attempts to acquire the requestedpermitsto perform executions against the rate limiter, waiting up to themaxWaitTimeuntil they are available, else throwingRateLimitExceededExceptionif the permits will not be available in time.static <R> RateLimiterBuilder<R>builder(RateLimiterConfig<R> config)Creates a new RateLimiterBuilder that will be based on theconfig.static <R> RateLimiterBuilder<R>burstyBuilder(long maxExecutions, java.time.Duration period)RateLimiterConfig<R>getConfig()Returns theRateLimiterConfigthat the RateLimiter was built with.default booleanisBursty()Returns whether the rate limiter is bursty.default booleanisSmooth()Returns whether the rate limiter is smooth.default java.time.DurationreservePermit()Reserves a permit to perform an execution against the rate limiter, and returns the time that the caller is expected to wait before acting on the permit.java.time.DurationreservePermits(int permits)Reserves thepermitsto perform executions against the rate limiter, and returns the time that the caller is expected to wait before acting on the permits.static <R> RateLimiterBuilder<R>smoothBuilder(long maxExecutions, java.time.Duration period)Returns a smoothRateLimiterBuilderfor themaxExecutionsandperiod, which control how frequently an execution is permitted.static <R> RateLimiterBuilder<R>smoothBuilder(java.time.Duration maxRate)Returns a smoothRateLimiterBuilderfor themaxRate, which controls how frequently an execution is permitted.default booleantryAcquirePermit()Tries to acquire a permit to perform an execution against the rate limiter, returning immediately without waiting.default booleantryAcquirePermit(java.time.Duration maxWaitTime)Tries to acquire a permit to perform an execution against the rate limiter, waiting up to themaxWaitTimeuntil they are available.booleantryAcquirePermits(int permits)Tries to acquire the requestedpermitsto perform executions against the rate limiter, returning immediately without waiting.booleantryAcquirePermits(int permits, java.time.Duration maxWaitTime)Tries to acquire the requestedpermitsto perform executions against the rate limiter, waiting up to themaxWaitTimeuntil they are available.default java.time.DurationtryReservePermit(java.time.Duration maxWaitTime)Tries to reserve a permit to perform an execution against the rate limiter, and returns the time that the caller is expected to wait before acting on the permit, as long as it's less than themaxWaitTime.java.time.DurationtryReservePermits(int permits, java.time.Duration maxWaitTime)Tries to reserve thepermitsto perform executions against the rate limiter, and returns the time that the caller is expected to wait before acting on the permits, as long as it's less than themaxWaitTime.-
Methods inherited from interface dev.failsafe.Policy
toExecutor
-
-
-
-
Method Detail
-
smoothBuilder
static <R> RateLimiterBuilder<R> smoothBuilder(long maxExecutions, java.time.Duration period)
Returns a smoothRateLimiterBuilderfor themaxExecutionsandperiod, which control how frequently an execution is permitted. The individual execution rate is computed asperiod / maxExecutions. For example, withmaxExecutionsof100and aperiodof1000 millis, individual executions will be permitted at a max rate of one every 10 millis.By default, the returned
RateLimiterBuilderwill have amax wait timeof0.Executions are performed with no delay until they exceed the max rate, after which executions are either rejected or will block and wait until the
max wait timeis exceeded.- Parameters:
maxExecutions- The max number of permitted executions perperiodperiod- The period after which permitted executions are reset to themaxExecutions
-
smoothBuilder
static <R> RateLimiterBuilder<R> smoothBuilder(java.time.Duration maxRate)
Returns a smoothRateLimiterBuilderfor themaxRate, which controls how frequently an execution is permitted. For example, amaxRateofDuration.ofMillis(10)would allow up to one execution every 10 milliseconds.By default, the returned
RateLimiterBuilderwill have amax wait timeof0.Executions are performed with no delay until they exceed the
maxRate, after which executions are either rejected or will block and wait until themax wait timeis exceeded.- Parameters:
maxRate- at which individual executions should be permitted
-
burstyBuilder
static <R> RateLimiterBuilder<R> burstyBuilder(long maxExecutions, java.time.Duration period)
Returns a burstyRateLimiterBuilderfor themaxExecutionsperperiod. For example, amaxExecutionsvalue of100with aperiodofDuration.ofSeconds(1)would allow up to 100 executions every 1 second.By default, the returned
RateLimiterBuilderwill have amax wait timeof0.Executions are performed with no delay up until the
maxExecutionsare reached for the currentperiod, after which executions are either rejected or will block and wait until themax wait timeis exceeded.- Parameters:
maxExecutions- The max number of permitted executions perperiodperiod- The period after which permitted executions are reset to themaxExecutions
-
builder
static <R> RateLimiterBuilder<R> builder(RateLimiterConfig<R> config)
Creates a new RateLimiterBuilder that will be based on theconfig.
-
getConfig
RateLimiterConfig<R> getConfig()
Returns theRateLimiterConfigthat the RateLimiter was built with.
-
acquirePermit
default void acquirePermit() throws java.lang.InterruptedExceptionAttempts to acquire a permit to perform an execution against the rate limiter, waiting until one is available or the thread is interrupted.- Throws:
java.lang.InterruptedException- if the current thread is interrupted while waiting to acquire a permit- See Also:
tryAcquirePermit(),reservePermit()
-
acquirePermits
void acquirePermits(int permits) throws java.lang.InterruptedExceptionAttempts to acquire the requestedpermitsto perform executions against the rate limiter, waiting until they are available or the thread is interrupted.- Throws:
java.lang.IllegalArgumentException- ifpermitsis < 1java.lang.InterruptedException- if the current thread is interrupted while waiting to acquire thepermits- See Also:
tryAcquirePermits(int),reservePermits(int)
-
acquirePermit
default void acquirePermit(java.time.Duration maxWaitTime) throws java.lang.InterruptedExceptionAttempts to acquire a permit to perform an execution against the rate limiter, waiting up to themaxWaitTimeuntil one is available, else throwingRateLimitExceededExceptionif a permit will not be available in time.- Throws:
java.lang.NullPointerException- ifmaxWaitTimeis nullRateLimitExceededException- if the rate limiter cannot acquire a permit within themaxWaitTimejava.lang.InterruptedException- if the current thread is interrupted while waiting to acquire a permit- See Also:
tryAcquirePermit(Duration)
-
acquirePermits
default void acquirePermits(int permits, java.time.Duration maxWaitTime) throws java.lang.InterruptedExceptionAttempts to acquire the requestedpermitsto perform executions against the rate limiter, waiting up to themaxWaitTimeuntil they are available, else throwingRateLimitExceededExceptionif the permits will not be available in time.- Throws:
java.lang.IllegalArgumentException- ifpermitsis < 1java.lang.NullPointerException- ifmaxWaitTimeis nullRateLimitExceededException- if the rate limiter cannot acquire a permit within themaxWaitTimejava.lang.InterruptedException- if the current thread is interrupted while waiting to acquire thepermits- See Also:
tryAcquirePermits(int, Duration)
-
isSmooth
default boolean isSmooth()
Returns whether the rate limiter is smooth.
-
isBursty
default boolean isBursty()
Returns whether the rate limiter is bursty.- See Also:
burstyBuilder(long, Duration)
-
reservePermit
default java.time.Duration reservePermit()
Reserves a permit to perform an execution against the rate limiter, and returns the time that the caller is expected to wait before acting on the permit. Returns0if the permit is immediately available and no waiting is needed.- See Also:
acquirePermit(),tryAcquirePermit()
-
reservePermits
java.time.Duration reservePermits(int permits)
Reserves thepermitsto perform executions against the rate limiter, and returns the time that the caller is expected to wait before acting on the permits. Returns0if the permits are immediately available and no waiting is needed.- Throws:
java.lang.IllegalArgumentException- ifpermitsis < 1- See Also:
acquirePermits(int),tryAcquirePermits(int)
-
tryReservePermit
default java.time.Duration tryReservePermit(java.time.Duration maxWaitTime)
Tries to reserve a permit to perform an execution against the rate limiter, and returns the time that the caller is expected to wait before acting on the permit, as long as it's less than themaxWaitTime.- Returns the expected wait time for the permit if it was successfully reserved.
- Returns
0if the permit was successfully reserved and no waiting is needed. - Returns
-1 nanosecondsif the permit was not reserved because the wait time would be greater than themaxWaitTime.
- Throws:
java.lang.NullPointerException- ifmaxWaitTimeis null- See Also:
acquirePermit(Duration),tryAcquirePermit(Duration)
-
tryReservePermits
java.time.Duration tryReservePermits(int permits, java.time.Duration maxWaitTime)Tries to reserve thepermitsto perform executions against the rate limiter, and returns the time that the caller is expected to wait before acting on the permits, as long as it's less than themaxWaitTime.- Returns the expected wait time for the permits if they were successfully reserved.
- Returns
0if the permits were successfully reserved and no waiting is needed. - Returns
-1 nanosecondsif the permits were not reserved because the wait time would be greater than themaxWaitTime.
- Throws:
java.lang.IllegalArgumentException- ifpermitsis < 1java.lang.NullPointerException- ifmaxWaitTimeis null- See Also:
acquirePermit(Duration),tryAcquirePermit(Duration)
-
tryAcquirePermit
default boolean tryAcquirePermit()
Tries to acquire a permit to perform an execution against the rate limiter, returning immediately without waiting.- Returns:
- whether the requested
permitsare successfully acquired or not - See Also:
acquirePermit(),reservePermits(int)
-
tryAcquirePermits
boolean tryAcquirePermits(int permits)
Tries to acquire the requestedpermitsto perform executions against the rate limiter, returning immediately without waiting.- Returns:
- whether the requested
permitsare successfully acquired or not - Throws:
java.lang.IllegalArgumentException- ifpermitsis < 1- See Also:
acquirePermits(int)
-
tryAcquirePermit
default boolean tryAcquirePermit(java.time.Duration maxWaitTime) throws java.lang.InterruptedExceptionTries to acquire a permit to perform an execution against the rate limiter, waiting up to themaxWaitTimeuntil they are available.- Returns:
- whether a permit is successfully acquired
- Throws:
java.lang.NullPointerException- ifmaxWaitTimeis nulljava.lang.InterruptedException- if the current thread is interrupted while waiting to acquire a permit- See Also:
acquirePermit(Duration)
-
tryAcquirePermits
boolean tryAcquirePermits(int permits, java.time.Duration maxWaitTime) throws java.lang.InterruptedExceptionTries to acquire the requestedpermitsto perform executions against the rate limiter, waiting up to themaxWaitTimeuntil they are available.- Returns:
- whether the requested
permitsare successfully acquired or not - Throws:
java.lang.IllegalArgumentException- ifpermitsis < 1java.lang.NullPointerException- ifmaxWaitTimeis nulljava.lang.InterruptedException- if the current thread is interrupted while waiting to acquire thepermits- See Also:
acquirePermits(int, Duration)
-
-