Class: HTTPX::Plugins::CircuitBreaker::Circuit

Inherits:
Object
  • Object
show all
Defined in:
lib/httpx/plugins/circuit_breaker/circuit.rb

Overview

A circuit is assigned to a given absoolute url or origin.

It sets max_attempts, the number of attempts the circuit allows, before it is opened. It sets reset_attempts_in, the time a circuit stays open at most, before it resets. It sets break_in, the time that must elapse before an open circuit can transit to the half-open state. It sets circuit_breaker_half_open_drip_rate, the rate of requests a circuit allows to be performed when in an half-open state.

Instance Method Summary collapse

Constructor Details

#initialize(max_attempts, reset_attempts_in, break_in, circuit_breaker_half_open_drip_rate) ⇒ Circuit

Returns a new instance of Circuit.



14
15
16
17
18
19
20
21
# File 'lib/httpx/plugins/circuit_breaker/circuit.rb', line 14

def initialize(max_attempts, reset_attempts_in, break_in, circuit_breaker_half_open_drip_rate)
  @max_attempts = max_attempts
  @reset_attempts_in = reset_attempts_in
  @break_in = break_in
  @circuit_breaker_half_open_drip_rate = 1 - circuit_breaker_half_open_drip_rate
  @attempts = 0
  @state = :closed
end

Instance Method Details

#respondObject



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/httpx/plugins/circuit_breaker/circuit.rb', line 23

def respond
  try_close

  case @state
  when :closed
    nil
  when :half_open
    # return nothing or smth based on ratio
    return if Random.rand >= @circuit_breaker_half_open_drip_rate

    @response
  when :open

    @response
  end
end

#try_closeObject



60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/httpx/plugins/circuit_breaker/circuit.rb', line 60

def try_close
  case @state
  when :closed
    nil
  when :half_open
    # reset!
    @attempts = 0
    @opened_at = @attempted_at = @response = nil
    @state = :closed

  when :open
    @state = :half_open if Utils.elapsed_time(@opened_at) > @break_in
  end
end

#try_open(response) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/httpx/plugins/circuit_breaker/circuit.rb', line 40

def try_open(response)
  return unless @state == :closed

  now = Utils.now

  if @attempts.positive?
    @attempts = 0 if now - @attempted_at > @reset_attempts_in
  else
    @attempted_at = now
  end

  @attempts += 1

  return unless @attempts >= @max_attempts

  @state = :open
  @opened_at = now
  @response = response
end