autoscaler 0.6.0 → 0.7.0
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.
- data/CHANGELOG.md +5 -0
- data/lib/autoscaler/linear_scaling_strategy.rb +30 -0
- data/lib/autoscaler/sidekiq/entire_queue_system.rb +1 -1
- data/lib/autoscaler/version.rb +1 -1
- data/spec/autoscaler/linear_scaling_strategy_spec.rb +37 -0
- data/spec/autoscaler/sidekiq/entire_queue_system_spec.rb +4 -0
- metadata +5 -2
data/CHANGELOG.md
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Autoscaler
|
2
|
+
# Strategies determine the target number of workers
|
3
|
+
# This strategy sets the number of workers to be proportional to the number of enqueued jobs.
|
4
|
+
class LinearScalingStrategy
|
5
|
+
#@param [integer] workers maximum number of workers to spin up.
|
6
|
+
#@param [integer] worker_capacity the amount of jobs one worker can handle
|
7
|
+
def initialize(workers = 1, worker_capacity = 25)
|
8
|
+
@workers = workers
|
9
|
+
@worker_capacity = worker_capacity
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param [QueueSystem] system interface to the queuing system
|
13
|
+
# @param [Numeric] event_idle_time number of seconds since a job related event
|
14
|
+
# @return [Integer] target number of workers
|
15
|
+
def call(system, event_idle_time)
|
16
|
+
total_capacity = (@workers * @worker_capacity).to_f
|
17
|
+
percent_capacity = total_work(system) / total_capacity
|
18
|
+
|
19
|
+
ideal_scale = (percent_capacity * @workers).ceil
|
20
|
+
max_scale = @workers
|
21
|
+
|
22
|
+
return [ideal_scale, max_scale].min
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def total_work(system)
|
27
|
+
system.queued + system.scheduled + system.retrying
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -12,7 +12,7 @@ module Autoscaler
|
|
12
12
|
|
13
13
|
# @return [Integer] amount work ready to go
|
14
14
|
def queued
|
15
|
-
sidekiq_queues.values.map(&:to_i).reduce(&:+)
|
15
|
+
sidekiq_queues.values.map(&:to_i).reduce(&:+) || 0
|
16
16
|
end
|
17
17
|
|
18
18
|
# @return [Integer] amount of work scheduled for some time in the future
|
data/lib/autoscaler/version.rb
CHANGED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'test_system'
|
3
|
+
require 'autoscaler/linear_scaling_strategy'
|
4
|
+
|
5
|
+
describe Autoscaler::LinearScalingStrategy do
|
6
|
+
let(:cut) {Autoscaler::LinearScalingStrategy}
|
7
|
+
|
8
|
+
it "deactivates with no work" do
|
9
|
+
system = TestSystem.new(0)
|
10
|
+
strategy = cut.new(1)
|
11
|
+
strategy.call(system, 1).should == 0
|
12
|
+
end
|
13
|
+
|
14
|
+
it "activates with some work" do
|
15
|
+
system = TestSystem.new(1)
|
16
|
+
strategy = cut.new(1)
|
17
|
+
strategy.call(system, 1).should be > 0
|
18
|
+
end
|
19
|
+
|
20
|
+
it "minimally scales with minimal work" do
|
21
|
+
system = TestSystem.new(1)
|
22
|
+
strategy = cut.new(2, 2)
|
23
|
+
strategy.call(system, 1).should == 1
|
24
|
+
end
|
25
|
+
|
26
|
+
it "maximally scales with too much work" do
|
27
|
+
system = TestSystem.new(5)
|
28
|
+
strategy = cut.new(2, 2)
|
29
|
+
strategy.call(system, 1).should == 2
|
30
|
+
end
|
31
|
+
|
32
|
+
it "proportionally scales with some work" do
|
33
|
+
system = TestSystem.new(5)
|
34
|
+
strategy = cut.new(5, 2)
|
35
|
+
strategy.call(system, 1).should == 3
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autoscaler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-12-18 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: sidekiq
|
@@ -121,6 +121,7 @@ files:
|
|
121
121
|
- lib/autoscaler/binary_scaling_strategy.rb
|
122
122
|
- lib/autoscaler/delayed_shutdown.rb
|
123
123
|
- lib/autoscaler/heroku_scaler.rb
|
124
|
+
- lib/autoscaler/linear_scaling_strategy.rb
|
124
125
|
- lib/autoscaler/sidekiq/activity.rb
|
125
126
|
- lib/autoscaler/sidekiq/celluloid_monitor.rb
|
126
127
|
- lib/autoscaler/sidekiq/client.rb
|
@@ -139,6 +140,7 @@ files:
|
|
139
140
|
- spec/autoscaler/binary_scaling_strategy_spec.rb
|
140
141
|
- spec/autoscaler/delayed_shutdown_spec.rb
|
141
142
|
- spec/autoscaler/heroku_scaler_spec.rb
|
143
|
+
- spec/autoscaler/linear_scaling_strategy_spec.rb
|
142
144
|
- spec/autoscaler/sidekiq/activity_spec.rb
|
143
145
|
- spec/autoscaler/sidekiq/celluloid_monitor_spec.rb
|
144
146
|
- spec/autoscaler/sidekiq/client_spec.rb
|
@@ -177,6 +179,7 @@ test_files:
|
|
177
179
|
- spec/autoscaler/binary_scaling_strategy_spec.rb
|
178
180
|
- spec/autoscaler/delayed_shutdown_spec.rb
|
179
181
|
- spec/autoscaler/heroku_scaler_spec.rb
|
182
|
+
- spec/autoscaler/linear_scaling_strategy_spec.rb
|
180
183
|
- spec/autoscaler/sidekiq/activity_spec.rb
|
181
184
|
- spec/autoscaler/sidekiq/celluloid_monitor_spec.rb
|
182
185
|
- spec/autoscaler/sidekiq/client_spec.rb
|