fairway 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -1,4 +1,4 @@
1
- # Fairway - a fair way to queue messages in multi-user systems.
1
+ # Fairway - a fair way to queue messages in multi-user systems
2
2
 
3
3
  ## Installation
4
4
 
@@ -10,17 +10,19 @@ Then make sure you `bundle install`.
10
10
 
11
11
  ## Configuration
12
12
 
13
- Fairway.configure do |config|
14
- config.redis = { host: "localhost", port: 6379 }
15
- config.namespace = "fairway"
16
-
17
- config.facet do |message|
18
- message[:user]
19
- end
20
-
21
- config.register_queue("all_messages")
22
- end
23
-
13
+ ```ruby
14
+ Fairway.configure do |config|
15
+ config.redis = { host: "localhost", port: 6379 }
16
+ config.namespace = "fairway"
17
+
18
+ config.facet do |message|
19
+ message[:user]
20
+ end
21
+
22
+ config.register_queue("all_messages")
23
+ end
24
+ ```
25
+
24
26
  ## What's a facet?
25
27
 
26
28
  In many queuing systems, if a single user manages to queue up a lot of messages/jobs at once,
@@ -33,11 +35,13 @@ additional messages from a given facet.
33
35
 
34
36
  You can define how to facet your messages during configuration:
35
37
 
36
- Fairway.configure do |config|
37
- config.facet do |message|
38
- message[:user]
39
- end
40
- end
38
+ ```ruby
39
+ Fairway.configure do |config|
40
+ config.facet do |message|
41
+ message[:user]
42
+ end
43
+ end
44
+ ```
41
45
 
42
46
  Now, any message delivered by fairway, will use the `user` key of the message to determine
43
47
  which facet to use.
@@ -52,22 +56,28 @@ and each queue will receive delivered messages.
52
56
 
53
57
  Registering a queue is part of your fairway configuration:
54
58
 
55
- Fairway.configure do |config|
56
- config.register_queue("myqueue")
57
- config.register_queue("yourqueue")
58
- end
59
+ ```ruby
60
+ Fairway.configure do |config|
61
+ config.register_queue("myqueue")
62
+ config.register_queue("yourqueue")
63
+ end
64
+ ```
59
65
 
60
66
  After configuring your queues, just create a fairway connection,
61
67
  and it'll handle persisting your queues in Redis:
62
68
 
63
- connection = Fairway::Connection.new
69
+ ```ruby
70
+ connection = Fairway::Connection.new
71
+ ```
64
72
 
65
73
  ## Delivering messages
66
74
 
67
75
  To add messages to your queues, you deliver them:
68
76
 
69
- connection = Fairway::Connection.new
70
- connection.deliver(type: "invite_friends", user: "bob", friends: ["nancy", "john"])
77
+ ```ruby
78
+ connection = Fairway::Connection.new
79
+ connection.deliver(type: "invite_friends", user: "bob", friends: ["nancy", "john"])
80
+ ```
71
81
 
72
82
  Now, any registered queues will receive this message, faceted if you've defined
73
83
  a facet in your configuration.
@@ -76,9 +86,11 @@ a facet in your configuration.
76
86
 
77
87
  Once you have messages on a queue, you can pull them off and process them:
78
88
 
79
- connection = Fairway::Connection.new
80
- queue = Fairway::Queue.new(connection, "myqueue")
81
- message = queue.pull
89
+ ```ruby
90
+ connection = Fairway::Connection.new
91
+ queue = Fairway::Queue.new(connection, "myqueue")
92
+ message = queue.pull
93
+ ```
82
94
 
83
95
  Behind the scenes, fairway uses a round-robin strategy to ensure equal weighting of
84
96
  any facets which contain messages.
@@ -94,24 +106,30 @@ You can accomplish this with message channels. By default, all messages use the
94
106
  channel. You can customize this by creating a `Fairway::ChanneledConnection` and
95
107
  a block which defines the channel for a given message:
96
108
 
97
- conn = Fairway::Connection.new
98
- conn = Fairway::ChanneledConnection.new(conn) do |message|
99
- message[:type]
100
- end
109
+ ```ruby
110
+ conn = Fairway::Connection.new
111
+ conn = Fairway::ChanneledConnection.new(conn) do |message|
112
+ message[:type]
113
+ end
114
+ ```
101
115
 
102
116
  You can also register queues for a channel:
103
117
 
104
- Fairway.configure do |config|
105
- config.register_queue("invite_queue", "invite_friends")
106
- end
107
-
118
+ ```ruby
119
+ Fairway.configure do |config|
120
+ config.register_queue("invite_queue", "invite_friends")
121
+ end
122
+ ```
123
+
108
124
  Now, your queue will only receive messages which have the channel `invite_friends`.
109
125
 
110
126
  If you'd like to receive messages with channels that match a pattern:
