sidekiq-throttled 0.7.0 → 0.7.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/CHANGES.md +11 -0
- data/lib/sidekiq/throttled.rb +1 -1
- data/lib/sidekiq/throttled/strategy/base.rb +21 -0
- data/lib/sidekiq/throttled/strategy/concurrency.rb +16 -20
- data/lib/sidekiq/throttled/strategy/threshold.rb +10 -19
- data/lib/sidekiq/throttled/version.rb +1 -1
- data/lib/sidekiq/throttled/web.rb +4 -0
- data/lib/sidekiq/throttled/web/summary_fix.rb +27 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: caf7b98eeb976c1114776cb1981a3bd6b7c218f8
|
4
|
+
data.tar.gz: 1945f409e2048660611a1a7ede586bb573899d51
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b6640758e9fea0d59f715d87071da32300dc54e3397b2e9c90f16bbcfb90e9bfd22153e607cdfbbe7cd04359ef0e920f9a59b37c8870bfd467c71b239951e1e
|
7
|
+
data.tar.gz: e6ea732bdbb2818828203823a7620fd681eacae992eff09422bc57f9a659ecb1fa992a08e1191c50df0cad346af980000074855c7f87fd705c4af62f8cdd01a1
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
## 0.7.1 (2017-03-30)
|
2
|
+
|
3
|
+
* Fix summary bar queues link when queue ui was enhanced.
|
4
|
+
([@ixti])
|
5
|
+
|
6
|
+
* [#31](https://github.com/sensortower/sidekiq-throttled/pull/31)
|
7
|
+
[#30](https://github.com/sensortower/sidekiq-throttled/issues/30)
|
8
|
+
Do not throttle if limit is `nil`.
|
9
|
+
([@ixti])
|
10
|
+
|
11
|
+
|
1
12
|
## 0.7.0 (2017-03-22)
|
2
13
|
|
3
14
|
* Expose pause/resume queues hidden feature to UI. This was available via API
|
data/lib/sidekiq/throttled.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sidekiq
|
4
|
+
module Throttled
|
5
|
+
class Strategy
|
6
|
+
module Base
|
7
|
+
def limit(job_args = nil)
|
8
|
+
@limit.respond_to?(:call) ? @limit.call(*job_args) : @limit
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def key(job_args)
|
14
|
+
key = @base_key.dup
|
15
|
+
key << ":#{@key_suffix.call(*job_args)}" if @key_suffix
|
16
|
+
key
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
|
+
require "sidekiq/throttled/strategy/base"
|
3
4
|
require "sidekiq/throttled/strategy/script"
|
4
5
|
|
5
6
|
module Sidekiq
|
@@ -7,13 +8,17 @@ module Sidekiq
|
|
7
8
|
class Strategy
|
8
9
|
# Concurrency throttling strategy
|
9
10
|
class Concurrency
|
11
|
+
include Base
|
12
|
+
|
10
13
|
# LUA script used to limit fetch concurrency.
|
11
14
|
# Logic behind the scene can be described in following pseudo code:
|
12
15
|
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
16
|
+
# if @limit <= LLEN(@key)
|
17
|
+
# return 1
|
18
|
+
# else
|
19
|
+
# PUSH(@key, @jid)
|
20
|
+
# return 0
|
21
|
+
# end
|
17
22
|
SCRIPT = Script.read "#{__dir__}/concurrency.lua"
|
18
23
|
private_constant :SCRIPT
|
19
24
|
|
@@ -29,12 +34,6 @@ module Sidekiq
|
|
29
34
|
@key_suffix = key_suffix
|
30
35
|
end
|
31
36
|
|
32
|
-
# @return [Integer] Amount of allowed concurrent job processors
|
33
|
-
def limit(job_args = nil)
|
34
|
-
return @limit.to_i unless @limit.respond_to? :call
|
35
|
-
@limit.call(*job_args).to_i
|
36
|
-
end
|
37
|
-
|
38
37
|
# @return [Boolean] Whenever strategy has dynamic config
|
39
38
|
def dynamic?
|
40
39
|
@key_suffix || @limit.respond_to?(:call)
|
@@ -42,7 +41,12 @@ module Sidekiq
|
|
42
41
|
|
43
42
|
# @return [Boolean] whenever job is throttled or not
|
44
43
|
def throttled?(jid, *job_args)
|
45
|
-
|
44
|
+
return false unless (job_limit = limit(job_args))
|
45
|
+
|
46
|
+
keys = [key(job_args)]
|
47
|
+
args = [jid.to_s, job_limit, @ttl]
|
48
|
+
|
49
|
+
1 == SCRIPT.eval(keys, args)
|
46
50
|
end
|
47
51
|
|
48
52
|
# @return [Integer] Current count of jobs
|
@@ -61,14 +65,6 @@ module Sidekiq
|
|
61
65
|
def finalize!(jid, *job_args)
|
62
66
|
Sidekiq.redis { |conn| conn.srem(key(job_args), jid.to_s) }
|
63
67
|
end
|
64
|
-
|
65
|
-
private
|
66
|
-
|
67
|
-
def key(job_args)
|
68
|
-
key = @base_key.dup
|
69
|
-
key << ":#{@key_suffix.call(*job_args)}" if @key_suffix
|
70
|
-
key
|
71
|
-
end
|
72
68
|
end
|
73
69
|
end
|
74
70
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
|
+
require "sidekiq/throttled/strategy/base"
|
3
4
|
require "sidekiq/throttled/strategy/script"
|
4
5
|
|
5
6
|
module Sidekiq
|
@@ -9,6 +10,8 @@ module Sidekiq
|
|
9
10
|
# @todo Use redis TIME command instead of sending current timestamp from
|
10
11
|
# sidekiq manager. See: http://redis.io/commands/time
|
11
12
|
class Threshold
|
13
|
+
include Base
|
14
|
+
|
12
15
|
# LUA script used to limit fetch threshold.
|
13
16
|
# Logic behind the scene can be described in following pseudo code:
|
14
17
|
#
|
@@ -41,12 +44,6 @@ module Sidekiq
|
|
41
44
|
@key_suffix = key_suffix
|
42
45
|
end
|
43
46
|
|
44
|
-
# @return [Integer] Amount of jobs allowed per period
|
45
|
-
def limit(job_args = nil)
|
46
|
-
return @limit.to_i unless @limit.respond_to? :call
|
47
|
-
@limit.call(*job_args).to_i
|
48
|
-
end
|
49
|
-
|
50
47
|
# @return [Float] Period in seconds
|
51
48
|
def period(job_args = nil)
|
52
49
|
return @period.to_f unless @period.respond_to? :call
|
@@ -60,10 +57,12 @@ module Sidekiq
|
|
60
57
|
|
61
58
|
# @return [Boolean] whenever job is throttled or not
|
62
59
|
def throttled?(*job_args)
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
60
|
+
return false unless (job_limit = limit(job_args))
|
61
|
+
|
62
|
+
keys = [key(job_args)]
|
63
|
+
args = [job_limit, period(job_args), Time.now.to_f]
|
64
|
+
|
65
|
+
1 == SCRIPT.eval(keys, args)
|
67
66
|
end
|
68
67
|
|
69
68
|
# @return [Integer] Current count of jobs
|
@@ -76,14 +75,6 @@ module Sidekiq
|
|
76
75
|
def reset!(*job_args)
|
77
76
|
Sidekiq.redis { |conn| conn.del(key(job_args)) }
|
78
77
|
end
|
79
|
-
|
80
|
-
private
|
81
|
-
|
82
|
-
def key(job_args)
|
83
|
-
key = @base_key.dup
|
84
|
-
key << ":#{@key_suffix.call(*job_args)}" if @key_suffix
|
85
|
-
key
|
86
|
-
end
|
87
78
|
end
|
88
79
|
end
|
89
80
|
end
|
@@ -10,6 +10,7 @@ require "sidekiq/web"
|
|
10
10
|
# internal
|
11
11
|
require "sidekiq/throttled/registry"
|
12
12
|
require "sidekiq/throttled/web/stats"
|
13
|
+
require "sidekiq/throttled/web/summary_fix"
|
13
14
|
|
14
15
|
module Sidekiq
|
15
16
|
module Throttled
|
@@ -22,6 +23,7 @@ module Sidekiq
|
|
22
23
|
class << self
|
23
24
|
# Replace default Queues tab with enhanced one.
|
24
25
|
def enhance_queues_tab!
|
26
|
+
SummaryFix.enabled = true
|
25
27
|
Sidekiq::Web::DEFAULT_TABS["Queues"] = "enhanced-queues"
|
26
28
|
Sidekiq::Web.tabs.delete("Enhanced Queues")
|
27
29
|
end
|
@@ -31,12 +33,14 @@ module Sidekiq
|
|
31
33
|
# @api There's next to absolutely no value in this method for real
|
32
34
|
# users. The only it's purpose is to restore virgin state in specs.
|
33
35
|
def restore_queues_tab!
|
36
|
+
SummaryFix.enabled = false
|
34
37
|
Sidekiq::Web::DEFAULT_TABS["Queues"] = "queues"
|
35
38
|
Sidekiq::Web.tabs["Enhanced Queues"] = "enhanced-queues"
|
36
39
|
end
|
37
40
|
|
38
41
|
# @api private
|
39
42
|
def registered(app)
|
43
|
+
app.send(:include, SummaryFix)
|
40
44
|
register_throttled_tab app
|
41
45
|
register_enhanced_queues_tab app
|
42
46
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sidekiq
|
4
|
+
module Throttled
|
5
|
+
module Web
|
6
|
+
module SummaryFix
|
7
|
+
JAVASCRIPT = <<-JAVASCRIPT
|
8
|
+
<script>
|
9
|
+
$(function ($el) {
|
10
|
+
var $el = $(".summary li.enqueued > a"),
|
11
|
+
url = $el.attr("href").replace(/\/queues$/, "/enhanced-queues");
|
12
|
+
$el.attr("href", url);
|
13
|
+
});
|
14
|
+
</script>
|
15
|
+
JAVASCRIPT
|
16
|
+
|
17
|
+
class << self
|
18
|
+
attr_accessor :enabled
|
19
|
+
end
|
20
|
+
|
21
|
+
def display_custom_head
|
22
|
+
SummaryFix.enabled ? "#{super}#{JAVASCRIPT}" : super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-throttled
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexey V Zapparov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-30 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
|
- lib/sidekiq/throttled/queues_pauser.rb
|
77
77
|
- lib/sidekiq/throttled/registry.rb
|
78
78
|
- lib/sidekiq/throttled/strategy.rb
|
79
|
+
- lib/sidekiq/throttled/strategy/base.rb
|
79
80
|
- lib/sidekiq/throttled/strategy/concurrency.lua
|
80
81
|
- lib/sidekiq/throttled/strategy/concurrency.rb
|
81
82
|
- lib/sidekiq/throttled/strategy/script.rb
|
@@ -86,6 +87,7 @@ files:
|
|
86
87
|
- lib/sidekiq/throttled/web.rb
|
87
88
|
- lib/sidekiq/throttled/web/queues.html.erb
|
88
89
|
- lib/sidekiq/throttled/web/stats.rb
|
90
|
+
- lib/sidekiq/throttled/web/summary_fix.rb
|
89
91
|
- lib/sidekiq/throttled/web/throttled.html.erb
|
90
92
|
- lib/sidekiq/throttled/worker.rb
|
91
93
|
- sidekiq-throttled.gemspec
|
@@ -109,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
111
|
version: '0'
|
110
112
|
requirements: []
|
111
113
|
rubyforge_project:
|
112
|
-
rubygems_version: 2.6.
|
114
|
+
rubygems_version: 2.6.11
|
113
115
|
signing_key:
|
114
116
|
specification_version: 4
|
115
117
|
summary: Concurrency and threshold throttling for Sidekiq.
|