komrade-client 1.0.6 → 1.0.15
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/lib/komrade-client.rb +14 -3
- data/lib/komrade-client/http_helpers.rb +1 -1
- data/lib/komrade-client/komrade_generator.rb +9 -0
- data/lib/komrade-client/queue.rb +8 -6
- data/lib/komrade-client/worker.rb +21 -11
- data/readme.md +26 -16
- metadata +3 -2
data/lib/komrade-client.rb
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
require 'uri'
|
|
2
|
+
require 'thread'
|
|
2
3
|
|
|
3
4
|
module Komrade
|
|
4
5
|
extend self
|
|
5
6
|
Error = Class.new(StandardError)
|
|
7
|
+
@outLocker = Mutex.new
|
|
6
8
|
|
|
7
9
|
def env(key)
|
|
8
10
|
ENV[key]
|
|
@@ -25,16 +27,25 @@ module Komrade
|
|
|
25
27
|
if block_given?
|
|
26
28
|
start = Time.now
|
|
27
29
|
result = yield
|
|
28
|
-
data.merge!(val
|
|
30
|
+
data.merge!(:val => (Time.now - start))
|
|
29
31
|
end
|
|
30
32
|
data.reduce(out=String.new) do |s, tup|
|
|
31
33
|
s << [tup.first, tup.last].join("=") << " "
|
|
32
34
|
end
|
|
33
|
-
|
|
35
|
+
@outLocker.synchronize do
|
|
36
|
+
$stdout.puts(out)
|
|
37
|
+
end
|
|
34
38
|
return result
|
|
35
39
|
end
|
|
36
40
|
|
|
37
41
|
end
|
|
38
42
|
|
|
39
43
|
require 'komrade-client/queue'
|
|
40
|
-
|
|
44
|
+
|
|
45
|
+
if defined?(Rails)
|
|
46
|
+
require 'rails/railtie'
|
|
47
|
+
require 'komrade-client/railtie'
|
|
48
|
+
|
|
49
|
+
require 'rails/generators/base'
|
|
50
|
+
require 'komrade-client/komrade_generator'
|
|
51
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class KomradeGenerator < Rails::Generators::Base
|
|
2
|
+
desc "This generator adds a komrade-worker process to your Procfile"
|
|
3
|
+
def append_procfile
|
|
4
|
+
File.open("Procfile", 'ab') do |file|
|
|
5
|
+
file.write("komrade-worker: bundle exec rake komrade:work")
|
|
6
|
+
end
|
|
7
|
+
puts "A worker process has been added to your Procfile you will be billed accordingly."
|
|
8
|
+
end
|
|
9
|
+
end
|
data/lib/komrade-client/queue.rb
CHANGED
|
@@ -12,7 +12,7 @@ module Komrade
|
|
|
12
12
|
# Fast operation.
|
|
13
13
|
def enqueue(method, *args)
|
|
14
14
|
SecureRandom.uuid.tap do |id|
|
|
15
|
-
log(:at => "enqueue-job", :
|
|
15
|
+
log(:at => "enqueue-job", :id => id, :method => method) do
|
|
16
16
|
put("/jobs/#{id}", method: method, args: args)
|
|
17
17
|
end
|
|
18
18
|
end
|
|
@@ -23,19 +23,21 @@ module Komrade
|
|
|
23
23
|
# If you dequeue a job, it is your responsiblity to update the job.
|
|
24
24
|
# Updates to jobs include: heartbeat, fail, and delete.
|
|
25
25
|
#
|
|
26
|
+
# There is no logging for dequeue since this method will be called
|
|
27
|
+
# frequently. Instead, logging should happen in the caller of
|
|
28
|
+
# dequeue to inform the stream that a job was locked.
|
|
29
|
+
#
|
|
26
30
|
# Moderately fast operation.
|
|
27
31
|
def dequeue(opts={})
|
|
28
32
|
limit = opts[:limit] || 1
|
|
29
|
-
|
|
30
|
-
get("/jobs?limit=#{limit}")
|
|
31
|
-
end
|
|
33
|
+
get("/jobs?limit=#{limit}")
|
|
32
34
|
end
|
|
33
35
|
|
|
34
36
|
# Idempotent call to delete a job from the queue.
|
|
35
37
|
#
|
|
36
38
|
# Fast operation.
|
|
37
39
|
def remove(id)
|
|
38
|
-
log(:at => "remove-job", :
|
|
40
|
+
log(:at => "remove-job", :id => id) do
|
|
39
41
|
delete("/jobs/#{id}")
|
|
40
42
|
end
|
|
41
43
|
end
|
|
@@ -45,7 +47,7 @@ module Komrade
|
|
|
45
47
|
#
|
|
46
48
|
# Slow operation.
|
|
47
49
|
def delete_all
|
|
48
|
-
log(:at => "
|
|
50
|
+
log(:at => "delete-all") do
|
|
49
51
|
post("/delete-all-jobs")
|
|
50
52
|
end
|
|
51
53
|
end
|
|
@@ -25,23 +25,33 @@ module Komrade
|
|
|
25
25
|
# This method will lock a job & evaluate the code defined by the job.
|
|
26
26
|
# Also, this method will make the best attempt to delete the job
|
|
27
27
|
# from the queue before returning.
|
|
28
|
+
#
|
|
29
|
+
# Before the worker evaluates the code extracted from the job,
|
|
30
|
+
# it spawns a thread which will send heartbeats to komrade. This
|
|
31
|
+
# indicates to the back end that the job is being processed. If heartbeats
|
|
32
|
+
# stop coming in for a job, komrade may thing that the job is lost and
|
|
33
|
+
# subsequently release the lock and place it back in the queue.
|
|
28
34
|
def work
|
|
29
35
|
jobs = Queue.dequeue
|
|
30
36
|
until jobs.empty?
|
|
31
37
|
job = jobs.pop
|
|
32
38
|
begin
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
@beats
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
log(:at => "work-job", :id => job['id']) do
|
|
40
|
+
@finished, @beats = false, 0
|
|
41
|
+
Thread.new do
|
|
42
|
+
while @beats == 0 || !@finished
|
|
43
|
+
@beats += 1
|
|
44
|
+
log(:at => "heartbeat-job", :id => job['id'])
|
|
45
|
+
HttpHelpers.post("/jobs/#{job['id']}/heartbeats")
|
|
46
|
+
sleep(1)
|
|
47
|
+
end
|
|
39
48
|
end
|
|
49
|
+
call(job["payload"])
|
|
50
|
+
@finished = true
|
|
40
51
|
end
|
|
41
|
-
call(job["payload"])
|
|
42
|
-
@finished = true
|
|
43
52
|
rescue => e
|
|
44
53
|
handle_failure(job, e)
|
|
54
|
+
raise(e)
|
|
45
55
|
ensure
|
|
46
56
|
Queue.remove(job["id"])
|
|
47
57
|
end
|
|
@@ -62,13 +72,13 @@ module Komrade
|
|
|
62
72
|
# is raised during the execution of the job.
|
|
63
73
|
def handle_failure(job,e)
|
|
64
74
|
fid = SecureRandom.uuid
|
|
65
|
-
log(:at => "handle-failure", :
|
|
75
|
+
log(:at => "handle-failure", :id => job['id'], 'failure-id' => fid)
|
|
66
76
|
b = {error: e.class, message: e.message}
|
|
67
77
|
HttpHelpers.put("/jobs/#{job['id']}/failures/#{fid}", b)
|
|
68
78
|
end
|
|
69
79
|
|
|
70
|
-
def log(data)
|
|
71
|
-
Komrade.log(data)
|
|
80
|
+
def log(data, &blk)
|
|
81
|
+
Komrade.log(data, &blk)
|
|
72
82
|
end
|
|
73
83
|
|
|
74
84
|
end
|
data/readme.md
CHANGED
|
@@ -14,30 +14,46 @@ $ gem install komrade-client
|
|
|
14
14
|
## Usage
|
|
15
15
|
|
|
16
16
|
1. Install Gem
|
|
17
|
-
2.
|
|
18
|
-
3.
|
|
17
|
+
2. Minimalist Example
|
|
18
|
+
3. Rails Example
|
|
19
19
|
4. Komrade Dashboard
|
|
20
20
|
|
|
21
|
-
### Install
|
|
21
|
+
### Install Gem
|
|
22
22
|
|
|
23
23
|
Gemfile
|
|
24
24
|
|
|
25
25
|
```ruby
|
|
26
26
|
source :rubygems
|
|
27
|
-
gem 'komrade-client', '1.0.
|
|
27
|
+
gem 'komrade-client', '~> 1.0.15'
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
###
|
|
30
|
+
### Minimalist Example ###
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
This is the absolute bare minimum to see Komrade in action.
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
|
-
$ export KOMRADE_URL=https://
|
|
35
|
+
$ export KOMRADE_URL=https://{heroku_username}:{heroku_password}@service.komrade.io
|
|
36
36
|
$ ruby -r komrade-client -e 'Komrade::Queue.enqueue("puts", "hello world")'
|
|
37
37
|
$ ruby -r komrade-client -e 'puts Komrade::Queue.dequeue'
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
You should see "hello world" output in your terminal.
|
|
41
|
+
|
|
42
|
+
### Rails Example ###
|
|
43
|
+
|
|
44
|
+
To get started add `gem 'komrade-client', '~> 1.0.15'` to your Gemfile. Then run
|
|
45
|
+
`rails g komrade`. This will add a komrade-worker process to your Procfile (feel
|
|
46
|
+
free to edit your Procfile by hand if you prefer).
|
|
47
|
+
|
|
48
|
+
Your Procfile now should look something like this:
|
|
49
|
+
```
|
|
50
|
+
web: bundle exec rails s
|
|
51
|
+
komrade-worker: bundle exec rake komrade:work
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
This is an example of a Rails model that sends a welcome email upon user sign up.
|
|
55
|
+
The only code that is unique to Komrade here is the `Komrade::Queue.enqueue` method.
|
|
56
|
+
This method takes a method as a string and any parameters you want to pass to that method.
|
|
41
57
|
|
|
42
58
|
```ruby
|
|
43
59
|
|
|
@@ -56,14 +72,9 @@ class User < ActiveRecord::Base
|
|
|
56
72
|
end
|
|
57
73
|
```
|
|
58
74
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
Procfile
|
|
75
|
+
When you deploy your code, the will queue be ready to accept jobs, and the worker process
|
|
76
|
+
is waiting to do the work.
|
|
62
77
|
|
|
63
|
-
```
|
|
64
|
-
web: bundle exec rails s
|
|
65
|
-
worker: bundle exec rake komrade:work
|
|
66
|
-
```
|
|
67
78
|
|
|
68
79
|
### Komrade Dashboard
|
|
69
80
|
|
|
@@ -72,4 +83,3 @@ $ heroku addons:open komrade:test
|
|
|
72
83
|
```
|
|
73
84
|
|
|
74
85
|

|
|
75
|
-
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: komrade-client
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.15
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -11,13 +11,14 @@ bindir: bin
|
|
|
11
11
|
cert_chain: []
|
|
12
12
|
date: 2013-01-26 00:00:00.000000000 Z
|
|
13
13
|
dependencies: []
|
|
14
|
-
description: A client library for the
|
|
14
|
+
description: A client library for the komrade worker queue.
|
|
15
15
|
email: komrade@32k.io
|
|
16
16
|
executables: []
|
|
17
17
|
extensions: []
|
|
18
18
|
extra_rdoc_files: []
|
|
19
19
|
files:
|
|
20
20
|
- lib/komrade-client/http_helpers.rb
|
|
21
|
+
- lib/komrade-client/komrade_generator.rb
|
|
21
22
|
- lib/komrade-client/queue.rb
|
|
22
23
|
- lib/komrade-client/railtie.rb
|
|
23
24
|
- lib/komrade-client/rate_limiter.rb
|