qpush 0.1.2 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.byebug_history +74 -0
  3. data/bin/qpush-server +0 -1
  4. data/bin/qpush-web +7 -1
  5. data/jobs/fail_job.rb +11 -0
  6. data/jobs/test_job.rb +2 -0
  7. data/lib/qpush/config.rb +0 -20
  8. data/lib/qpush/job.rb +11 -7
  9. data/lib/qpush/jobs/queue_delayed.rb +17 -0
  10. data/lib/qpush/redis.rb +36 -0
  11. data/lib/qpush/server.rb +20 -2
  12. data/lib/qpush/server/apis.rb +46 -0
  13. data/lib/qpush/server/apis/delay.rb +37 -0
  14. data/lib/qpush/server/apis/execute.rb +32 -0
  15. data/lib/qpush/server/apis/fail.rb +39 -0
  16. data/lib/qpush/server/apis/history.rb +36 -0
  17. data/lib/qpush/server/apis/morgue.rb +24 -0
  18. data/lib/qpush/server/apis/perform.rb +24 -0
  19. data/lib/qpush/server/apis/queue.rb +24 -0
  20. data/lib/qpush/server/apis/setup.rb +27 -0
  21. data/lib/qpush/server/apis/success.rb +39 -0
  22. data/lib/qpush/server/delay.rb +5 -5
  23. data/lib/qpush/server/errors.rb +1 -16
  24. data/lib/qpush/server/heartbeat.rb +28 -0
  25. data/lib/qpush/server/jobs.rb +10 -55
  26. data/lib/qpush/server/launcher.rb +5 -5
  27. data/lib/qpush/server/loader.rb +38 -0
  28. data/lib/qpush/server/perform.rb +2 -2
  29. data/lib/qpush/server/queue.rb +2 -2
  30. data/lib/qpush/server/worker.rb +1 -0
  31. data/lib/qpush/version.rb +1 -1
  32. data/lib/qpush/web.rb +10 -1
  33. data/lib/qpush/web/apis/crons.rb +34 -0
  34. data/lib/qpush/web/apis/heart.rb +12 -0
  35. data/lib/qpush/web/apis/history.rb +28 -0
  36. data/lib/qpush/web/apis/jobs.rb +26 -0
  37. data/lib/qpush/web/apis/morgue.rb +30 -0
  38. data/lib/qpush/web/apis/queue_delayed.rb +29 -0
  39. data/lib/qpush/web/apis/queued.rb +0 -0
  40. data/lib/qpush/web/apis/retries.rb +40 -0
  41. data/lib/qpush/web/apis/stats.rb +58 -0
  42. data/lib/qpush/web/get.rb +32 -34
  43. data/lib/qpush/web/post.rb +8 -0
  44. data/lib/qpush/web/server.rb +34 -5
  45. data/qpush.gemspec +1 -0
  46. metadata +40 -3
  47. data/lib/qpush/server/execute.rb +0 -100
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 01a15d5df46ac29fd256af5b940ea82249588729
4
- data.tar.gz: 62a42bc427451e3d47f0d2a3ac38eaafcdee4020
3
+ metadata.gz: c81c28b25016af05e8ab1560015b659c073fb19a
4
+ data.tar.gz: 8e08d686417972044dc952001bd521bdf3a1b700
5
5
  SHA512:
