Class: HTTPX::Plugins::CircuitBreaker::Circuit
- Inherits:
-
Object
- Object
- HTTPX::Plugins::CircuitBreaker::Circuit
- 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
-
#initialize(max_attempts, reset_attempts_in, break_in, circuit_breaker_half_open_drip_rate) ⇒ Circuit
constructor
A new instance of Circuit.
- #respond ⇒ Object
- #try_close ⇒ Object
- #try_open(response) ⇒ Object
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
#respond ⇒ Object
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_close ⇒ Object
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 |