sidekiq-circuit-breaker 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +39 -7
- data/lib/sidekiq/circuit_breaker/middleware.rb +5 -6
- data/lib/sidekiq/circuit_breaker/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aae6bd24fc3af2bdfeb344bacc69ec93e6f4175150b1115a03fda4afa9100a2c
|
4
|
+
data.tar.gz: fbe37e0353ed5b7a7511d356e2109bc3df69d50cfd9ad1c495496580bd3b1e37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69e364ebd646ce52632043ff1839c20165cfb2a16051a41eacefe8d74f7f20f5e50ceb5f63c85914a3ddf49dcfbbd381a2da7422a6849b7d5133446766799401
|
7
|
+
data.tar.gz: 3a4b270002105a6edb203bbbe66bbcdc3cd4745c6af682d1157cee89725013e0190bf3e3d552f370bb0d795627577d8247d337b76b27864e76c47949cda6edd5
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
# Sidekiq::
|
1
|
+
# Sidekiq::CircuitBreaker
|
2
2
|
|
3
|
-
|
3
|
+
CircuitBreaker is a Sidekiq plugin that adds circuit breaker functionality.
|
4
4
|
|
5
|
-
|
5
|
+
Based on [Circuit Breaker pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker).
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
9
9
|
Add this line to your application's Gemfile:
|
10
10
|
|
11
11
|
```ruby
|
12
|
-
gem 'sidekiq-
|
12
|
+
gem 'sidekiq-circuit-breaker', require: 'sidekiq/circuit_breaker'
|
13
13
|
```
|
14
14
|
|
15
15
|
And then execute:
|
@@ -18,11 +18,43 @@ And then execute:
|
|
18
18
|
|
19
19
|
Or install it yourself as:
|
20
20
|
|
21
|
-
$ gem install sidekiq-
|
21
|
+
$ gem install sidekiq-circuit-breaker
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
25
|
+
Let's say you have a Worker called WebhookNotificationJob, that basically sends webhook notifications to extenal customer endpoints.
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
class WebhookNotificationJob
|
29
|
+
include Sidekiq::Worker
|
30
|
+
|
31
|
+
def perform(endpoint, payload)
|
32
|
+
post_to_endpoint(endpoint, body: payload)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
```
|
36
|
+
|
37
|
+
The problem of this is when some endpoint start to respond with errors or take to long to respond, the overall queue latency increases significantly.
|
38
|
+
|
39
|
+
With this gem you can apply CircuiBreaker pattern like this:
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
class WebhookNotificationJob
|
43
|
+
include Sidekiq::Worker
|
44
|
+
include Sidekiq::CircuitBreaker::Worker
|
45
|
+
|
46
|
+
sidekiq_circuit_breaker do |config|
|
47
|
+
config.set_scope ->(endpoint, _payload) do
|
48
|
+
uri = URI.parse(endpoint)
|
49
|
+
uri.hostname #=> The scope will be only the hostname i.e: google.com
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def perform(endpoint, payload)
|
54
|
+
post_to_endpoint(endpoint, payload)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
```
|
26
58
|
|
27
59
|
## Development
|
28
60
|
|
@@ -32,7 +64,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
64
|
|
33
65
|
## Contributing
|
34
66
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
67
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/ResultadosDigitais/sidekiq-circuitbreaker.
|
36
68
|
|
37
69
|
## License
|
38
70
|
|
@@ -16,7 +16,7 @@ module Sidekiq
|
|
16
16
|
|
17
17
|
mgr = CircuitBreaker::Manager.new(scope, options)
|
18
18
|
if mgr.open? && msg['at'].nil?
|
19
|
-
msg['at'] = (Time.now + mgr.time_to_open).to_f
|
19
|
+
msg['at'] = (Time.now + mgr.time_to_open + rand(10)).to_f
|
20
20
|
end
|
21
21
|
|
22
22
|
yield
|
@@ -43,8 +43,8 @@ module Sidekiq
|
|
43
43
|
|
44
44
|
class Server
|
45
45
|
def call(worker, msg, queue)
|
46
|
-
circuit_breaker_enabled = worker.respond_to?(:sidekiq_circuit_breaker_enabled?)
|
47
|
-
return unless circuit_breaker_enabled
|
46
|
+
circuit_breaker_enabled = worker.class.respond_to?(:sidekiq_circuit_breaker_enabled?)
|
47
|
+
return yield unless circuit_breaker_enabled
|
48
48
|
|
49
49
|
def worker.perform(*args)
|
50
50
|
manager = sidekiq_circuit_breaker_manager(args)
|
@@ -62,12 +62,11 @@ module Sidekiq
|
|
62
62
|
super(*args)
|
63
63
|
end
|
64
64
|
|
65
|
-
|
66
|
-
manager = worker.sidekiq_circuit_breaker_manager(args, options)
|
65
|
+
manager = worker.sidekiq_circuit_breaker_manager(msg['args'])
|
67
66
|
|
68
67
|
begin
|
69
68
|
yield
|
70
|
-
rescue
|
69
|
+
rescue => e
|
71
70
|
manager.evaluate_failure
|
72
71
|
raise e
|
73
72
|
end
|