public class TokenBucket extends Object
Modifier and Type | Class and Description |
---|---|
static interface |
TokenBucket.Clock |
Constructor and Description |
---|
TokenBucket() |
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.
|
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 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)