fairway 0.0.6 → 0.0.7
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/Gemfile.lock +1 -1
- data/lib/fairway/queue.rb +19 -3
- data/lib/fairway/version.rb +1 -1
- data/spec/lib/fairway/queue_spec.rb +51 -6
- metadata +2 -2
data/Gemfile.lock
CHANGED
data/lib/fairway/queue.rb
CHANGED
@@ -4,15 +4,15 @@ module Fairway
|
|
4
4
|
|
5
5
|
def initialize(connection, *queue_names)
|
6
6
|
@connection = connection
|
7
|
-
@queue_names =
|
7
|
+
@queue_names = parse_queue_names(queue_names)
|
8
8
|
end
|
9
9
|
|
10
10
|
def length
|
11
|
-
@connection.redis.mget(@queue_names.map{|q| "#{q}:length" }).sum.to_i
|
11
|
+
@connection.redis.mget(@queue_names.uniq.map{|q| "#{q}:length" }).sum.to_i
|
12
12
|
end
|
13
13
|
|
14
14
|
def pull
|
15
|
-
@connection.scripts.fairway_pull(@queue_names)
|
15
|
+
@connection.scripts.fairway_pull(@queue_names.shuffle.uniq)
|
16
16
|
end
|
17
17
|
|
18
18
|
def ==(other)
|
@@ -21,5 +21,21 @@ module Fairway
|
|
21
21
|
connection == other.connection &&
|
22
22
|
queue_names == other.queue_names
|
23
23
|
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def parse_queue_names(names)
|
28
|
+
[].tap do |queues|
|
29
|
+
names.each do |name|
|
30
|
+
if name.is_a?(Hash)
|
31
|
+
name.each do |key, value|
|
32
|
+
value.times { queues << key }
|
33
|
+
end
|
34
|
+
else
|
35
|
+
queues << name
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
24
40
|
end
|
25
41
|
end
|
data/lib/fairway/version.rb
CHANGED
@@ -93,8 +93,47 @@ module Fairway
|
|
93
93
|
connection.deliver(message2 = message.merge(topic: "event:2"))
|
94
94
|
|
95
95
|
queue = Queue.new(connection, "myqueue2", "myqueue1")
|
96
|
-
|
97
|
-
|
96
|
+
|
97
|
+
messages = [["myqueue1", message1.to_json], ["myqueue2", message2.to_json]]
|
98
|
+
messages.should include(queue.pull)
|
99
|
+
messages.should include(queue.pull)
|
100
|
+
end
|
101
|
+
|
102
|
+
it "randomized order of queues attempted to reduce starvation" do
|
103
|
+
queue = Queue.new(connection, "myqueue2", "myqueue1")
|
104
|
+
|
105
|
+
order = {}
|
106
|
+
|
107
|
+
queue.connection.scripts.stub(:fairway_pull) do |queues|
|
108
|
+
order[queues.join(":")] ||= 0
|
109
|
+
order[queues.join(":")] += 1
|
110
|
+
end
|
111
|
+
|
112
|
+
100.times { queue.pull }
|
113
|
+
|
114
|
+
order.keys.length.should == 2
|
115
|
+
order["myqueue2:myqueue1"].should > 0
|
116
|
+
order["myqueue1:myqueue2"].should > 0
|
117
|
+
end
|
118
|
+
|
119
|
+
it "allows weighting of queues for ordering" do
|
120
|
+
queue = Queue.new(connection, "myqueue2" => 10, "myqueue1" => 1)
|
121
|
+
|
122
|
+
queue.queue_names.should == [Array.new(10, "myqueue2"), "myqueue1"].flatten
|
123
|
+
|
124
|
+
order = {}
|
125
|
+
|
126
|
+
queue.connection.scripts.stub(:fairway_pull) do |queues|
|
127
|
+
order[queues.join(":")] ||= 0
|
128
|
+
order[queues.join(":")] += 1
|
129
|
+
end
|
130
|
+
|
131
|
+
100.times { queue.pull }
|
132
|
+
|
133
|
+
order.keys.length.should == 2
|
134
|
+
order["myqueue2:myqueue1"].should > 0
|
135
|
+
order["myqueue1:myqueue2"].should > 0
|
136
|
+
order["myqueue2:myqueue1"].should > order["myqueue1:myqueue2"]
|
98
137
|
end
|
99
138
|
|
100
139
|
it "returns nil if no queues have messages" do
|
@@ -108,11 +147,17 @@ module Fairway
|
|
108
147
|
connection.deliver(message3 = message.merge(facet: 2, topic: "event:1"))
|
109
148
|
connection.deliver(message4 = message.merge(facet: 1, topic: "event:2"))
|
110
149
|
|
150
|
+
queue1_messages = []
|
111
151
|
queue = Queue.new(connection, "myqueue2", "myqueue1")
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
152
|
+
|
153
|
+
4.times do
|
154
|
+
message = queue.pull
|
155
|
+
queue1_messages << message if message.first == "myqueue1"
|
156
|
+
end
|
157
|
+
|
158
|
+
queue1_messages[0].should == ["myqueue1", message1.to_json]
|
159
|
+
queue1_messages[1].should == ["myqueue1", message3.to_json]
|
160
|
+
queue1_messages[2].should == ["myqueue1", message2.to_json]
|
116
161
|
end
|
117
162
|
end
|
118
163
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fairway
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|