6
- metadata.gz: 283c6796ce8f178a7a5cb3722f73716c31bc50bd3522dd68ff74a70b597a7ba728094fdd688e70f74fdb4ae3f9aff8e943209f878ab60f81198fbd39a344af83
7
- data.tar.gz: df33a1a4d1fd0c9efd339c17866f4db22ad0c7d05b62d6ee92f656f9adb94d6cf646fa937cca0d3f942a28fb9768cdbd1a8b7f1303e78c191639999e384fcdd4
6
+ metadata.gz: 90b802ddd706fd24e326e15b1fa4ca4a9a7578dcd87c10512fea84e148b8506b8a34f17b30be996ce9c122dfe4ed95b1ec785a54c5e4e6d5194c49b853f262b1
7
+ data.tar.gz: 69302a4491443410a50827ea88b50a3070917c6c108d515eb9ebd3afa2702d33f2f3f549ca9ee688f337c2f862db814ba1c09d7d0de9f36ab5423353b4a88a6b
@@ -1,3 +1,77 @@
1
+ c
2
+ request.path_info
3
+ c
4
+ hash
5
+ c
6
+ @jobs.compact[@start, @count]
7
+ @jobs.compact
8
+ @jobs.compact!
9
+ @count
10
+ @start
11
+ @jobs
12
+ c
13
+ @count
14
+ @start
15
+ @jobs
16
+ c
17
+ Delay.call(@job, :delay)
18
+ c
19
+ Delay.call(@job)
20
+ c
21
+ @stats.each_key { |key| puts key }
22
+ @stats.each_key { |key| @stats[key].to_i }
23
+ @stats
24
+ c
25
+ @stats
26
+ c
27
+ quit
28
+ Perform.call(@job)
29
+ c
30
+ Perform.call(@job)
31
+ c
32
+ @job
33
+ invalid_job && return unless @job.valid?
34
+ c
35
+ job
36
+ c
37
+ @fails = @fails.compact[@start, @count]
38
+ @fails
39
+ @Fails
40
+ @fails.compact!
41
+ @fails.compact![@start..@count]
42
+ @fails.compact![@start, @count]
43
+ @fails.any?
44
+ @count
45
+ @start
46
+ @fails
47
+ c
48
+ @fails
49
+ c
50
+ @fails
51
+ c
52
+ percent
53
+ quit
54
+ y
55
+ q
56
+ (100.00 - ((stats[:failed].to_f / stats[:performed].to_f) * 100.00)).round(2)
57
+ 100.00 - ((stats[:failed].to_f / stats[:performed].to_f) * 100.00)
58
+ stats[:failed].to_f / stats[:performed].to_f
59
+ stats[:failed].to_f
60
+ stats[:failed].to_i / stats[:performed].to_i
61
+ (stats[:failed] / stats[:performed])
62
+ stats[:performed]
63
+ stats[:failed]
64
+ percent
65
+ c
66
+ conn.lrange("#{QPush.config.perform_namespace}:last_10", 0, 10)
67
+ c
68
+ json
69
+ c
70
+ conn.get("#{namespace}:#{s}")
71
+ stats
72
+ c
73
+ nil.to_i
74
+ stats
1
75
  quit
2
76
  Dir[Dir.pwd + "/lib/qpush/jobs/*.rb"]
3
77
  Dir[Dir.pwd + "/lib/jobs/*.rb"]
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
-
3
2
  require 'qpush/server'
4
3
 
5
4
  server = QPush::Server::Launcher.new(ARGV)
@@ -1 +1,7 @@
1
- exec( "bundle exec rackup lib/qpush/web/server.ru" )
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'qpush/web'
4
+
5
+ #Rack::Handler::Puma.run QPush::Web::Server
6
+
7
+ exec('bundle exec rackup lib/qpush/web/server.ru')
@@ -0,0 +1,11 @@
1
+ class FailJob
2
+ include QPush::Job
3
+
4
+ def initialize(options)
5
+ @option = options
6
+ end
7
+
8
+ def call
9
+ fail
10
+ end
11
+ end
@@ -1,4 +1,6 @@
1
1
  class TestJob
2
+ include QPush::Job
3
+
2
4
  def call
3
5
  puts 'Hello from TestJob'
4
6
  end
@@ -59,25 +59,5 @@ module QPush
59
59
  url: redis_url
60
60
  }
61
61
  end
62
-
63
- def delay_namespace
64
- @delay_namespace ||= "qpush:v1:#{@namespace}:delay"
65
- end
66
-
67
- def queue_namespace
68
- @queue_namespace ||= "qpush:v1:#{@namespace}:queue"
69
- end
70
-
71
- def perform_namespace
72
- @perform_namespace ||= "qpush:v1:#{@namespace}:perform"
73
- end
74
-
75
- def stats_namespace
76
- @stats_namespace ||= "qpush:v1:#{@namespace}:stats"
77
- end
78
-
79
- def perform_lists
80
- (1..priorities).collect { |num| "#{perform_namespace}:#{num}" }
81
- end
82
62
  end
83
63
  end
@@ -9,13 +9,11 @@ module QPush
9
9
  module Job
10
10
  class << self
11
11
  def included(base)
12
- base.extend(ClassMethods)
12
+ _register_job(base)
13
13
  end
14
- end
15
14
 
16
- module ClassMethods
17
- def queue(options)
18
- QPush.job(options.merge(klass: name))
15
+ def _register_job(base)
16
+ QPush.redis.with { |c| c.sadd(QPush.keys.jobs, base.name) }
19
17
  end
