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 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
+