class Rudder::Analytics::BackoffPolicy

Public Class Methods

new(opts = {}) click to toggle source

@param [Hash] opts @option opts [Numeric] :min_timeout_ms The minimum backoff timeout @option opts [Numeric] :max_timeout_ms The maximum backoff timeout @option opts [Numeric] :multiplier The value to multiply the current

interval with for each retry attempt

@option opts [Numeric] :randomization_factor The randomization factor

to use to create a range around the retry interval
# File lib/rudder/analytics/backoff_policy.rb, line 15
def initialize(opts = {})
  @min_timeout_ms = opts[:min_timeout_ms] || MIN_TIMEOUT_MS
  @max_timeout_ms = opts[:max_timeout_ms] || MAX_TIMEOUT_MS
  @multiplier = opts[:multiplier] || MULTIPLIER
  @randomization_factor = opts[:randomization_factor] || RANDOMIZATION_FACTOR

  @attempts = 0
end

Public Instance Methods

next_interval() click to toggle source

@return [Numeric] the next backoff interval, in milliseconds.

# File lib/rudder/analytics/backoff_policy.rb, line 25
def next_interval
  interval = @min_timeout_ms * (@multiplier**@attempts)
  interval = add_jitter(interval, @randomization_factor)

  @attempts += 1

  [interval, @max_timeout_ms].min
end

Private Instance Methods

add_jitter(base, randomization_factor) click to toggle source
# File lib/rudder/analytics/backoff_policy.rb, line 36
def add_jitter(base, randomization_factor)
  random_number = rand
  max_deviation = base * randomization_factor
  deviation = random_number * max_deviation

  if random_number < 0.5
    base - deviation
  else
    base + deviation
  end
end