heroku_delayed_job_autoscale 0.0.2
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/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +43 -0
- data/README.md +36 -0
- data/Rakefile +2 -0
- data/heroku_delayed_job_autoscale.gemspec +27 -0
- data/lib/heroku_delayed_job_autoscale.rb +40 -0
- data/lib/heroku_delayed_job_autoscale/managers/heroku.rb +24 -0
- data/lib/heroku_delayed_job_autoscale/managers/local.rb +20 -0
- data/lib/heroku_delayed_job_autoscale/version.rb +3 -0
- metadata +117 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
heroku_delayed_job_autoscale (0.0.1)
|
5
|
+
delayed_job (>= 2.1)
|
6
|
+
heroku (>= 1)
|
7
|
+
rush (>= 0.6)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: http://rubygems.org/
|
11
|
+
specs:
|
12
|
+
activesupport (3.0.3)
|
13
|
+
configuration (1.2.0)
|
14
|
+
daemons (1.1.0)
|
15
|
+
delayed_job (2.1.2)
|
16
|
+
activesupport (~> 3.0)
|
17
|
+
daemons
|
18
|
+
fattr (2.2.0)
|
19
|
+
heroku (1.16.2)
|
20
|
+
json_pure (>= 1.2.0, < 1.5.0)
|
21
|
+
launchy (~> 0.3.2)
|
22
|
+
rest-client (>= 1.4.0, < 1.7.0)
|
23
|
+
json_pure (1.4.6)
|
24
|
+
launchy (0.3.7)
|
25
|
+
configuration (>= 0.0.5)
|
26
|
+
rake (>= 0.8.1)
|
27
|
+
mime-types (1.16)
|
28
|
+
rake (0.8.7)
|
29
|
+
rest-client (1.6.1)
|
30
|
+
mime-types (>= 1.16)
|
31
|
+
rush (0.6.7)
|
32
|
+
session
|
33
|
+
session (3.1.0)
|
34
|
+
fattr
|
35
|
+
|
36
|
+
PLATFORMS
|
37
|
+
ruby
|
38
|
+
|
39
|
+
DEPENDENCIES
|
40
|
+
delayed_job (>= 2.1)
|
41
|
+
heroku (>= 1)
|
42
|
+
heroku_delayed_job_autoscale!
|
43
|
+
rush (>= 0.6)
|
data/README.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# Heroku Delayed Job Autoscale
|
2
|
+
Simply put, this gem saves you money on Heroku by only running the workers when you need them.
|
3
|
+
When a new job is enqueued, this gem will fire up a new worker instance if none are running. When the job finishes, it'll shut it down.
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
Create a delayed job worker and include HerokuDelayedJobAutoscale::Autoscale:
|
7
|
+
|
8
|
+
class OnImageUpload
|
9
|
+
include HerokuDelayedJobAutoscale::Autoscale
|
10
|
+
|
11
|
+
def initialize(media)
|
12
|
+
@media = media
|
13
|
+
end
|
14
|
+
|
15
|
+
def perform
|
16
|
+
@media.create_thumb
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
Done
|
21
|
+
|
22
|
+
## Requirements
|
23
|
+
* Rush >= 0.6 - https://github.com/heroku/rush
|
24
|
+
* Heroku client >= 1 - https://github.com/heroku/heroku
|
25
|
+
* Delayed Job >= 2.1 - https://github.com/collectiveidea/delayed_job
|
26
|
+
|
27
|
+
I haven't tested lower versions, but it might work.
|
28
|
+
|
29
|
+
## Caution
|
30
|
+
Autoscale uses two DJ hooks. #after and #enqueue, which it just passes onto two methods autoscale\_after and autoscale\_enqueue.
|
31
|
+
If you need to use either of those hooks yourself in your DJ worker, make sure you pass on the job to the autoscale\_methods manually.
|
32
|
+
|
33
|
+
## Other
|
34
|
+
Work is based of [pedro's autoscaling branch][1], but adapted for Delayed Job 2.1 and rails 3.
|
35
|
+
|
36
|
+
[1]: https://github.com/pedro/delayed_job/tree/autoscaling
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "heroku_delayed_job_autoscale/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "heroku_delayed_job_autoscale"
|
7
|
+
s.version = HerokuDelayedJobAutoscale::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Peter Haza"]
|
10
|
+
s.email = ["peter.haza@gmail.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{A simple gem which enables automatic on/off for workers in heroku, saving you money.}
|
13
|
+
s.description = %q{The module within this gem simply listens for enqueues and finished jobs.
|
14
|
+
On enqueue it'll fire up a new worker instance if none are running,
|
15
|
+
on finish it'll shut down the worker if there are no more jobs.}
|
16
|
+
|
17
|
+
s.rubyforge_project = "heroku_delayed_job_autoscale"
|
18
|
+
|
19
|
+
s.files = `git ls-files`.split("\n")
|
20
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
21
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
|
+
s.require_paths = ["lib"]
|
23
|
+
|
24
|
+
s.add_dependency 'heroku', '>= 1'
|
25
|
+
s.add_dependency 'rush', '>= 0.6'
|
26
|
+
s.add_dependency 'delayed_job', '>= 2.1'
|
27
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'heroku_delayed_job_autoscale/managers/local'
|
2
|
+
require 'heroku_delayed_job_autoscale/managers/heroku'
|
3
|
+
|
4
|
+
module HerokuDelayedJobAutoscale
|
5
|
+
module Autoscale
|
6
|
+
|
7
|
+
@@autoscale_manager = HerokuDelayedJobAutoscale::Manager::Local
|
8
|
+
|
9
|
+
def enqueue(job)
|
10
|
+
autoscale_enqueue(job)
|
11
|
+
end
|
12
|
+
|
13
|
+
def autoscale_enqueue(job)
|
14
|
+
Rails.logger.debug "enqueue"
|
15
|
+
|
16
|
+
if autoscale_client.qty.zero?
|
17
|
+
autoscale_client.scale_up
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def perform
|
22
|
+
raise "Not implemented"
|
23
|
+
end
|
24
|
+
|
25
|
+
def after(job)
|
26
|
+
autoscale_after(job)
|
27
|
+
end
|
28
|
+
|
29
|
+
def autoscale_after(job)
|
30
|
+
# after is triggered before the job is removed, hence we see if this is the last job
|
31
|
+
autoscale_client.scale_down unless job.class.count - 1 > 0
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
def autoscale_client
|
36
|
+
@autoscale_client ||= @@autoscale_manager.new
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module HerokuDelayedJobAutoscale
|
2
|
+
module Manager
|
3
|
+
class Heroku
|
4
|
+
def initialize(options={})
|
5
|
+
username = options[:username] || ENV['HEROKU_USERNAME']
|
6
|
+
password = options[:password] || ENV['HEROKU_PASSWORD']
|
7
|
+
@app = options[:app] || ENV['HEROKU_APP']
|
8
|
+
@client = ::Heroku::Client.new(username, password)
|
9
|
+
end
|
10
|
+
|
11
|
+
def qty
|
12
|
+
@client.info(@app)[:workers].to_i
|
13
|
+
end
|
14
|
+
|
15
|
+
def scale_up
|
16
|
+
@client.set_workers(@app, 1)
|
17
|
+
end
|
18
|
+
|
19
|
+
def scale_down
|
20
|
+
@client.set_workers(@app, 0)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module HerokuDelayedJobAutoscale
|
2
|
+
module Manager
|
3
|
+
class Local
|
4
|
+
def initialize(options={})
|
5
|
+
end
|
6
|
+
|
7
|
+
def qty
|
8
|
+
Rush::Box.new.processes.filter(:cmdline => /rake jobs:work/).size
|
9
|
+
end
|
10
|
+
|
11
|
+
def scale_up
|
12
|
+
Rush::Box.new[Rails.root].bash "rake jobs:work", :background => true
|
13
|
+
end
|
14
|
+
|
15
|
+
def scale_down
|
16
|
+
$exit = true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: heroku_delayed_job_autoscale
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Peter Haza
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-01-10 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: heroku
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 1
|
30
|
+
version: "1"
|
31
|
+
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rush
|
35
|
+
prerelease: false
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 6
|
44
|
+
version: "0.6"
|
45
|
+
type: :runtime
|
46
|
+
version_requirements: *id002
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: delayed_job
|
49
|
+
prerelease: false
|
50
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 2
|
57
|
+
- 1
|
58
|
+
version: "2.1"
|
59
|
+
type: :runtime
|
60
|
+
version_requirements: *id003
|
61
|
+
description: |-
|
62
|
+
The module within this gem simply listens for enqueues and finished jobs.
|
63
|
+
On enqueue it'll fire up a new worker instance if none are running,
|
64
|
+
on finish it'll shut down the worker if there are no more jobs.
|
65
|
+
email:
|
66
|
+
- peter.haza@gmail.com
|
67
|
+
executables: []
|
68
|
+
|
69
|
+
extensions: []
|
70
|
+
|
71
|
+
extra_rdoc_files: []
|
72
|
+
|
73
|
+
files:
|
74
|
+
- .gitignore
|
75
|
+
- Gemfile
|
76
|
+
- Gemfile.lock
|
77
|
+
- README.md
|
78
|
+
- Rakefile
|
79
|
+
- heroku_delayed_job_autoscale.gemspec
|
80
|
+
- lib/heroku_delayed_job_autoscale.rb
|
81
|
+
- lib/heroku_delayed_job_autoscale/managers/heroku.rb
|
82
|
+
- lib/heroku_delayed_job_autoscale/managers/local.rb
|
83
|
+
- lib/heroku_delayed_job_autoscale/version.rb
|
84
|
+
has_rdoc: true
|
85
|
+
homepage: ""
|
86
|
+
licenses: []
|
87
|
+
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options: []
|
90
|
+
|
91
|
+
require_paths:
|
92
|
+
- lib
|
93
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
segments:
|
99
|
+
- 0
|
100
|
+
version: "0"
|
101
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
version: "0"
|
109
|
+
requirements: []
|
110
|
+
|
111
|
+
rubyforge_project: heroku_delayed_job_autoscale
|
112
|
+
rubygems_version: 1.3.7
|
113
|
+
signing_key:
|
114
|
+
specification_version: 3
|
115
|
+
summary: A simple gem which enables automatic on/off for workers in heroku, saving you money.
|
116
|
+
test_files: []
|
117
|
+
|