toiler 0.5.0 → 0.5.1.pre1
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.
- checksums.yaml +4 -4
- data/lib/toiler/actor/fetcher.rb +30 -50
- data/lib/toiler/actor/processor.rb +3 -3
- data/lib/toiler/actor/supervisor.rb +8 -5
- data/lib/toiler/cli.rb +1 -1
- data/lib/toiler/version.rb +1 -1
- data/spec/models/fetcher_spec.rb +0 -2
- data/toiler.gemspec +1 -1
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3efc28d7e6e93a72eec97541769224ae90bf88aa
|
4
|
+
data.tar.gz: 48c91cc61b0c9624848d3c6b2a5139ca2916566a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da792a91216f97a6c7cbee7becc4352d5c9c49a8ecc21cab178adebcb21991a791d72b2ddd93aad434f3533f12ba49e4919f7647c5e8ed1b827802212422a182
|
7
|
+
data.tar.gz: 6d21aed25d630a51f64d61f0520750ca3eba9849277a97f8828cc79830650146de9d90f097d0f26c0abaaf92f1bba368d71fffb5436c8003c7f1ee2758d7834f
|
data/lib/toiler/actor/fetcher.rb
CHANGED
@@ -10,49 +10,37 @@ module Toiler
|
|
10
10
|
FETCH_LIMIT = 10
|
11
11
|
|
12
12
|
attr_accessor :queue, :wait, :visibility_timeout, :free_processors,
|
13
|
-
:
|
13
|
+
:executing, :waiting_messages
|
14
14
|
|
15
|
-
def initialize(queue, client)
|
15
|
+
def initialize(queue, client, count)
|
16
16
|
debug "Initializing Fetcher for queue #{queue}..."
|
17
17
|
@queue = Toiler::Aws::Queue.new queue, client
|
18
|
-
@wait = Toiler.options[:wait] ||
|
19
|
-
@free_processors =
|
18
|
+
@wait = Toiler.options[:wait] || 60
|
19
|
+
@free_processors = count
|
20
20
|
@batch = Toiler.worker_class_registry[queue].batch?
|
21
21
|
@visibility_timeout = @queue.visibility_timeout
|
22
|
-
@
|
23
|
-
@
|
24
|
-
@polling = Concurrent::AtomicBoolean.new
|
22
|
+
@executing = false
|
23
|
+
@waiting_messages = 0
|
25
24
|
debug "Finished initializing Fetcher for queue #{queue}"
|
25
|
+
tell :poll_messages
|
26
26
|
end
|
27
27
|
|
28
28
|
def default_executor
|
29
|
-
Concurrent.
|
29
|
+
Concurrent.global_fast_executor
|
30
30
|
end
|
31
31
|
|
32
32
|
def on_message(msg)
|
33
|
-
executing
|
33
|
+
@executing = true
|
34
34
|
method, *args = msg
|
35
35
|
send(method, *args)
|
36
36
|
rescue StandardError => e
|
37
37
|
error "Fetcher #{queue.name} raised exception #{e.class}: #{e.message}\n#{e.backtrace.join("\n")}"
|
38
38
|
ensure
|
39
|
-
executing
|
39
|
+
@executing = false
|
40
40
|
end
|
41
41
|
|
42
42
|
def executing?
|
43
|
-
executing
|
44
|
-
end
|
45
|
-
|
46
|
-
def polling?
|
47
|
-
polling.value
|
48
|
-
end
|
49
|
-
|
50
|
-
def scheduled?
|
51
|
-
scheduled.value
|
52
|
-
end
|
53
|
-
|
54
|
-
def get_free_processors
|
55
|
-
free_processors.value
|
43
|
+
@executing
|
56
44
|
end
|
57
45
|
|
58
46
|
private
|
@@ -63,46 +51,39 @@ module Toiler
|
|
63
51
|
|
64
52
|
def processor_finished
|
65
53
|
debug "Fetcher #{queue.name} received processor finished signal..."
|
66
|
-
free_processors
|
67
|
-
|
54
|
+
@free_processors += 1
|
55
|
+
tell :poll_messages
|
68
56
|
end
|
69
57
|
|
70
58
|
def max_messages
|
71
|
-
batch? ? FETCH_LIMIT : [FETCH_LIMIT, free_processors
|
59
|
+
batch? ? FETCH_LIMIT : [FETCH_LIMIT, free_processors].min
|
72
60
|
end
|
73
61
|
|
74
|
-
def poll_future
|
62
|
+
def poll_future(max_number_of_messages)
|
75
63
|
Concurrent::Promises.future do
|
76
|
-
queue.receive_messages message_attribute_names: %w
|
64
|
+
queue.receive_messages message_attribute_names: %w[All],
|
77
65
|
wait_time_seconds: wait,
|
78
|
-
max_number_of_messages:
|
66
|
+
max_number_of_messages: max_number_of_messages
|
79
67
|
end
|
80
68
|
end
|
81
69
|
|
82
70
|
def poll_messages
|
83
|
-
return unless
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
71
|
+
return unless free_processors / 2 > waiting_messages
|
72
|
+
|
73
|
+
max_number_of_messages = max_messages
|
74
|
+
@waiting_messages += max_number_of_messages
|
75
|
+
|
76
|
+
debug "Fetcher #{queue.name} polling messages..."
|
77
|
+
future = poll_future max_number_of_messages
|
78
|
+
future.on_rejection! do
|
79
|
+
tell :poll_messages
|
88
80
|
end
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
if !msgs.nil? && !msgs.empty?
|
93
|
-
tell [:assign_messages, msgs]
|
94
|
-
else
|
95
|
-
tell :schedule_poll
|
96
|
-
end
|
81
|
+
future.on_fulfillment! do |msgs|
|
82
|
+
tell [:assign_messages, msgs] if !msgs.nil? && !msgs.empty?
|
83
|
+
tell :poll_messages
|
97
84
|
end
|
98
85
|
end
|
99
86
|
|
100
|
-
def schedule_poll
|
101
|
-
return unless free_processors.value > 0 && scheduled.make_true
|
102
|
-
debug "Fetcher #{queue.name} scheduling polling..."
|
103
|
-
tell :poll_messages
|
104
|
-
end
|
105
|
-
|
106
87
|
def processor_pool
|
107
88
|
@processor_pool ||= Toiler.processor_pool queue.name
|
108
89
|
end
|
@@ -111,10 +92,9 @@ module Toiler
|
|
111
92
|
messages = [messages] if batch?
|
112
93
|
messages.each do |m|
|
113
94
|
processor_pool.tell [:process, visibility_timeout, m]
|
114
|
-
free_processors
|
95
|
+
@free_processors -= 1
|
115
96
|
end
|
116
97
|
debug "Fetcher #{queue.name} assigned #{messages.count} messages"
|
117
|
-
tell :schedule_poll
|
118
98
|
end
|
119
99
|
end
|
120
100
|
end
|
@@ -17,7 +17,6 @@ module Toiler
|
|
17
17
|
@executing = Concurrent::AtomicBoolean.new
|
18
18
|
@thread = nil
|
19
19
|
init_options
|
20
|
-
processor_finished
|
21
20
|
end
|
22
21
|
|
23
22
|
def default_executor
|
@@ -89,7 +88,8 @@ module Toiler
|
|
89
88
|
|
90
89
|
def visibility_extender(queue_visibility, sqs_msg, body)
|
91
90
|
return unless auto_visibility_timeout?
|
92
|
-
|
91
|
+
|
92
|
+
interval = [1, queue_visibility / 3].max
|
93
93
|
Concurrent::TimerTask.execute execution_interval: interval,
|
94
94
|
timeout_interval: interval do
|
95
95
|
begin
|
@@ -116,7 +116,7 @@ module Toiler
|
|
116
116
|
when :text, nil then sqs_msg.body
|
117
117
|
else body_parser.load sqs_msg.body
|
118
118
|
end
|
119
|
-
rescue => e
|
119
|
+
rescue StandardError => e
|
120
120
|
raise "Error parsing the message body: #{e.message}"
|
121
121
|
end
|
122
122
|
end
|
@@ -11,8 +11,8 @@ module Toiler
|
|
11
11
|
|
12
12
|
def initialize
|
13
13
|
@client = ::Aws::SQS::Client.new
|
14
|
-
spawn_fetchers
|
15
14
|
spawn_processors
|
15
|
+
spawn_fetchers
|
16
16
|
end
|
17
17
|
|
18
18
|
def on_message(_msg)
|
@@ -20,10 +20,12 @@ module Toiler
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def spawn_fetchers
|
23
|
-
Toiler.active_worker_class_registry.each do |queue,
|
23
|
+
Toiler.active_worker_class_registry.each do |queue, klass|
|
24
|
+
count = klass.concurrency
|
24
25
|
begin
|
25
26
|
fetcher = Actor::Fetcher.spawn! name: "fetcher_#{queue}".to_sym,
|
26
|
-
supervise: true,
|
27
|
+
supervise: true,
|
28
|
+
args: [queue, client, count]
|
27
29
|
Toiler.set_fetcher queue, fetcher
|
28
30
|
rescue StandardError => e
|
29
31
|
error "Failed to start Fetcher for queue #{queue}: #{e.message}\n#{e.backtrace.join("\n")}"
|
@@ -37,8 +39,9 @@ module Toiler
|
|
37
39
|
count = klass.concurrency
|
38
40
|
begin
|
39
41
|
pool = Concurrent::Actor::Utils::Pool.spawn! name, count do |index|
|
40
|
-
|
41
|
-
|
42
|
+
Actor::Processor.spawn name: "processor_#{queue}_#{index}".to_sym,
|
43
|
+
supervise: true,
|
44
|
+
args: [queue]
|
42
45
|
end
|
43
46
|
Toiler.set_processor_pool queue, pool
|
44
47
|
rescue StandardError => e
|
data/lib/toiler/cli.rb
CHANGED
@@ -99,7 +99,7 @@ module Toiler
|
|
99
99
|
processors = processor_pool.instance_variable_get(:@workers).collect{|w| w.send(:core).send(:context)}
|
100
100
|
busy_processors = processors.count{|pr| pr.executing?}
|
101
101
|
message = "Status for [queue:#{queue}]:"
|
102
|
-
message += "\n[fetcher:#{fetcher.name}] [executing:#{fetcher.executing?}] [
|
102
|
+
message += "\n[fetcher:#{fetcher.name}] [executing:#{fetcher.executing?}] [waiting_messages:#{fetcher.waiting_messages}] [free_processors:#{fetcher.free_processors}]"
|
103
103
|
message += "\n[processor_pool:#{processor_pool.name}] [workers:#{processors.count}] [busy:#{busy_processors}]"
|
104
104
|
processors.each do |processor|
|
105
105
|
thread = processor.thread
|
data/lib/toiler/version.rb
CHANGED
data/spec/models/fetcher_spec.rb
CHANGED
@@ -14,9 +14,7 @@ RSpec.describe Toiler::Actor::Fetcher, type: :model do
|
|
14
14
|
describe "#new" do
|
15
15
|
it 'completes sucessfully' do
|
16
16
|
fetcher = described_class.new(queue, client)
|
17
|
-
expect(fetcher.polling?).to eq(false)
|
18
17
|
expect(fetcher.executing?).to eq(false)
|
19
|
-
expect(fetcher.scheduled?).to eq(false)
|
20
18
|
end
|
21
19
|
end
|
22
20
|
end
|
data/toiler.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
|
20
20
|
spec.add_development_dependency 'rspec'
|
21
21
|
|
22
|
-
spec.add_dependency 'aws-sdk-sqs', '
|
22
|
+
spec.add_dependency 'aws-sdk-sqs', '>= 1.0.0', '< 2.0.0'
|
23
23
|
spec.add_dependency 'concurrent-ruby', '~> 1.0', '>= 1.0.0'
|
24
24
|
spec.add_dependency 'concurrent-ruby-edge', '~> 0.3', '>= 0.3'
|
25
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastian Schepens
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -28,22 +28,22 @@ dependencies:
|
|
28
28
|
name: aws-sdk-sqs
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.0'
|
34
31
|
- - ">="
|
35
32
|
- !ruby/object:Gem::Version
|
36
33
|
version: 1.0.0
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 2.0.0
|
37
37
|
type: :runtime
|
38
38
|
prerelease: false
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
|
-
- - "~>"
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '1.0'
|
44
41
|
- - ">="
|
45
42
|
- !ruby/object:Gem::Version
|
46
43
|
version: 1.0.0
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.0.0
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: concurrent-ruby
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,9 +136,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
136
136
|
version: '0'
|
137
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
138
|
requirements:
|
139
|
-
- - "
|
139
|
+
- - ">"
|
140
140
|
- !ruby/object:Gem::Version
|
141
|
-
version:
|
141
|
+
version: 1.3.1
|
142
142
|
requirements: []
|
143
143
|
rubyforge_project:
|
144
144
|
rubygems_version: 2.6.11
|