Class: Desiru::Jobs::RetryStrategies::CircuitBreaker

Inherits:
Object
  • Object
show all
Defined in:
lib/desiru/jobs/retry_strategies.rb

Overview

Circuit breaker pattern

Defined Under Namespace

Classes: CircuitOpenError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(failure_threshold: 5, timeout: 60, half_open_requests: 1) ⇒ CircuitBreaker

Returns a new instance of CircuitBreaker.



108
109
110
111
112
113
114
115
116
# File 'lib/desiru/jobs/retry_strategies.rb', line 108

def initialize(failure_threshold: 5, timeout: 60, half_open_requests: 1)
  @failure_threshold = failure_threshold
  @timeout = timeout
  @half_open_requests = half_open_requests
  @state = :closed
  @failure_count = 0
  @last_failure_time = nil
  @half_open_count = 0
end

Instance Attribute Details

#failure_thresholdObject (readonly)

Returns the value of attribute failure_threshold.



106
107
108
# File 'lib/desiru/jobs/retry_strategies.rb', line 106

def failure_threshold
  @failure_threshold
end

#half_open_requestsObject (readonly)

Returns the value of attribute half_open_requests.



106
107
108
# File 'lib/desiru/jobs/retry_strategies.rb', line 106

def half_open_requests
  @half_open_requests
end

#timeoutObject (readonly)

Returns the value of attribute timeout.



106
107
108
# File 'lib/desiru/jobs/retry_strategies.rb', line 106

def timeout
  @timeout
end

Instance Method Details

#callObject



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/desiru/jobs/retry_strategies.rb', line 118

def call
  case @state
  when :open
    raise CircuitOpenError, "Circuit breaker is open" unless Time.now - @last_failure_time >= timeout

    @state = :half_open
    @half_open_count = 0

  end

  begin
    result = yield
    on_success
    result
  rescue StandardError => e
    on_failure
    raise e
  end
end