heroku_delayed_job_autoscale 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in heroku_delayed_job_autoscale.gemspec
4
+ gemspec
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,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -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
@@ -0,0 +1,3 @@
1
+ module HerokuDelayedJobAutoscale
2
+ VERSION = "0.0.2"
3
+ 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
+