Module: Clicksign::RetryBackoff
- Defined in:
- lib/clicksign/retry_backoff.rb
Constant Summary collapse
- BASE_SECONDS =
0.5- CAP_SECONDS =
30.0
Class Method Summary collapse
- .ceiling(attempt) ⇒ Object
-
.delay(attempt, rng: Random) ⇒ Object
Full jitter: uniform in [0, ceiling) to spread retries and avoid thundering herd.
- .parse_retry_after(headers) ⇒ Object
- .retry_delay(attempt, headers = nil, rng: Random) ⇒ Object
Class Method Details
.ceiling(attempt) ⇒ Object
10 11 12 |
# File 'lib/clicksign/retry_backoff.rb', line 10 def ceiling(attempt) [BASE_SECONDS * (2**(attempt - 1)), CAP_SECONDS].min.to_f end |
.delay(attempt, rng: Random) ⇒ Object
Full jitter: uniform in [0, ceiling) to spread retries and avoid thundering herd.
15 16 17 18 19 20 |
# File 'lib/clicksign/retry_backoff.rb', line 15 def delay(attempt, rng: Random) max = ceiling(attempt) return 0.0 if max <= 0 rng.rand(max) end |
.parse_retry_after(headers) ⇒ Object
22 23 24 25 26 27 28 29 30 31 |
# File 'lib/clicksign/retry_backoff.rb', line 22 def parse_retry_after(headers) return nil unless headers.is_a?(Hash) raw = headers['retry-after'] || headers['Retry-After'] return nil if raw.nil? || raw.to_s.strip.empty? Float(raw.to_s.strip) rescue ArgumentError, TypeError nil end |
.retry_delay(attempt, headers = nil, rng: Random) ⇒ Object
33 34 35 36 37 |
# File 'lib/clicksign/retry_backoff.rb', line 33 def retry_delay(attempt, headers = nil, rng: Random) jitter = delay(attempt, rng: rng) retry_after = parse_retry_after(headers) retry_after ? [jitter, retry_after].max : jitter end |