111
127
 
112
- Fairway.configure do |config|
113
- config.register_queue("invite_queue", "invite_.*")
114
- end
128
+ ```ruby
129
+ Fairway.configure do |config|
130
+ config.register_queue("invite_queue", "invite_.*")
131
+ end
132
+ ```
115
133
 
116
134
  Now, messages from the channels `invite_friends`, `invite_pets`, `invite_parents` will
117
135
  be delivered to the `invite_queue`.
@@ -120,41 +138,47 @@ be delivered to the `invite_queue`.
120
138
 
121
139
  To listen for messages without the overhead of queuing them, you can subscribe:
122
140
 
123
- connection = Fairway::Connection.new
141
+ ```ruby
142
+ connection = Fairway::Connection.new
124
143
 
125
- connection.subscribe do |message|
126
- # Do something with each message
127
- end
144
+ connection.subscribe do |message|
145
+ # Do something with each message
146
+ end
147
+ ```
128
148
 
129
149
  If you'd like to only receive some messages, you can subscribe to just a particular channel:
130
150
 
131
- connection = Fairway::Connection.new
151
+ ```ruby
152
+ connection = Fairway::Connection.new
132
153
 
133
- connection.subscribe("invite_*") do |message|
134
- # Do something with each message which
135
- # has a channel matching "invite_*"
136
- end
154
+ connection.subscribe("invite_*") do |message|
155
+ # Do something with each message which
156
+ # has a channel matching "invite_*"
157
+ end
158
+ ```
137
159
 
138
160
  ## Fairway and Sidekiq
139
161
 
140
162
  Fairway isn't meant to be a robust system for processing queued messages/jobs. To more reliably
141
163
  process queued messages, we've integrated with [Sidekiq](http://sidekiq.org/).
142
164
 
143
- require 'fairway/sidekiq'
144
-
145
- connection = Fairway::Connection.new
146
- queues = Fairway::Queue.new(connection, "myqueue", "yourqueue")
147
-
148
- Sidekiq.options[:fetch] = Fairway::Sidekiq::Fetch.new do |fetch|
149
- fetch.from :sidekiq, 2
150
- fetch.from queues, 1 do |queue, message|
151
- # translate message to normalized Sidekiq job, if needed
152
- { "queue" => "fairway",
153
- "class" => "FairwayMessageJob",
154
- "args" => [message],
155
- "retry" => true }
156
- end
157
- end
165
+ ```ruby
166
+ require 'fairway/sidekiq'
167
+
168
+ connection = Fairway::Connection.new
169
+ queues = Fairway::Queue.new(connection, "myqueue", "yourqueue")
170
+
171
+ Sidekiq.options[:fetch] = Fairway::Sidekiq::Fetch.new do |fetch|
172
+ fetch.from :sidekiq, 2
173
+ fetch.from queues, 1 do |queue, message|
174
+ # translate message to normalized Sidekiq job, if needed
175
+ { "queue" => "fairway",
176
+ "class" => "FairwayMessageJob",
177
+ "args" => [message],
178
+ "retry" => true }
179
+ end
180
+ end
181
+ ```
158
182
 
159
183
  `fetch.from :sidekiq, 2` will fetch from sidekiq queues you have defined through the
160
184
  normal sidekiq configuration.
@@ -1,6 +1,6 @@
1
1
  module Fairway
2
2
  module Sidekiq
3
- class Fetch
3
+ class Fetch < ::Sidekiq::BasicFetch
4
4
  class Fetches
5
5
  attr_reader :list
6
6
 
@@ -1,3 +1,3 @@
1
1
  module Fairway
2
- VERSION = "0.0.8"
2
+ VERSION = "0.0.9"
3
3
  end
@@ -46,6 +46,22 @@ module Fairway::Sidekiq
46
46
  end
47
47
  end
48
48
 
49
+ describe "#bulk_requeue" do
50
+ it "requeues jobs to redis" do
51
+ uow = Sidekiq::BasicFetch::UnitOfWork
52
+ q1 = Sidekiq::Queue.new('foo')
53
+ q2 = Sidekiq::Queue.new('bar')
54
+
55
+ q1.size.should == 0
56
+ q2.size.should == 0
57
+
58
+ Fetch.bulk_requeue([uow.new('queue:foo', 'bob'), uow.new('queue:foo', 'bar'), uow.new('queue:bar', 'widget')])
59
+
60
+ q1.size.should == 2
61
+ q2.size.should == 1
62
+ end
63
+ end
64
+
49
65
  describe "#fetch_order" do
50
66
  let(:fetch) { Fetch.new { |f| f.from :fetchA, 10; f.from :fetchB, 1 } }
51
67
 
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.8
4
+ version: 0.0.9
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-27 00:00:00.000000000 Z
12
+ date: 2013-04-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport