sidekiq-circuit-breaker 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c8d074e1a9769464f959a32c39dc3b20a8f6511e8502eadccb6d99c7484b7c68
4
- data.tar.gz: f170e39551f391ab6c18b77405f15d9565baa5587218bb9039a4dcd235949196
3
+ metadata.gz: e51ce2527ccdcb2cf1081f47c5e37fffed8043a264c9749dcbe6d1d6ec409e44
4
+ data.tar.gz: eb6f8fbd9e30cc88c18b82aa51a8474d71dbcc3ef461e5470934010371ae1c67
5
5
  SHA512:
6
- metadata.gz: 6e649a734c8e66bfbb1bb4aab0003de3e44c11364e93586849c8e68acd653466490616b786eafd6e5948d2aeabe846165d529b04e1c1e23d1a3b61bf46b58def
7
- data.tar.gz: 4f1cfcac2b3ab7dc87302ce00991fec7f2c1ea46db2bbae5b3a69862c43a95899ded7c88912de628da27b60a8dbd2ebfec12179d953bf0f9bb8a1b23a4983052
6
+ metadata.gz: 42befd4cf2b41db3690590426eefeba7548fed8cc4aab59af943eec1fb4ab75454a8cbc0496e9e6178c9e3b1add247296505367ce9c2bed90aa634d7f06d27a7
7
+ data.tar.gz: 1efbecc602fcebbeaa07481e2e92599ad990ef44130f7528edc30d60801c2bfac41aa3c8dcbe59c0b9a035e8cbfb220c32e2fcaa3dc7cd9fceab62ce0ad2d064
data/CHANGELOG.md ADDED
@@ -0,0 +1,6 @@
1
+ # sidekiq-circuit-breaker changes
2
+
3
+ 0.1.5
4
+ ----------
5
+
6
+ - Just refactoring
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sidekiq-circuit-breaker (0.1.4)
4
+ sidekiq-circuit-breaker (0.1.5)
5
5
  sidekiq (>= 5.0.0)
6
6
 
7
7
  GEM
@@ -1,6 +1,7 @@
1
1
  require 'sidekiq'
2
- require 'sidekiq/circuit_breaker/middleware'
3
2
  require 'sidekiq/circuit_breaker/worker'
3
+ require 'sidekiq/circuit_breaker/middleware'
4
+
4
5
 
5
6
  module Sidekiq
6
7
  module CircuitBreaker; end
@@ -15,6 +15,17 @@ module Sidekiq
15
15
  true
16
16
  end
17
17
 
18
+ def close_circuit(scope)
19
+ raise ArgumentError, 'scope must not be nil' if scope.nil?
20
+ Sidekiq.redis do |conn|
21
+ conn.del(open_key(scope))
22
+ # reset failure count
23
+ conn.del(failure_key(scope))
24
+ end
25
+ true
26
+
27
+ end
28
+
18
29
  def register_failure_for_scope(scope, ttl = 120)
19
30
  raise ArgumentError, 'scope must not be nil' if scope.nil?
20
31
  key = failure_key(scope)
@@ -36,13 +47,13 @@ module Sidekiq
36
47
  end
37
48
  end
38
49
 
39
- def time_to_open_the_circuit(scope)
50
+ def time_to_close_the_circuit(scope)
40
51
  Sidekiq.redis do |conn|
41
52
  conn.ttl(open_key(scope))
42
53
  end
43
54
  end
44
55
 
45
- def circuit_opened?(scope)
56
+ def circuit_open?(scope)
46
57
  Sidekiq.redis do |conn|
47
58
  conn.exists(open_key(scope))
48
59
  end
@@ -15,7 +15,7 @@ module Sidekiq
15
15
  end
16
16
 
17
17
  def open?
18
- circuit_opened?(@scope)
18
+ circuit_open?(@scope)
19
19
  end
20
20
 
21
21
  def closed?
@@ -30,8 +30,8 @@ module Sidekiq
30
30
  open_circuit(@scope, @options.max_open_time)
31
31
  end
32
32
 
33
- def time_to_open
34
- time_to_open_the_circuit(@scope)
33
+ def time_to_close
34
+ time_to_close_the_circuit(@scope)
35
35
  end
