sidekiq-max-jobs 0.0.2 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +6 -1
- data/README.md +8 -1
- data/VERSION +1 -1
- data/lib/sidekiq/middleware/server/max_jobs.rb +71 -19
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88185f0bd0aa5075fae604f768a9b011edf6c4d349bb8d5fe32a177488bca55a
|
4
|
+
data.tar.gz: a0fde7488aa0115cd4402c07508922cfe91faa7cf57e5589297432522f3fd97f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 675e4bb41052bfd805c2abb42686cad52bcb6a3fd8f0e70dac7974571b495dc8a3acb7fd3a4f249badc845e8c83ba2423034345d683ad0f0da19ee021b983753
|
7
|
+
data.tar.gz: 36742d445b462d6539a11c4d99e35503d32754d70c0096b9825593d1dac0ddee5815b6adadd7d6e98a6d07b1afc167f9f74d7ba424fc7e4ebafe16eb87c98fb7
|
data/.rubocop_todo.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2020-06-
|
3
|
+
# on 2020-06-17 19:26:25 -0500 using RuboCop version 0.85.1.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
@@ -22,6 +22,11 @@ Metrics/AbcSize:
|
|
22
22
|
Metrics/BlockLength:
|
23
23
|
Max: 26
|
24
24
|
|
25
|
+
# Offense count: 1
|
26
|
+
# Configuration parameters: CountComments.
|
27
|
+
Metrics/ClassLength:
|
28
|
+
Max: 102
|
29
|
+
|
25
30
|
# Offense count: 1
|
26
31
|
# Configuration parameters: CountComments, ExcludedMethods.
|
27
32
|
Metrics/MethodLength:
|
data/README.md
CHANGED
@@ -66,7 +66,14 @@ behavior (currently only configurable via the environment):
|
|
66
66
|
* `MAX_JOBS_JITTER`: Used as the upper-bound for calculating a random number
|
67
67
|
between 1 and the value specified. This value is added to the `MAX_JOBS` value,
|
68
68
|
mentioned above, to decrease the likelihood that all of your `Worker(s)`
|
69
|
-
restart at / around the same time (default: `1`)
|
69
|
+
restart at / around the same time (default: `rand(1)`)
|
70
|
+
* `MAX_JOBS_<QUEUE>`: The number of jobs to process for a specific queue before
|
71
|
+
terminating (default: `(ENV['MAX_JOBS'] || 100).to_i`)
|
72
|
+
* `MAX_JOBS_JITTER_<QUEUE>`: Used as the upper-bound for calculating a random
|
73
|
+
number between 1 and the value specified. This value is added to the
|
74
|
+
`MAX_JOBS_<QUEUE>` value, mentioned above, to decreased the likelihood that all
|
75
|
+
of your `Worker(s)` restart at / around the same time (default:
|
76
|
+
`rand((ENV['MAX_JOBS_JITTER'] || 1).to_i)`)
|
70
77
|
|
71
78
|
Contributing
|
72
79
|
------------
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
@@ -16,12 +16,26 @@ module Sidekiq
|
|
16
16
|
).strip
|
17
17
|
|
18
18
|
class << self
|
19
|
-
def
|
20
|
-
@
|
19
|
+
def cache
|
20
|
+
@cache ||= {}
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
|
23
|
+
def counter(queue)
|
24
|
+
key = counter_key(queue)
|
25
|
+
return cache[key] if cache.include?(key)
|
26
|
+
|
27
|
+
cache[key] = 0
|
28
|
+
end
|
29
|
+
|
30
|
+
def counter_key(queue)
|
31
|
+
"COUNTER_#{queue.upcase}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def increment_counter!(queue)
|
35
|
+
key = counter_key(queue)
|
36
|
+
counter = cache[key] || 0
|
37
|
+
|
38
|
+
cache[key] = counter.next
|
25
39
|
end
|
26
40
|
|
27
41
|
def log_info(message)
|
@@ -29,23 +43,61 @@ module Sidekiq
|
|
29
43
|
end
|
30
44
|
|
31
45
|
def log_initialization!
|
32
|
-
log_info("Max-Jobs middleware enabled, shutting down pid: #{pid} after
|
46
|
+
log_info("Max-Jobs middleware enabled, shutting down pid: #{pid} after max-jobs threshold reached")
|
47
|
+
end
|
48
|
+
|
49
|
+
def max_jobs(queue)
|
50
|
+
key = max_jobs_key(queue)
|
51
|
+
return cache[key] if cache.include?(key)
|
52
|
+
|
53
|
+
cache[key] = (
|
54
|
+
ENV[key] ||
|
55
|
+
ENV['MAX_JOBS'] ||
|
56
|
+
100
|
57
|
+
).to_i
|
33
58
|
end
|
34
59
|
|
35
|
-
def
|
36
|
-
|
60
|
+
def max_jobs_key(queue)
|
61
|
+
"MAX_JOBS_#{queue.upcase}"
|
37
62
|
end
|
38
63
|
|
39
|
-
def max_jobs_jitter
|
40
|
-
|
64
|
+
def max_jobs_jitter(queue)
|
65
|
+
key = max_jobs_jitter_key(queue)
|
66
|
+
return cache[key] if cache.include?(key)
|
67
|
+
|
68
|
+
cache[key] = rand(
|
69
|
+
(
|
70
|
+
ENV[key] ||
|
71
|
+
ENV['MAX_JOBS_JITTER'] ||
|
72
|
+
1
|
73
|
+
).to_i
|
74
|
+
)
|
75
|
+
end
|
76
|
+
|
77
|
+
def max_jobs_jitter_key(queue)
|
78
|
+
"MAX_JOBS_JITTER_#{queue.upcase}"
|
41
79
|
end
|
42
80
|
|
43
|
-
def max_jobs_with_jitter
|
44
|
-
|
81
|
+
def max_jobs_with_jitter(queue)
|
82
|
+
key = max_jobs_with_jitter_key(queue)
|
83
|
+
return cache[key] if cache.include?(key)
|
84
|
+
|
85
|
+
cache[key] = max_jobs(queue) + max_jobs_jitter(queue)
|
86
|
+
end
|
87
|
+
|
88
|
+
def max_jobs_with_jitter_key(queue)
|
89
|
+
"MAX_JOBS_WITH_JITTER_#{queue.upcase}"
|
90
|
+
end
|
91
|
+
|
92
|
+
def mutex(queue)
|
93
|
+
key = mutex_key(queue)
|
94
|
+
return cache[key] if cache.include?(key)
|
95
|
+
|
96
|
+
cache[key] = ::Mutex.new
|
45
97
|
end
|
46
98
|
|
47
|
-
def
|
48
|
-
|
99
|
+
def mutex_key(queue)
|
100
|
+
"MUTEX_#{queue.upcase}"
|
49
101
|
end
|
50
102
|
|
51
103
|
def pid
|
@@ -54,9 +106,9 @@ module Sidekiq
|
|
54
106
|
end
|
55
107
|
|
56
108
|
def call(
|
57
|
-
_,
|
58
|
-
_,
|
59
|
-
|
109
|
+
_, # worker-instance
|
110
|
+
_, # item
|
111
|
+
queue
|
60
112
|
)
|
61
113
|
exception_raised = false
|
62
114
|
begin
|
@@ -69,10 +121,10 @@ module Sidekiq
|
|
69
121
|
raise
|
70
122
|
ensure
|
71
123
|
if !exception_raised
|
72
|
-
self.class.mutex.synchronize do
|
73
|
-
self.class.increment_counter!
|
124
|
+
self.class.mutex(queue).synchronize do
|
125
|
+
self.class.increment_counter!(queue)
|
74
126
|
|
75
|
-
if self.class.counter == self.class.max_jobs_with_jitter
|
127
|
+
if self.class.counter(queue) == self.class.max_jobs_with_jitter(queue)
|
76
128
|
self.class.log_info("Max-Jobs quota met, shutting down pid: #{self.class.pid}")
|
77
129
|
::Process.kill('TERM', self.class.pid)
|
78
130
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-max-jobs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan W. Zaleski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-06-
|
11
|
+
date: 2020-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|