Class: Retriable::ExponentialBackoff

Inherits:
Object
  • Object
show all
Includes:
Validation
Defined in:
lib/retriable/exponential_backoff.rb

Constant Summary collapse

ATTRIBUTES =
%i[
  tries
  base_interval
  multiplier
  max_interval
  rand_factor
].freeze
DEFAULTS =
{
  tries: 3,
  base_interval: 0.5,
  max_interval: 60,
  rand_factor: 0.5,
  multiplier: 1.5
}.freeze

Instance Method Summary collapse

Methods included from Validation

unbounded_tries?

Constructor Details

#initialize(opts = {}) ⇒ ExponentialBackoff

Returns a new instance of ExponentialBackoff.



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/retriable/exponential_backoff.rb', line 27

def initialize(opts = {})
  @tries         = DEFAULTS[:tries]
  @base_interval = DEFAULTS[:base_interval]
  @max_interval  = DEFAULTS[:max_interval]
  @rand_factor   = DEFAULTS[:rand_factor]
  @multiplier    = DEFAULTS[:multiplier]

  opts.each do |k, v|
    raise ArgumentError, "#{k} is not a valid option" if !ATTRIBUTES.include?(k)

    instance_variable_set(:"@#{k}", v)
  end

  validate!
end

Instance Method Details

#interval_providerObject



48
49
50
51
52
53
54
55
56
57
# File 'lib/retriable/exponential_backoff.rb', line 48

def interval_provider
  raw_interval = base_interval

  lambda do |_iteration|
    interval = [raw_interval, max_interval].min
    raw_interval = next_raw_interval(raw_interval)

    rand_factor.zero? ? interval : randomize(interval)
  end
end

#intervalsObject



43
44
45
46
# File 'lib/retriable/exponential_backoff.rb', line 43

def intervals
  provider = interval_provider
  Array.new(tries) { |iteration| provider.call(iteration) }
end