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