36
36
 
37
37
  def register_failure
@@ -1,94 +1,5 @@
1
- require 'sidekiq/circuit_breaker/manager'
2
- require 'sidekiq/circuit_breaker/middleware'
3
- require 'sidekiq/client'
4
-
5
- module Sidekiq
6
- module CircuitBreaker
7
- module Middleware
8
- class Client
9
- def call(worker_class, msg, queue, redis_pool)
10
- begin
11
- worker = constantize(worker_class)
12
- rescue NameError
13
- return yield
14
- end
15
-
16
- circuit_breaker = worker.respond_to?(:sidekiq_circuit_breaker_enabled?)
17
- return yield unless circuit_breaker
18
-
19
- options = worker.sidekiq_circuit_breaker_options
20
- scope = extract_scope(options, msg) || worker_class
21
-
22
- mgr = CircuitBreaker::Manager.new(scope, options)
23
- if mgr.open? && msg['at'].nil?
24
- msg['at'] = (Time.now + (mgr.time_to_open + additional_seconds)).to_f
25
- end
26
-
27
- yield
28
- end
29
-
30
- private
31
-
32
- def additional_seconds
33
- rand(3..10)
34
- end
35
-
36
- private
37
-
38
- def extract_scope(options, msg)
39
- scope = options.scope
40
- return scope if scope.is_a?(String)
41
- return unless scope.respond_to?(:call)
42
-
43
- options.scope.call(*msg['args'])
44
- end
45
-
46
- def constantize(str)
47
- names = str.split('::')
48
- names.shift if names.empty? || names.first.empty?
49
-
50
- names.inject(Object) do |constant, name|
51
- constant.const_defined?(name, false) ? constant.const_get(name, false) : constant.const_missing(name)
52
- end
53
- end
54
- end
55
-
56
- class Server
57
- def call(worker, msg, queue)
58
- circuit_breaker_enabled = worker.class.respond_to?(:sidekiq_circuit_breaker_enabled?)
59
- return yield unless circuit_breaker_enabled
60
-
61
- def worker.perform(*args)
62
- manager = sidekiq_circuit_breaker_manager(args)
63
-
64
- if manager.open?
65
- begin
66
- Sidekiq::Client.push(
67
- 'class' => self.class,
68
- 'args' => args
69
- )
70
- return
71
- end
72
- end
73
-
74
- super(*args)
75
- end
76
-
77
- manager = worker.sidekiq_circuit_breaker_manager(msg['args'])
78
-
79
- begin
80
- yield
81
- rescue => e
82
- manager.evaluate_failure
83
- raise e
84
- end
85
-
86
- manager.register_success
87
- end
88
- end
89
- end
90
- end
91
- end
1
+ require 'sidekiq/circuit_breaker/middleware/client'
2
+ require 'sidekiq/circuit_breaker/middleware/server'
92
3
 
93
4
  Sidekiq.configure_client do |config|
94
5
  config.client_middleware do |chain|
