public class RateLimitingTokenBucket extends Object
Modifier and Type | Class and Description |
---|---|
static interface |
RateLimitingTokenBucket.Clock |
Constructor and Description |
---|
RateLimitingTokenBucket() |
Modifier and Type | Method and Description |
---|---|
boolean |
acquire(double amount)
Acquire tokens from the bucket.
|
boolean |
acquire(double amount,
boolean fastFail)
Acquire tokens from the bucket.
|
OptionalDouble |
acquireNonBlocking(double amount,
boolean fastFail)
Acquire capacity from the rate limiter without blocking the call.
|
void |
updateClientSendingRate(boolean throttlingResponse)
_UpdateClientSendingRate(response)
_UpdateMeasuredRate()
if IsThrottlingError(response)
if not enabled
rate_to_use = measured_tx_rate
else
rate_to_use = min(measured_tx_rate, fill_rate)
# The fill_rate is from the token bucket.
|
public boolean acquire(double amount)
_TokenBucketAcquire(amount) # Client side throttling is not enabled until we see a throttling error. if not enabled return _TokenBucketRefill() # Next see if we have enough capacity for the requested amount. if amount <= current_capacity current_capacity = current_capacity - amount else sleep((amount - current_capacity) / fill_rate) current_capacity = current_capacity - amount return
This is equivalent to acquire(amount, false)
.
amount
- The amount of tokens to acquire.public boolean acquire(double amount, boolean fastFail)
fastFail
. If it is true
, then it will return false
immediately, signaling that
enough capacity could not be acquired. Otherwise if fastFail
is
false
, then it will wait the required amount of time to fill the
bucket with enough tokens to satisfy amount
.
_TokenBucketAcquire(amount) # Client side throttling is not enabled until we see a throttling error. if not enabled return _TokenBucketRefill() # Next see if we have enough capacity for the requested amount. if amount <= current_capacity current_capacity = current_capacity - amount else sleep((amount - current_capacity) / fill_rate) current_capacity = current_capacity - amount return
amount
- The amount of tokens to acquire.fastFail
- Whether this method should return immediately instead
of waiting if amount
exceeds the current
capacity.public OptionalDouble acquireNonBlocking(double amount, boolean fastFail)
This method returns an OptionalDouble
whose value, or its absence correspond to the following states:
public void updateClientSendingRate(boolean throttlingResponse)
_UpdateClientSendingRate(response) _UpdateMeasuredRate() if IsThrottlingError(response) if not enabled rate_to_use = measured_tx_rate else rate_to_use = min(measured_tx_rate, fill_rate) # The fill_rate is from the token bucket. last_max_rate = rate_to_use _CalculateTimeWindow() last_throttle_time = time() calculated_rate = _CUBICThrottle(rate_to_use) TokenBucketEnable() else _CalculateTimeWindow() calculated_rate = _CUBICSuccess(time()) new_rate = min(calculated_rate, 2 * measured_tx_rate) _TokenBucketUpdateRate(new_rate)
Copyright © 2021. All rights reserved.