Class: Gracefully::CircuitBreaker

Inherits:
Object
  • Object
show all
Defined in:
lib/gracefully/circuit_breaker.rb

Defined Under Namespace

Classes: CurrentlyOpenError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ CircuitBreaker

Returns a new instance of CircuitBreaker.

[View source]

5
6
7
8
9
10
11
12
13
14
# File 'lib/gracefully/circuit_breaker.rb', line 5

def initialize(*args)
  if args.size > 0
    options = args.first

    @try_close_after = options[:try_close_after]
  end

  @closed = true
  @health = options && options[:health] || Gracefully::ConsecutiveFailuresBasedHealth.new(become_unhealthy_after_consecutive_failures: 0)
end

Instance Attribute Details

#opened_dateObject (readonly)

Returns the value of attribute opened_date.


3
4
5
# File 'lib/gracefully/circuit_breaker.rb', line 3

def opened_date
  @opened_date
end

Instance Method Details

#close!Object

[View source]

69
70
71
# File 'lib/gracefully/circuit_breaker.rb', line 69

def close!
  @closed = true
end

#closed?Boolean

Returns:

  • (Boolean)
[View source]

49
50
51
# File 'lib/gracefully/circuit_breaker.rb', line 49

def closed?
  @closed
end

#execute(&block) ⇒ Object

[View source]

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/gracefully/circuit_breaker.rb', line 16

def execute(&block)
  if open? && (@try_close_after.nil? || try_close_period_passed?.!)
    raise CurrentlyOpenError, "Opened at #{opened_date}"
  end

  clear_opened_date!

  begin
    v = block.call
    mark_success
    v
  rescue => e
    mark_failure
    raise e
  end
end

#mark_failureObject

[View source]

39
40
41
42
43
# File 'lib/gracefully/circuit_breaker.rb', line 39

def mark_failure
  @health.mark_failure

  update!
end

#mark_successObject

[View source]

33
34
35
36
37
# File 'lib/gracefully/circuit_breaker.rb', line 33

def mark_success
  @health.mark_success

  update!
end

#open!Object

[View source]

73
74
75
76
# File 'lib/gracefully/circuit_breaker.rb', line 73

def open!
  @closed = false
  @opened_date = Time.now
end

#open?Boolean

Returns:

  • (Boolean)
[View source]

45
46
47
# File 'lib/gracefully/circuit_breaker.rb', line 45

def open?
  closed?.!
end

#try_close_period_passed?Boolean

Returns:

  • (Boolean)
[View source]

53
54
55
# File 'lib/gracefully/circuit_breaker.rb', line 53

def try_close_period_passed?
  opened_date && opened_date + @try_close_after < Time.now
end

#update!Object

[View source]

61
62
63
64
65
66
67
# File 'lib/gracefully/circuit_breaker.rb', line 61

def update!
  if @health.healthy?
    close!
  else
    open!
  end
end