class Hiatus::CircuitBreaker

Constants

DEFAULT_THRESHOLD
DEFAUTS

Attributes

last_failure_timestamp[RW]
state[R]

Public Class Methods

new(threshold: nil, half_open_interval: nil) click to toggle source
# File lib/hiatus/circuit_breaker.rb, line 15
def initialize(threshold: nil, half_open_interval: nil)
  @threshold = threshold || DEFAULT_THRESHOLD
  @half_open_interval = half_open_interval || DEFAUTS[:half_open_interval]

  @state = :closed
end

Public Instance Methods

call_with_circuit_state_changes() { || ... } click to toggle source
# File lib/hiatus/circuit_breaker.rb, line 34
def call_with_circuit_state_changes
  @threshold.touch
  yield if block_given?
  @threshold.reset if half_open?
  close
end
close() click to toggle source
# File lib/hiatus/circuit_breaker.rb, line 62
def close
  @state = :closed
  last_failure_timestamp = nil
end
closed?() click to toggle source
# File lib/hiatus/circuit_breaker.rb, line 58
def closed?
  state == :closed
end
half_open?() click to toggle source
# File lib/hiatus/circuit_breaker.rb, line 67
def half_open?
  open? && reached_retrial_threshold?
end
increment_failure_count() click to toggle source
# File lib/hiatus/circuit_breaker.rb, line 46
def increment_failure_count; @threshold.increment; end
increment_failure_count_and_trip_if_threshold_exceeded() click to toggle source
# File lib/hiatus/circuit_breaker.rb, line 41
def increment_failure_count_and_trip_if_threshold_exceeded
  increment_failure_count
  trip_if_threshold_exceeded
end
open?() click to toggle source
# File lib/hiatus/circuit_breaker.rb, line 54
def open?
  state == :open
end
run(&block) click to toggle source
# File lib/hiatus/circuit_breaker.rb, line 22
def run &block

  raise CircuitBrokenError if open? && !reached_retrial_threshold?

  begin
    call_with_circuit_state_changes &block
  rescue => e
    increment_failure_count_and_trip_if_threshold_exceeded
    raise $!
  end
end
trip_if_threshold_exceeded() click to toggle source
# File lib/hiatus/circuit_breaker.rb, line 48
def trip_if_threshold_exceeded
  @state = :open if @threshold.reached?

  refresh_last_failure_timestamp
end

Protected Instance Methods

reached_retrial_threshold?() click to toggle source
# File lib/hiatus/circuit_breaker.rb, line 77
def reached_retrial_threshold?
  last_failure_timestamp && Time.now - last_failure_timestamp > @half_open_interval
end
refresh_last_failure_timestamp() click to toggle source
# File lib/hiatus/circuit_breaker.rb, line 73
def refresh_last_failure_timestamp
  @last_failure_timestamp = Time.now
end