Class: R4r::RetryBudget Abstract
- Inherits:
-
Object
- Object
- R4r::RetryBudget
- Defined in:
- lib/r4r/retry_budget.rb
Overview
Represents a budget for retrying requests.
A retry budget is useful for attenuating the amplifying effects of many clients within a process retrying requests multiple times. This acts as a form of coordination between those retries.
A Ruby port of the finagle’s RetryBudget.
Direct Known Subclasses
Class Method Summary collapse
-
.create(ttl_ms: nil, min_retries_per_second: nil, percent_can_retry: nil, clock: nil) ⇒ Object
Creates a RetryBudget that allows for about ‘percent_can_retry` percent of the total #deposit requests to be retried.
-
.empty ⇒ Object
Creates an empty retry budget.
-
.infinite ⇒ Object
Creates an infinite retry budget.
Instance Method Summary collapse
-
#balance ⇒ Object
The balance or number of retries that can be made now.
-
#deposit ⇒ Object
Indicates a deposit, or credit, which will typically permit future withdrawals.
-
#try_withdraw ⇒ Boolean
Check whether or not there is enough balance remaining to issue a retry, or make a withdrawal.
Class Method Details
.create(ttl_ms: nil, min_retries_per_second: nil, percent_can_retry: nil, clock: nil) ⇒ Object
Creates a R4r::RetryBudget that allows for about ‘percent_can_retry` percent of the total #deposit requests to be retried.
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/r4r/retry_budget.rb', line 53 def self.create(ttl_ms: nil, min_retries_per_second: nil, percent_can_retry: nil, clock: nil) ttl_ms = (ttl_ms || R4r::TokenRetryBudget::DEFAULT_TTL_MS).to_i min_retries_per_second = (min_retries_per_second || 10).to_i percent_can_retry = (percent_can_retry.to_f || 0.2).to_f unless ttl_ms >= 0 && ttl_ms <= 60 * 1000 raise ArgumentError, "ttl_ms must be in [1.second, 60.seconds], got #{ttl_ms}" end unless min_retries_per_second >= 0 raise ArgumentError, "min_retries_per_second cannot be nagative, got #{min_retries_per_second}" end unless percent_can_retry >= 0.0 raise ArgumentError, "percent_can_retry cannot be negative, got #{percent_can_retry}" end unless percent_can_retry <= R4r::TokenRetryBudget::SCALE_FACTOR raise ArgumentError, "percent_can_retry cannot be greater then #{R4r::TokenRetryBudget::SCALE_FACTOR}, got #{percent_can_retry}" end if min_retries_per_second == 0 && percent_can_retry == 0.0 return R4r::RetryBudget.empty end deposit_amount = percent_can_retry == 0.0 ? 0 : R4r::TokenRetryBudget::SCALE_FACTOR.to_i withdrawal_amount = percent_can_retry == 0.0 ? 1 : (R4r::TokenRetryBudget::SCALE_FACTOR / percent_can_retry).to_i reserve = min_retries_per_second * (ttl_ms / 1000) * withdrawal_amount bucket = R4r::LeakyTokenBucket.new(ttl_ms: ttl_ms, reserve: reserve, clock: clock) R4r::TokenRetryBudget.new(bucket: bucket, deposit_amount: deposit_amount, withdrawal_amount: withdrawal_amount) end |
.empty ⇒ Object
Creates an empty retry budget.
83 84 85 |
# File 'lib/r4r/retry_budget.rb', line 83 def self.empty EmptyRetryBudget.new end |
.infinite ⇒ Object
Creates an infinite retry budget.
88 89 90 |
# File 'lib/r4r/retry_budget.rb', line 88 def self.infinite InfiniteRetryBudget.new end |
Instance Method Details
#balance ⇒ Object
The balance or number of retries that can be made now.
31 32 33 |
# File 'lib/r4r/retry_budget.rb', line 31 def balance raise NotImplementedError end |
#deposit ⇒ Object
Indicates a deposit, or credit, which will typically permit future withdrawals.
16 17 18 |
# File 'lib/r4r/retry_budget.rb', line 16 def deposit raise NotImplementedError end |
#try_withdraw ⇒ Boolean
Check whether or not there is enough balance remaining to issue a retry, or make a withdrawal.
26 27 28 |
# File 'lib/r4r/retry_budget.rb', line 26 def try_withdraw raise NotImplementedError end |