20
18
  end
21
19
 
@@ -23,7 +21,7 @@ module QPush
23
21
  attr_accessor :klass, :id, :priority, :created_at, :start_at,
24
22
  :cron, :retry_max, :total_success, :total_fail,
25
23
  :run_time, :namespace
26
- attr_reader :args
24
+ attr_reader :args, :failed
27
25
 
28
26
  def initialize(options = {})
29
27
  options = defaults.merge(options)
@@ -39,6 +37,10 @@ module QPush
39
37
  @args = nil
40
38
  end
41
39
 
40
+ def failed=(failed)
41
+ @failed = failed == 'true' || failed == true
42
+ end
43
+
42
44
  def to_json
43
45
  { klass: @klass,
44
46
  id: @id,
@@ -49,6 +51,7 @@ module QPush
49
51
  retry_max: @retry_max,
50
52
  total_fail: @total_fail,
51
53
  total_success: @total_success,
54
+ failed: @failed,
52
55
  args: @args }.to_json
53
56
  end
54
57
 
@@ -64,6 +67,7 @@ module QPush
64
67
  retry_max: 10,
65
68
  total_fail: 0,
66
69
  total_success: 0,
70
+ failed: false,
67
71
  namespace: QPush.config.namespace }
68
72
  end
69
73
  end
@@ -71,7 +75,7 @@ module QPush
71
75
  class ClientWrapper < QPush::Job::Base
72
76
  def queue
73
77
  QPush.redis.with do |conn|
74
- conn.incr("qpush:v1:#{@namespace}:stats:queued")
78
+ conn.hincrby("qpush:v1:#{@namespace}:stats", 'queued', 1)
75
79
  conn.lpush("qpush:v1:#{@namespace}:queue", to_json)
76
80
  end
77
81
  end
@@ -0,0 +1,17 @@
1
+ module QPush
2
+ module Jobs
3
+ class QueueDelayed
4
+ include QPush::Job
5
+
6
+ attr_accessor :id, :score
7
+
8
+ def initialize(options)
9
+ options.each { |key, value| send("#{key}=", value) }
10
+ end
11
+
12
+ def call
13
+ 'hello'
14
+ end
15
+ end
16
+ end
17
+ end
@@ -5,6 +5,10 @@ module QPush
5
5
  def redis
6
6
  @redis_pool ||= RedisPool.create
7
7
  end
8
+
9
+ def keys
10
+ @keys ||= Rediskeys.new
11
+ end
8
12
  end
9
13
 
10
14
  class RedisPool
@@ -14,4 +18,36 @@ module QPush
14
18
  end
15
19
  end
16
20
  end
21
+
22
+ class Rediskeys
23
+ BASE = 'qpush:v1'.freeze
24
+ KEYS = [:delay,
25
+ :queue,
26
+ :perform,
27
+ :stats,
28
+ :heart,
29
+ :jobs,
30
+ :crons,
31
+ :history,
32
+ :morgue]
33
+
34
+ attr_reader :delay, :queue, :perform, :stats, :heart, :jobs,
35
+ :history, :morgue
36
+
37
+ def initialize
38
+ build_keyspaces
39
+ end
40
+
41
+ def perform_lists
42
+ (1..QPush.config.priorities).collect { |num| "#{perform}:#{num}" }
43
+ end
44
+
45
+ private
46
+
47
+ def build_keyspaces
48
+ KEYS.each do |key|
49
+ instance_variable_set("@#{key}", "#{BASE}:#{QPush.config.namespace}:#{key}")
50
+ end
51
+ end
52
+ end
17
53
  end
@@ -1,18 +1,36 @@
1
1
  # Base
2
2
  require 'qpush/base'
3
3
 
4
- # Server
4
+ # Server Base
5
+ require 'byebug'
5
6
  require 'sequel'
6
7
  require 'object_validator'
7
8
  require 'parse-cron'
9
+ require 'forwardable'
10
+ require 'qpush/server/apis'
8
11
  require 'qpush/server/database'
9
12
  require 'qpush/server/delay'
10
13
  require 'qpush/server/errors'
11
- require 'qpush/server/execute'
14
+ require 'qpush/server/heartbeat'
12
15
  require 'qpush/server/jobs'
13
16
  require 'qpush/server/launcher'
