Class: CMDx::Retriers

Inherits:
Object
  • Object
show all
Defined in:
lib/cmdx/retriers.rb,
lib/cmdx/retriers/linear.rb,
lib/cmdx/retriers/fibonacci.rb,
lib/cmdx/retriers/exponential.rb,
lib/cmdx/retriers/full_random.rb,
lib/cmdx/retriers/half_random.rb,
lib/cmdx/retriers/bounded_random.rb,
lib/cmdx/retriers/decorrelated_jitter.rb

Overview

Registry of named retry/jitter strategies used by Retry to compute the sleep duration between attempts. Ships with built-ins for :exponential, :half_random, :full_random, :bounded_random, :linear, :fibonacci, and :decorrelated_jitter. A retrier is any callable accepting call(attempt, delay, prev_delay) that returns the next delay in seconds.

Defined Under Namespace

Modules: BoundedRandom, DecorrelatedJitter, Exponential, Fibonacci, FullRandom, HalfRandom, Linear

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRetriers

Returns a new instance of Retriers.



13
14
15
16
17
18
19
20
21
22
23
# File 'lib/cmdx/retriers.rb', line 13

def initialize
  @registry = {
    exponential: Retriers::Exponential,
    half_random: Retriers::HalfRandom,
    full_random: Retriers::FullRandom,
    bounded_random: Retriers::BoundedRandom,
    linear: Retriers::Linear,
    fibonacci: Retriers::Fibonacci,
    decorrelated_jitter: Retriers::DecorrelatedJitter
  }
end

Instance Attribute Details

#registryObject (readonly)

Returns the value of attribute registry.



11
12
13
# File 'lib/cmdx/retriers.rb', line 11

def registry
  @registry
end

Instance Method Details

#deregister(name) ⇒ Retriers

Returns self for chaining.

Parameters:

  • name (Symbol)

Returns:



55
56
57
58
# File 'lib/cmdx/retriers.rb', line 55

def deregister(name)
  registry.delete(name.to_sym)
  self
end

#empty?Boolean

Returns:

  • (Boolean)


96
97
98
# File 'lib/cmdx/retriers.rb', line 96

def empty?
  registry.empty?
end

#initialize_copy(source) ⇒ void

This method returns an undefined value.

Parameters:

  • source (Retriers)

    registry to duplicate



27
28
29
# File 'lib/cmdx/retriers.rb', line 27

def initialize_copy(source)
  @registry = source.registry.dup
end

#key?(name) ⇒ Boolean

Returns whether a retrier is registered under name.

Parameters:

  • name (Symbol)

Returns:

  • (Boolean)

    whether a retrier is registered under name



62
63
64
# File 'lib/cmdx/retriers.rb', line 62

def key?(name)
  registry.key?(name.to_sym)
end

#lookup(name) ⇒ #call

Returns the registered retrier.

Parameters:

  • name (Symbol)

Returns:

  • (#call)

    the registered retrier

Raises:

  • (ArgumentError)

    when name isn't registered



69
70
71
72
73
# File 'lib/cmdx/retriers.rb', line 69

def lookup(name)
  registry[name] || begin
    raise ArgumentError, "unknown retrier: #{name.inspect}"
  end
end

#register(name, callable = nil, &block) { ... } ⇒ Retriers

Registers a named retrier, overwriting any existing entry.

Parameters:

  • name (Symbol)
  • callable (#call, nil) (defaults to: nil)

    pass either this or a block

  • block (#call, nil)

    retrier callable when callable is omitted

Yields:

  • retrier body — call(attempt, delay, prev_delay)

Returns:

Raises:

  • (ArgumentError)

    when both callable and a block are given, or when the resolved retrier isn't callable



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/cmdx/retriers.rb', line 40

def register(name, callable = nil, &block)
  retrier = callable || block

  if callable && block
    raise ArgumentError, "provide either a callable or a block, not both"
  elsif !retrier.respond_to?(:call)
    raise ArgumentError, "retrier must respond to #call"
  end

  registry[name.to_sym] = retrier
  self
end

#resolve(spec) ⇒ #call?

Resolves a :jitter spec to a concrete callable. Accepts a Symbol (registry lookup) or any object responding to #call. nil resolves to nil so callers can fall back to the unjittered base delay.

Parameters:

  • spec (Symbol, #call, nil)

Returns:

  • (#call, nil)

Raises:

  • (ArgumentError)

    when spec is an unknown symbol or not callable



82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/cmdx/retriers.rb', line 82

def resolve(spec)
  case spec
  when NilClass
    nil
  when Symbol
    lookup(spec)
  else
    return spec if spec.respond_to?(:call)

    raise ArgumentError, "unknown retrier: #{spec.inspect}"
  end
end

#sizeInteger

Returns:

  • (Integer)


101
102
103
# File 'lib/cmdx/retriers.rb', line 101

def size
  registry.size
end