upperkut 0.7.2 → 0.7.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/Gemfile +0 -1
- data/Gemfile.lock +20 -23
- data/README.md +55 -26
- data/examples/priority_worker.rb +21 -0
- data/lib/upperkut/batch_execution.rb +12 -6
- data/lib/upperkut/redis_pool.rb +3 -3
- data/lib/upperkut/strategies/buffered_queue.rb +13 -10
- data/lib/upperkut/strategies/priority_queue.rb +197 -0
- data/lib/upperkut/version.rb +1 -1
- data/upperkut.gemspec +2 -2
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7c6cb99c0744e428ea946a58b2aa5b1065bb5abdd37487cd01caeb5589ecec1
|
4
|
+
data.tar.gz: 9d560415137c6e60d9588a625a5f79446af88dedfd492a32e03ccea73fc45008
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cafd45d08f7677f4c8b9624fe97303e9d0365f7d466467a6e52d152392ac272a635cf572f304ba811f2340dfe83406474de468aa5e4a1f90dd6c12e58dd76e26
|
7
|
+
data.tar.gz: 8e365782ec521ee2370b5f8fefcf2b38bf6ff610f66dd6392887fa38fc544e03bb80fa02467e6d5a7aebf2be486a39b87de8f61a7fa96a6e0d43249730b4c3e5
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
0.7.x
|
4
4
|
---------
|
5
|
+
- Add handle_error method #44
|
6
|
+
- Added Datahog Middleware (#42)
|
7
|
+
- Added Priority Queue (#39) thanks to @jeangnc and @jeanmatheussouto
|
5
8
|
- Added Scheduled Queue Implementation thanks to @rodrigo-araujo #38
|
6
9
|
- Added Datahog middleware #42 by @gabriel-augusto
|
7
10
|
- Added redis to CI #40 by #henrich-m
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
upperkut (0.7.
|
4
|
+
upperkut (0.7.4)
|
5
5
|
connection_pool (~> 2.2, >= 2.2.2)
|
6
|
-
redis (>=
|
6
|
+
redis (>= 4.1.0, < 5.0.0)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
@@ -12,29 +12,27 @@ GEM
|
|
12
12
|
connection_pool (2.2.2)
|
13
13
|
diff-lcs (1.3)
|
14
14
|
docile (1.3.1)
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
method_source (0.9.0)
|
20
|
-
pry (0.11.3)
|
15
|
+
fivemat (1.3.7)
|
16
|
+
json (2.2.0)
|
17
|
+
method_source (0.9.2)
|
18
|
+
pry (0.12.2)
|
21
19
|
coderay (~> 1.1.0)
|
22
20
|
method_source (~> 0.9.0)
|
23
21
|
rake (10.5.0)
|
24
|
-
redis (4.0
|
25
|
-
rspec (3.
|
26
|
-
rspec-core (~> 3.
|
27
|
-
rspec-expectations (~> 3.
|
28
|
-
rspec-mocks (~> 3.
|
29
|
-
rspec-core (3.
|
30
|
-
rspec-support (~> 3.
|
31
|
-
rspec-expectations (3.
|
22
|
+
redis (4.1.0)
|
23
|
+
rspec (3.8.0)
|
24
|
+
rspec-core (~> 3.8.0)
|
25
|
+
rspec-expectations (~> 3.8.0)
|
26
|
+
rspec-mocks (~> 3.8.0)
|
27
|
+
rspec-core (3.8.0)
|
28
|
+
rspec-support (~> 3.8.0)
|
29
|
+
rspec-expectations (3.8.3)
|
32
30
|
diff-lcs (>= 1.2.0, < 2.0)
|
33
|
-
rspec-support (~> 3.
|
34
|
-
rspec-mocks (3.
|
31
|
+
rspec-support (~> 3.8.0)
|
32
|
+
rspec-mocks (3.8.0)
|
35
33
|
diff-lcs (>= 1.2.0, < 2.0)
|
36
|
-
rspec-support (~> 3.
|
37
|
-
rspec-support (3.
|
34
|
+
rspec-support (~> 3.8.0)
|
35
|
+
rspec-support (3.8.0)
|
38
36
|
rspec_junit_formatter (0.4.1)
|
39
37
|
rspec-core (>= 2, < 4, != 2.12.0)
|
40
38
|
simplecov (0.16.1)
|
@@ -47,8 +45,7 @@ PLATFORMS
|
|
47
45
|
ruby
|
48
46
|
|
49
47
|
DEPENDENCIES
|
50
|
-
bundler (
|
51
|
-
fakeredis
|
48
|
+
bundler (>= 1.16)
|
52
49
|
fivemat
|
53
50
|
pry
|
54
51
|
rake (~> 10.0)
|
@@ -58,4 +55,4 @@ DEPENDENCIES
|
|
58
55
|
upperkut!
|
59
56
|
|
60
57
|
BUNDLED WITH
|
61
|
-
1.
|
58
|
+
1.17.2
|
data/README.md
CHANGED
@@ -4,6 +4,8 @@
|
|
4
4
|
[![Maintainability](https://api.codeclimate.com/v1/badges/ece40319b0db03af891d/maintainability)](https://codeclimate.com/repos/5b318a7c6d37b70272008676/maintainability)
|
5
5
|
[![Test Coverage](https://api.codeclimate.com/v1/badges/ece40319b0db03af891d/test_coverage)](https://codeclimate.com/repos/5b318a7c6d37b70272008676/test_coverage)
|
6
6
|
|
7
|
+
[[Docs]](https://www.rubydoc.info/gems/upperkut/0.7.2/Upperkut)
|
8
|
+
|
7
9
|
Background processing framework for Ruby applications.
|
8
10
|
|
9
11
|
## Installation
|
@@ -31,25 +33,6 @@ Or install it yourself as:
|
|
31
33
|
class MyWorker
|
32
34
|
include Upperkut::Worker
|
33
35
|
|
34
|
-
# This is optional
|
35
|
-
|
36
|
-
setup_upperkut do |config|
|
37
|
-
# Define which redis instance you want to use
|
38
|
-
config.strategy = Upperkut::Strategies::BufferedQueue.new(
|
39
|
-
self,
|
40
|
-
redis: { url: ENV['ANOTHER_REDIS_INSTANCE_URL'] },
|
41
|
-
batch_size: 400, # How many events should be dispatched to worker.
|
42
|
-
max_wait: 300 # How long Processor wait in seconds to process batch.
|
43
|
-
# even though the amount of items did not reached the
|
44
|
-
# the batch_size.
|
45
|
-
)
|
46
|
-
|
47
|
-
# How frequent the Processor should hit redis looking for elegible
|
48
|
-
# batch. The default value is 5 seconds. You can also set the env
|
49
|
-
# UPPERKUT_POLLING_INTERVAL.
|
50
|
-
config.polling_interval = 4
|
51
|
-
end
|
52
|
-
|
53
36
|
def perform(batch_items)
|
54
37
|
heavy_processing(batch_items)
|
55
38
|
process_metrics(batch_items)
|
@@ -57,13 +40,13 @@ Or install it yourself as:
|
|
57
40
|
end
|
58
41
|
```
|
59
42
|
|
60
|
-
2) Start
|
43
|
+
2) Start pushing items;
|
61
44
|
```ruby
|
62
45
|
Myworker.push_items(
|
63
46
|
[
|
64
47
|
{
|
65
|
-
'id' => SecureRandom.uuid,
|
66
|
-
'name' => 'Robert C Hall',
|
48
|
+
'id' => SecureRandom.uuid,
|
49
|
+
'name' => 'Robert C Hall',
|
67
50
|
'action' => 'EMAIL_OPENNED'
|
68
51
|
}
|
69
52
|
]
|
@@ -94,15 +77,15 @@ Or install it yourself as:
|
|
94
77
|
end
|
95
78
|
```
|
96
79
|
|
97
|
-
2) Start
|
80
|
+
2) Start pushing items with `timestamp` parameter;
|
98
81
|
```ruby
|
99
82
|
# timestamp is 'Thu, 10 May 2019 23:43:58 GMT'
|
100
83
|
Myworker.push_items(
|
101
84
|
[
|
102
85
|
{
|
103
|
-
'timestamp' => '1557531838',
|
104
|
-
'id' => SecureRandom.uuid,
|
105
|
-
'name' => 'Robert C Hall',
|
86
|
+
'timestamp' => '1557531838',
|
87
|
+
'id' => SecureRandom.uuid,
|
88
|
+
'name' => 'Robert C Hall',
|
106
89
|
'action' => 'SEND_NOTIFICATION'
|
107
90
|
}
|
108
91
|
]
|
@@ -114,6 +97,52 @@ Or install it yourself as:
|
|
114
97
|
$ bundle exec upperkut --worker MyWorker --concurrency 10
|
115
98
|
```
|
116
99
|
|
100
|
+
### Example 3 - Priority Queue:
|
101
|
+
|
102
|
+
Note: priority queues requires redis 5.0.0+ as it uses ZPOP* commands.
|
103
|
+
|
104
|
+
1) Create a Worker class and the define how to process the batch;
|
105
|
+
```ruby
|
106
|
+
require 'upperkut/strategies/priority_queue'
|
107
|
+
|
108
|
+
class MyWorker
|
109
|
+
include Upperkut::Worker
|
110
|
+
|
111
|
+
setup_upperkut do |config|
|
112
|
+
config.strategy = Upperkut::Strategies::PriorityQueue.new(
|
113
|
+
self,
|
114
|
+
priority_key: -> { |item| item['tenant_id'] }
|
115
|
+
)
|
116
|
+
end
|
117
|
+
|
118
|
+
def perform(items)
|
119
|
+
items.each do |item|
|
120
|
+
puts "event dispatched: #{item.inspect}"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
```
|
125
|
+
|
126
|
+
2) So you can enqueue items from different tenants;
|
127
|
+
```ruby
|
128
|
+
MyWorker.push_items(
|
129
|
+
[
|
130
|
+
{ 'tenant_id' => 1, 'id' => 1 },
|
131
|
+
{ 'tenant_id' => 1, 'id' => 2 },
|
132
|
+
{ 'tenant_id' => 1, 'id' => 3 },
|
133
|
+
{ 'tenant_id' => 2, 'id' => 4 },
|
134
|
+
{ 'tenant_id' => 3, 'id' => 5 },
|
135
|
+
]
|
136
|
+
)
|
137
|
+
```
|
138
|
+
|
139
|
+
The code above will enqueue items as follows `1, 4, 5, 2, 3`
|
140
|
+
|
141
|
+
3) Start Upperkut;
|
142
|
+
```bash
|
143
|
+
$ bundle exec upperkut --worker MyWorker --concurrency 10
|
144
|
+
```
|
145
|
+
|
117
146
|
## Development
|
118
147
|
|
119
148
|
After checking out the repo, run `bundle install` to install dependencies. Then, run `bundle exec rspec` to run the tests.
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative '../lib/upperkut/worker'
|
2
|
+
require_relative '../lib/upperkut/strategies/priority_queue'
|
3
|
+
|
4
|
+
class PriorityWorker
|
5
|
+
include Upperkut::Worker
|
6
|
+
|
7
|
+
setup_upperkut do |config|
|
8
|
+
config.strategy = Upperkut::Strategies::PriorityQueue.new(
|
9
|
+
self,
|
10
|
+
priority_key: -> { |item| item['tenant_id'] },
|
11
|
+
batch_size: 1
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
def perform(items)
|
16
|
+
items.each do |item|
|
17
|
+
puts "event dispatched: #{item.inspect}"
|
18
|
+
sleep 1
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -20,17 +20,23 @@ module Upperkut
|
|
20
20
|
@worker.server_middlewares.invoke(@worker, items) do
|
21
21
|
worker_instance.perform(items_body.dup)
|
22
22
|
end
|
23
|
-
rescue
|
24
|
-
@worker.push_items(items_body)
|
25
|
-
|
23
|
+
rescue StandardError => error
|
26
24
|
@logger.info(
|
27
25
|
action: :requeue,
|
28
|
-
ex:
|
26
|
+
ex: error,
|
29
27
|
item_size: items_body.size
|
30
28
|
)
|
31
29
|
|
32
|
-
@logger.error(
|
33
|
-
|
30
|
+
@logger.error(error.backtrace.join("\n"))
|
31
|
+
|
32
|
+
if worker_instance.respond_to?(:handle_error)
|
33
|
+
worker_instance.handle_error(error, items_body)
|
34
|
+
return
|
35
|
+
else
|
36
|
+
@worker.push_items(items_body)
|
37
|
+
end
|
38
|
+
|
39
|
+
raise error
|
34
40
|
end
|
35
41
|
end
|
36
42
|
end
|
data/lib/upperkut/redis_pool.rb
CHANGED
@@ -8,12 +8,12 @@ module Upperkut
|
|
8
8
|
size: 2, # pool related option
|
9
9
|
connect_timeout: 0.2,
|
10
10
|
read_timeout: 5.0,
|
11
|
-
write_timeout: 0.5
|
12
|
-
url: ENV['REDIS_URL']
|
11
|
+
write_timeout: 0.5
|
13
12
|
}.freeze
|
14
13
|
|
15
14
|
def initialize(options)
|
16
|
-
@options = DEFAULT_OPTIONS.merge(
|
15
|
+
@options = DEFAULT_OPTIONS.merge(url: ENV['REDIS_URL'])
|
16
|
+
.merge(options)
|
17
17
|
|
18
18
|
# Extract pool related options
|
19
19
|
@size = @options.delete(:size)
|
@@ -12,7 +12,6 @@ module Upperkut
|
|
12
12
|
def initialize(worker, options = {})
|
13
13
|
@options = options
|
14
14
|
@redis_options = options.fetch(:redis, {})
|
15
|
-
@redis_pool = setup_redis_pool
|
16
15
|
@worker = worker
|
17
16
|
@max_wait = options.fetch(
|
18
17
|
:max_wait,
|
@@ -75,6 +74,10 @@ module Upperkut
|
|
75
74
|
|
76
75
|
private
|
77
76
|
|
77
|
+
def key
|
78
|
+
"upperkut:buffers:#{to_underscore(@worker.name)}"
|
79
|
+
end
|
80
|
+
|
78
81
|
def fulfill_condition?(buff_size)
|
79
82
|
return false if buff_size.zero?
|
80
83
|
|
@@ -96,22 +99,22 @@ module Upperkut
|
|
96
99
|
now - item.fetch('enqueued_at', Time.now).to_f
|
97
100
|
end
|
98
101
|
|
99
|
-
def setup_redis_pool
|
100
|
-
return @redis_options if @redis_options.is_a?(ConnectionPool)
|
101
|
-
|
102
|
-
RedisPool.new(options.fetch(:redis, {})).create
|
103
|
-
end
|
104
|
-
|
105
102
|
def redis
|
106
103
|
raise ArgumentError, 'requires a block' unless block_given?
|
107
104
|
|
108
|
-
|
105
|
+
redis_pool.with do |conn|
|
109
106
|
yield conn
|
110
107
|
end
|
111
108
|
end
|
112
109
|
|
113
|
-
def
|
114
|
-
|
110
|
+
def redis_pool
|
111
|
+
@redis_pool ||= begin
|
112
|
+
if @redis_options.is_a?(ConnectionPool)
|
113
|
+
@redis_options
|
114
|
+
else
|
115
|
+
RedisPool.new(@redis_options).create
|
116
|
+
end
|
117
|
+
end
|
115
118
|
end
|
116
119
|
end
|
117
120
|
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
module Upperkut
|
2
|
+
module Strategies
|
3
|
+
# Public: Queue that prevent a single tenant from taking over.
|
4
|
+
class PriorityQueue < Upperkut::Strategies::Base
|
5
|
+
include Upperkut::Util
|
6
|
+
|
7
|
+
ONE_DAY_IN_SECONDS = 86400
|
8
|
+
|
9
|
+
# Logic as follows:
|
10
|
+
#
|
11
|
+
# We keep the last score used for each tenant key. One tenant_key is
|
12
|
+
# an tenant unique id. To calculate the next_score we use
|
13
|
+
# max(current_tenant_score, current_global_score) + increment we store
|
14
|
+
# the queue in a sorted set using the next_score as ordering key if one
|
15
|
+
# tenant sends lots of messages, this tenant ends up with lots of
|
16
|
+
# messages in the queue spaced by increment if another tenant then
|
17
|
+
# sends a message, since it previous_tenant_score is lower than the
|
18
|
+
# first tenant, it will be inserted before it in the queue.
|
19
|
+
#
|
20
|
+
# In other words, the idea of this queue is to not allowing an tenant
|
21
|
+
# that sends a lot of messages to dominate processing and give a chance
|
22
|
+
# for tenants that sends few messages to have a fair share of
|
23
|
+
# processing time.
|
24
|
+
ENQUEUE_ITEM = %(
|
25
|
+
local increment = 1
|
26
|
+
local current_checkpoint = tonumber(redis.call("GET", KEYS[1])) or 0
|
27
|
+
local score_key = KEYS[2]
|
28
|
+
local current_score = tonumber(redis.call("GET", score_key)) or 0
|
29
|
+
local queue_key = KEYS[3]
|
30
|
+
local next_score = nil
|
31
|
+
|
32
|
+
if current_score >= current_checkpoint then
|
33
|
+
next_score = current_score + increment
|
34
|
+
else
|
35
|
+
next_score = current_checkpoint + increment
|
36
|
+
end
|
37
|
+
|
38
|
+
redis.call("SETEX", score_key, #{ONE_DAY_IN_SECONDS}, next_score)
|
39
|
+
redis.call("ZADD", queue_key, next_score, ARGV[1])
|
40
|
+
|
41
|
+
return next_score
|
42
|
+
).freeze
|
43
|
+
|
44
|
+
# Uses ZPOP* functions available only on redis 5.0.0+
|
45
|
+
DEQUEUE_ITEM = %(
|
46
|
+
local checkpoint_key = KEYS[1]
|
47
|
+
local queue_key = KEYS[2]
|
48
|
+
local batch_size = ARGV[1]
|
49
|
+
local popped_items = redis.call("ZPOPMIN", queue_key, batch_size)
|
50
|
+
local items = {}
|
51
|
+
local last_score = 0
|
52
|
+
|
53
|
+
for i, v in ipairs(popped_items) do
|
54
|
+
if i % 2 == 1 then
|
55
|
+
table.insert(items, v)
|
56
|
+
else
|
57
|
+
last_score = v
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
redis.call("SETEX", checkpoint_key, 86400, last_score)
|
62
|
+
return items
|
63
|
+
).freeze
|
64
|
+
|
65
|
+
def initialize(worker, options)
|
66
|
+
@worker = worker
|
67
|
+
@options = options
|
68
|
+
@priority_key = options.fetch(:priority_key)
|
69
|
+
@redis_options = options.fetch(:redis, {})
|
70
|
+
|
71
|
+
@max_wait = options.fetch(
|
72
|
+
:max_wait,
|
73
|
+
Integer(ENV['UPPERKUT_MAX_WAIT'] || 20)
|
74
|
+
)
|
75
|
+
|
76
|
+
@batch_size = options.fetch(
|
77
|
+
:batch_size,
|
78
|
+
Integer(ENV['UPPERKUT_BATCH_SIZE'] || 1000)
|
79
|
+
)
|
80
|
+
|
81
|
+
@waiting_time = 0
|
82
|
+
|
83
|
+
raise ArgumentError, 'Invalid priority_key. ' \
|
84
|
+
'Must be a lambda' unless @priority_key.respond_to?(:call)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Public: Ingests the event into strategy.
|
88
|
+
#
|
89
|
+
# items - The Array of items do be inserted.
|
90
|
+
#
|
91
|
+
# Returns true when success, raise when error.
|
92
|
+
def push_items(items = [])
|
93
|
+
items = [items] if items.is_a?(Hash)
|
94
|
+
return false if items.empty?
|
95
|
+
|
96
|
+
redis do |conn|
|
97
|
+
items.each do |item|
|
98
|
+
priority_key = @priority_key.call(item)
|
99
|
+
score_key = "#{queue_key}:#{priority_key}:score"
|
100
|
+
|
101
|
+
keys = [queue_checkpoint_key,
|
102
|
+
score_key,
|
103
|
+
queue_key]
|
104
|
+
|
105
|
+
conn.eval(ENQUEUE_ITEM,
|
106
|
+
keys: keys,
|
107
|
+
argv: [encode_json_items([item])])
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
true
|
112
|
+
end
|
113
|
+
|
114
|
+
# Public: Retrieve events from Strategy.
|
115
|
+
#
|
116
|
+
# Returns an Array containing events as hash.
|
117
|
+
def fetch_items
|
118
|
+
batch_size = [@batch_size, size].min
|
119
|
+
|
120
|
+
items = redis do |conn|
|
121
|
+
conn.eval(DEQUEUE_ITEM,
|
122
|
+
keys: [queue_checkpoint_key, queue_key],
|
123
|
+
argv: [batch_size])
|
124
|
+
end
|
125
|
+
|
126
|
+
decode_json_items(items)
|
127
|
+
end
|
128
|
+
|
129
|
+
# Public: Clear all data related to the strategy.
|
130
|
+
def clear
|
131
|
+
redis { |conn| conn.del(queue_key) }
|
132
|
+
end
|
133
|
+
|
134
|
+
# Public: Tells when to execute the event processing,
|
135
|
+
# when this condition is met so the events are dispatched to
|
136
|
+
# the worker.
|
137
|
+
def process?
|
138
|
+
if fulfill_condition?(size)
|
139
|
+
@waiting_time = 0
|
140
|
+
return true
|
141
|
+
end
|
142
|
+
|
143
|
+
@waiting_time += @worker.setup.polling_interval
|
144
|
+
false
|
145
|
+
end
|
146
|
+
|
147
|
+
# Public: Consolidated strategy metrics.
|
148
|
+
#
|
149
|
+
# Returns hash containing metric name and values.
|
150
|
+
def metrics
|
151
|
+
{
|
152
|
+
'size' => size
|
153
|
+
}
|
154
|
+
end
|
155
|
+
|
156
|
+
private
|
157
|
+
|
158
|
+
def queue_checkpoint_key
|
159
|
+
"#{queue_key}:checkpoint"
|
160
|
+
end
|
161
|
+
|
162
|
+
def queue_key
|
163
|
+
"upperkut:priority_queue:#{to_underscore(@worker.name)}"
|
164
|
+
end
|
165
|
+
|
166
|
+
def fulfill_condition?(buff_size)
|
167
|
+
return false if buff_size.zero?
|
168
|
+
|
169
|
+
buff_size >= @batch_size || @waiting_time >= @max_wait
|
170
|
+
end
|
171
|
+
|
172
|
+
def size
|
173
|
+
redis do |conn|
|
174
|
+
conn.zcard(queue_key)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def redis
|
179
|
+
raise ArgumentError, 'requires a block' unless block_given?
|
180
|
+
|
181
|
+
redis_pool.with do |conn|
|
182
|
+
yield conn
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def redis_pool
|
187
|
+
@redis_pool ||= begin
|
188
|
+
if @redis_options.is_a?(ConnectionPool)
|
189
|
+
@redis_options
|
190
|
+
else
|
191
|
+
RedisPool.new(@options.fetch(:redis, {})).create
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
data/lib/upperkut/version.rb
CHANGED
data/upperkut.gemspec
CHANGED
@@ -22,8 +22,8 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.required_ruby_version = '>= 2.2.2'
|
23
23
|
|
24
24
|
spec.add_dependency 'connection_pool', '~> 2.2', '>= 2.2.2'
|
25
|
-
spec.add_dependency 'redis',
|
26
|
-
spec.add_development_dependency 'bundler', '
|
25
|
+
spec.add_dependency 'redis', '>= 4.1.0', '< 5.0.0'
|
26
|
+
spec.add_development_dependency 'bundler', '>= 1.16'
|
27
27
|
spec.add_development_dependency 'rake', '~> 10.0'
|
28
28
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
29
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: upperkut
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nando Sousa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: connection_pool
|
@@ -36,32 +36,32 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
39
|
+
version: 4.1.0
|
40
40
|
- - "<"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version:
|
42
|
+
version: 5.0.0
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
49
|
+
version: 4.1.0
|
50
50
|
- - "<"
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version:
|
52
|
+
version: 5.0.0
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: bundler
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
56
56
|
requirements:
|
57
|
-
- - "
|
57
|
+
- - ">="
|
58
58
|
- !ruby/object:Gem::Version
|
59
59
|
version: '1.16'
|
60
60
|
type: :development
|
61
61
|
prerelease: false
|
62
62
|
version_requirements: !ruby/object:Gem::Requirement
|
63
63
|
requirements:
|
64
|
-
- - "
|
64
|
+
- - ">="
|
65
65
|
- !ruby/object:Gem::Version
|
66
66
|
version: '1.16'
|
67
67
|
- !ruby/object:Gem::Dependency
|
@@ -113,6 +113,7 @@ files:
|
|
113
113
|
- Rakefile
|
114
114
|
- bin/upperkut
|
115
115
|
- examples/basic.rb
|
116
|
+
- examples/priority_worker.rb
|
116
117
|
- examples/scheduled_worker.rb
|
117
118
|
- examples/with_middlewares.rb
|
118
119
|
- lib/upperkut.rb
|
@@ -129,6 +130,7 @@ files:
|
|
129
130
|
- lib/upperkut/redis_pool.rb
|
130
131
|
- lib/upperkut/strategies/base.rb
|
131
132
|
- lib/upperkut/strategies/buffered_queue.rb
|
133
|
+
- lib/upperkut/strategies/priority_queue.rb
|
132
134
|
- lib/upperkut/strategies/scheduled_queue.rb
|
133
135
|
- lib/upperkut/util.rb
|
134
136
|
- lib/upperkut/version.rb
|