@@ -0,0 +1,51 @@
1
+ require 'sidekiq/client'
2
+ require 'sidekiq/circuit_breaker/manager'
3
+ require 'sidekiq/circuit_breaker/scope'
4
+
5
+ module Sidekiq
6
+ module CircuitBreaker
7
+ module Middleware
8
+ class Client
9
+ include Sidekiq::CircuitBreaker::Scope
10
+
11
+ def call(worker_class, msg, queue, redis_pool)
12
+ begin
13
+ worker = constantize(worker_class)
14
+ rescue NameError
15
+ return yield
16
+ end
17
+
18
+ circuit_breaker = worker.respond_to?(:sidekiq_circuit_breaker_enabled?)
19
+ return yield unless circuit_breaker
20
+
21
+ options = worker.sidekiq_circuit_breaker_options
22
+ scope = extract_scope(worker_class, msg, options)
23
+
24
+ mgr = CircuitBreaker::Manager.new(scope, options)
25
+ if mgr.open? && msg['at'].nil?
26
+ msg['at'] = (Time.now + (mgr.time_to_close + additional_seconds)).to_f
27
+ end
28
+
29
+ yield
30
+ end
31
+
32
+ private
33
+
34
+ def additional_seconds
35
+ rand(3..10)
36
+ end
37
+
38
+ private
39
+
40
+ def constantize(str)
41
+ names = str.split('::')
42
+ names.shift if names.empty? || names.first.empty?
43
+
44
+ names.inject(Object) do |constant, name|
45
+ constant.const_defined?(name, false) ? constant.const_get(name, false) : constant.const_missing(name)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,39 @@
1
+ require 'sidekiq/circuit_breaker/scope'
2
+
3
+ module Sidekiq
4
+ module CircuitBreaker
5
+ module Middleware
6
+ class Server
7
+ include Sidekiq::CircuitBreaker::Scope
8
+
9
+ def call(worker, msg, queue)
10
+ circuit_breaker_enabled = worker.class.respond_to?(:sidekiq_circuit_breaker_enabled?)
11
+ return yield unless circuit_breaker_enabled
12
+
13
+ options = worker.class.sidekiq_circuit_breaker_options
14
+ scope = extract_scope(worker.class.name, msg, options)
15
+ manager = Manager.new(scope, options)
16
+ resquedule_job(worker, msg) and return if manager.open?
17
+
18
+ begin
19
+ yield
20
+ rescue => e
21
+ manager.evaluate_failure
22
+ raise e
23
+ end
24
+
25
+ manager.register_success
26
+ end
27
+
28
+ def resquedule_job(worker, msg)
29
+ Sidekiq::Client.push(
30
+ 'class' => worker.class.name,
31
+ 'args' => msg['args']
32
+ )
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+
@@ -0,0 +1,18 @@
1
+ module Sidekiq
2
+ module CircuitBreaker
3
+ module Scope
4
+ def extract_scope(worker_class_name, msg, options)
5
+ from_setup =
6
+ begin
7
+ scope = options.scope
8
+ return scope if scope.is_a?(String)
9
+ return unless scope.respond_to?(:call)
10
+
11
+ options.scope.call(*msg['args'])
12
+ end
13
+
14
+ from_setup || worker_class_name
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module CircuitBreaker
3
- VERSION = '0.1.4'
3
+ VERSION = '0.1.5'
4
4
  end
5
5
  end
@@ -7,28 +7,6 @@ module Sidekiq
7
7
  base.extend(ClassMethods)
8
8
  end
9
9
 
10
- def sidekiq_circuit_breaker_manager(args)
11
- options = self.class.sidekiq_circuit_breaker_options
12
- scope = scope(args)
13
- CircuitBreaker::Manager.new(scope, options)
14
- end
15
-
16
- private
17
-
18
- def scope(args)
19
- options = self.class.sidekiq_circuit_breaker_options
20
- extract_scope(options, args) || self.class.name
21
- end
22
-
23
- def extract_scope(options, args)
24
- scope = options.scope
25
- return scope if scope.is_a?(String)
26
- return unless scope.respond_to?(:call)
27
-
28
- options.scope.call(*args)
29
- end
30
-
31
-
32
10
  module ClassMethods
33
11
  def sidekiq_circuit_breaker_enabled?
34
12
  true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-circuit-breaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Sousa
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-04 00:00:00.000000000 Z
11
+ date: 2018-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -76,6 +76,7 @@ files:
76
76
  - ".gitignore"
77
77
  - ".rspec"
78
78
  - ".travis.yml"
79
+ - CHANGELOG.md
79
80
  - Gemfile
80
81
  - Gemfile.lock
81
82
  - LICENSE.txt
@@ -88,6 +89,9 @@ files:
88
89
  - lib/sidekiq/circuit_breaker/configuration.rb
89
90
  - lib/sidekiq/circuit_breaker/manager.rb
90
91
  - lib/sidekiq/circuit_breaker/middleware.rb
92
+ - lib/sidekiq/circuit_breaker/middleware/client.rb
93
+ - lib/sidekiq/circuit_breaker/middleware/server.rb
94
+ - lib/sidekiq/circuit_breaker/scope.rb
91
95
  - lib/sidekiq/circuit_breaker/version.rb
92
96
  - lib/sidekiq/circuit_breaker/worker.rb
93
97
  - sidekiq-circuit-breaker.gemspec