17
+ require 'qpush/server/loader'
14
18
  require 'qpush/server/logger'
15
19
  require 'qpush/server/manager'
16
20
  require 'qpush/server/perform'
17
21
  require 'qpush/server/queue'
18
22
  require 'qpush/server/worker'
23
+
24
+ # Server Apis
25
+ require 'qpush/server/apis/delay'
26
+ require 'qpush/server/apis/execute'
27
+ require 'qpush/server/apis/fail'
28
+ require 'qpush/server/apis/history'
29
+ require 'qpush/server/apis/perform'
30
+ require 'qpush/server/apis/queue'
31
+ require 'qpush/server/apis/morgue'
32
+ require 'qpush/server/apis/setup'
33
+ require 'qpush/server/apis/success'
34
+
35
+ # Base Jobs
36
+ require 'qpush/jobs/queue_delayed'
@@ -0,0 +1,46 @@
1
+ module QPush
2
+ module Server
3
+ module Apis
4
+ class Base
5
+ def self.call(*args)
6
+ api = new(*args)
7
+ api.call
8
+ end
9
+ end
10
+ end
11
+
12
+ class ApiWrapper
13
+ def initialize(job)
14
+ @job = job
15
+ end
16
+
17
+ def queue
18
+ Apis::Queue.call(@job)
19
+ end
20
+
21
+ def perform
22
+ Apis::Perform.call(@job)
23
+ end
24
+
25
+ def execute
26
+ Apis::Execute.call(@job)
27
+ end
28
+
29
+ def delay
30
+ Apis::Delay.call(@job, :delay)
31
+ end
32
+
33
+ def retry
34
+ Apis::Delay.call(@job, :retry)
35
+ end
36
+
37
+ def morgue
38
+ Apis::Morgue.call(@job)
39
+ end
40
+
41
+ def setup
42
+ Apis::Setup.call(@job)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,37 @@
1
+ module QPush
2
+ module Server
3
+ module Apis
4
+ class Delay < Base
5
+ def initialize(job, type)
6
+ @job = job
7
+ @type = type
8
+ end
9
+
10
+ def call
11
+ load_type
12
+ delay_job
13
+ end
14
+
15
+ private
16
+
17
+ def delay_job
18
+ QPush.redis.with do |conn|
19
+ conn.hincrby(QPush.keys.stats, @stat, 1)
20
+ conn.zadd(QPush.keys.delay, @time, @job.to_json)
21
+ end
22
+ end
23
+
24
+ def load_type
25
+ case @type
26
+ when :delay
27
+ @stat = 'delayed'
28
+ @time = @job.delay_until
29
+ when :retry
30
+ @stat = 'retries'
31
+ @time = @job.retry_at
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,32 @@
1
+ module QPush
2
+ module Server
3
+ module Apis
4
+ class Execute < Base
5
+ def initialize(job)
6
+ @job = job
7
+ end
8
+
9
+ def call
10
+ measure_run_time { job_object.call }
11
+ Success.call(@job)
12
+ rescue => e
13
+ Fail.call(@job, e)
14
+ end
15
+
16
+ private
17
+
18
+ def measure_run_time
19
+ start = Time.now
20
+ yield
21
+ finish = Time.now
22
+ @job.run_time = "#{((finish - start) * 1000.0).round(3)} ms"
23
+ end
24
+
25
+ def job_object
26
+ klass = Object.const_get(@job.klass)
27
+ @job.args.empty? ? klass.new : klass.new(@job.args)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,39 @@
1
+ module QPush
2
+ module Server
3
+ module Apis
4
+ class Fail < Base
5
+ def initialize(job, error)
6
+ @job = job
7
+ @error = error
8
+ end
9
+
10
+ def call
11
+ update_job
12
+ stat_increment
13
+ log_error
14
+ update_history
15
+ end
16
+
17
+ private
18
+
19
+ def update_job
20
+ @job.mark_failed
21
+ @job.retry if @job.retry_job?
22
+ @job.morgue if @job.dead_job?
23
+ end
24
+
25
+ def stat_increment
26
+ QPush.redis.with { |c| c.hincrby(QPush.keys.stats, 'failed', 1) }
27
+ end
28
+
29
+ def log_error
30
+ Server.log.err("Job FAILED | #{@job.klass} | #{@job.id} | #{@error.message}")
31
+ end
32
+
33
+ def update_history
34
+ History.call(@job, false, @error)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end