~ubuntu-branches/ubuntu/saucy/rabbitmq-server/saucy-proposed

« back to all changes in this revision

Viewing changes to plugins-src/rabbitmq-shovel/README

  • Committer: Package Import Robot
  • Author(s): Emile Joubert
  • Date: 2012-06-22 17:48:28 UTC
  • mfrom: (0.2.16) (0.1.28 sid)
  • Revision ID: package-import@ubuntu.com-20120622174828-1t2dts9myai6ogqo
Tags: 2.8.4-1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
RabbitMQ-shovel
2
 
===============
3
 
 
4
 
 
5
 
Introduction
6
 
------------
7
 
 
8
 
This is a plug-in for RabbitMQ that shovels messages from a queue on
9
 
one broker to an exchange on another broker. The two brokers may be
10
 
the same. The plug-in allows several shovels to be specified at the
11
 
same time. Each shovel may have a number of source and destination
12
 
brokers specified, and one of each is chosen whenever the shovel
13
 
attempts to make a connection: this permits simple round-rabbit load
14
 
balancing.
15
 
 
16
 
Resources can be declared upon connection to both the source and
17
 
destination brokers, and parameters can be specified for both the
18
 
reception and publishing of messages.
19
 
 
20
 
 
21
 
Requirements
22
 
------------
23
 
 
24
 
You can build and install it like any other plugin (see
25
 
http://www.rabbitmq.com/plugin-development.html).
26
 
 
27
 
 
28
 
Configuration
29
 
-------------
30
 
 
31
 
The RabbitMQ configuration file specifies the shovel
32
 
configurations. This exists by default, in
33
 
/etc/rabbitmq/rabbitmq.config under Linux systems,
34
 
%RABBITMQ_BASE%\rabbitmq.config under Windows or somewhere else under
35
 
OS X. This file configures both RabbitMQ-server and all the plugins
36
 
installed in it. It is an Erlang-syntax file of the form:
37
 
 
38
 
[{section1, [section1-config]},
39
 
 {section2, [section2-config]},
40
 
 ...
41
 
 {sectionN, [sectionN-config]}
42
 
].
43
 
 
44
 
thus a list of tuples, where the left element of each tuple names the
45
 
applications being configured. Don't forget the last element of the
46
 
list doesn't have a trailing comma, and don't forget the full-stop is
47
 
needed after closing the list. Hence if you configure RabbitMQ-server
48
 
and the RabbitMQ-shovel, then the configuration file may have a
49
 
structure like this:
50
 
 
51
 
[{rabbit,        [configuration-for-RabbitMQ-server]},
52
 
 {rabbit-shovel, [configuration-for-RabbitMQ-shovel]}
53
 
].
54
 
 
55
 
A full example of the shovel configuration is:
56
 
 
57
 
{rabbitmq_shovel,
58
 
  [{shovels,
59
 
    [{my_first_shovel,
60
 
      [{sources,      [{brokers,
61
 
                          ["amqp://fred:secret@host1.domain/my_vhost",
62
 
                           "amqp://john:secret@host2.domain/my_vhost"
63
 
                          ]},
64
 
                       {declarations,
65
 
                          ['queue.declare',
66
 
                           {'queue.bind',
67
 
                                  [{exchange, <<"my_exchange">>},
68
 
                                   {queue,    <<>>}]}
69
 
                          ]}]},
70
 
       {destinations, [{broker, "amqp://"},
71
 
                       {declarations,
72
 
                          [{'exchange.declare',
73
 
                                  [{exchange, <<"my_exchange">>},
74
 
                                   {type, <<"direct">>},
75
 
                                   durable]}
76
 
                          ]}]},
77
 
       {queue, <<>>},
78
 
       {prefetch_count, 10},
79
 
       {ack_mode, on_confirm},
80
 
       {publish_properties, [{delivery_mode, 2}]},
81
 
       {publish_fields, [{exchange, <<"my_exchange">>},
82
 
                         {routing_key, <<"from_shovel">>}]},
83
 
       {reconnect_delay, 5}
84
 
      ]}
85
 
     ]
86
 
   }]
87
 
}
88
 
 
89
 
Firstly, all shovels are named. Here we have one shovel, called
90
 
'my_first_shovel'. We can have multiple shovels if you wish. Secondly,
91
 
every shovel must have the subfields sources, destinations and queue
92
 
specified, whereas the other fields (prefetch_count, ack_mode,
93
 
publish_properties, publish_fields, reconnect_delay) are optional and
94
 
have defaults as follows:
95
 
 
96
 
{prefetch_count,      0}
97
 
{ack_mode,            on_confirm}
98
 
{publish_properties,  []}
99
 
{publish_fields,      []}
100
 
{reconnect_delay,     5}
101
 
 
102
 
 
103
 
Sources and Destinations
104
 
------------------------
105
 
 
106
 
Sources and destinations specify respectively where messages are
107
 
fetched from and delivered too. One of 'broker' and 'brokers' must be
108
 
specified, and 'broker' is simply shorthand for when only one broker
109
 
needs specifying. Using 'brokers' allows a list of brokers to be
110
 
specified: whenever the connection to a broker is lost, another one is
111
 
chosen at random from the list and a connection attempt is made to
112
 
that. The syntax for broker URIs is:
113
 
 
114
 
amqp://username:password@host:port/vhost?key1=value1&key2=value2...
115
 
 
116
 
If username or password are omitted, the default values of guest and
117
 
guest are used. If the vhost is omitted, the default value of / is
118
 
used. If the host is omitted, then the plugin uses the "direct"
119
 
connection internally rather than a network connection: this means it
120
 
connects to the RabbitMQ-server node on which it is running without
121
 
going through the network stack. This is much more efficient. If port
122
 
is omitted then the default value is used (5672 or 5671 if SSL is
123
 
used).
124
 
 
125
 
SSL is implemented, for which additional parameters are needed:
126
 
 
127
 
amqps://username:password@host:port/vhost?cacertfile=/path/to/cacert.pem&certfile=/path/to/certfile.pem&keyfile=/path/to/keyfile.pem&verify=verifyOption&fail_if_no_peer_cert=failOption
128
 
 
129
 
All five parameters (3 paths: cacertfile, certfile and keyfile; 2
130
 
options: verify, fail_if_no_peer_cert) must be specified. See the SSL
131
 
guide at http://www.rabbitmq.com/ssl.html#configure-erlang for details
132
 
of SSL in RabbitMQ in general and specifically for the Erlang client
133
 
(on which the shovel is built).
134
 
 
135
 
Note that SSL cannot be used with the direct connection (i.e. a host
136
 
must be specified when using SSL), and that it is preferable to use
137
 
the non-SSL direct connection when connecting to the same node that's
138
 
running the shovel.
139
 
 
140
 
The query part of the URI permits the configuration of additional
141
 
connection parameters, permitting heartbeat, channel_max, and
142
 
frame_max to be specified. These can be given in any order, and
143
 
omitted fields assume default values. For example:
144
 
 
145
 
amqp://myhost?heartbeat=5&frame_max=8192
146
 
 
147
 
Specifies a non-encrypted network connection to the host 'myhost',
148
 
using default username, password, port, vhost and channel_max, but
149
 
specifying the heartbeat interval of 5 seconds, and the maximum frame
150
 
size of 8192 bytes.
151
 
 
152
 
 
153
 
Resource Declarations
154
 
---------------------
155
 
 
156
 
Both sources and destinations can have an optional 'declarations'
157
 
clause. The value of this is a list, consisting of AMQP Methods. If
158
 
default values are sufficient, then the method name alone can be
159
 
specified - e.g. 'queue.declare'. If parameters need to be set then
160
 
the method should be given as a tuple, with the right hand side a
161
 
proplist specifying which fields need altering from their default
162
 
values. E.g:
163
 
    {'exchange.declare',[{exchange, <<"my_exchange">>},
164
 
                         {type, <<"direct">>},
165
 
                         durable]},
166
 
 
167
 
One very useful feature here is the Most-Recently-Declared-Queue
168
 
feature, in which RabbitMQ remembers the name of the most recently
169
 
declared queue. This means that you can declare a private queue, and
170
 
then bind it to exchanges without ever needing to know its name.
171
 
 
172
 
 
173
 
queue :: binary
174
 
---------------
175
 
 
176
 
This parameter specifies the name of the queue on the source brokers
177
 
to consume from. This queue must exist. Use the resource declarations
178
 
to create the queue (or ensure it exists) first. Note again that the
179
 
Most-Recently-Declared-Queue feature can be used here, thus an
180
 
anonymous queue can be used: use <<>> to indicate the
181
 
Most-Recently-Declared-Queue.
182
 
 
183
 
 
184
 
prefetch_count :: non-negative-integer
185
 
--------------------------------------
186
 
 
187
 
The shovel consumes from a queue. This parameter imposes a limit on
188
 
the number of messages which are sent to the shovel in advance of the
189
 
message the shovel is currently processing.
190
 
 
191
 
 
192
 
ack_mode :: 'no_ack' | 'on_publish' | 'on_confirm'
193
 
--------------------------------------------------
194
 
 
195
 
This setting controls if or when acknowledgements to the source broker
196
 
are issued by the shovel. The default is 'on_confirm'.
197
 
 
198
 
'no_ack' - The shovel consumes from its queue with no_ack = 'true':
199
 
i.e. the shovel does not issue explicit acks for messages it receives,
200
 
and the source broker considers messages acknowledged as soon as it
201
 
has sent them to the shovel.
202
 
 
203
 
'on_publish' - the shovel consumes from its queue with no_ack =
204
 
'false', and a message is acknowledged to the source broker as soon as
205
 
it has been published to the destination broker.
206
 
 
207
 
'on_confirm' - the shovel consumes from its queue with no_ack =
208
 
'false' and it requests publisher confirmations from the destination
209
 
broker. It only issues acknowledgements to the source broker when it
210
 
has received confirmation from the destination broker that each
211
 
message has been successfully received. This setting gives a guarantee
212
 
that messages will not be discarded from the source broker until after
213
 
the destination broker has confirmed receipt of the message.
214
 
 
215
 
'on_confirm' is strongly recommended. However the destination broker
216
 
must support publish confirms, meaning it can only be used with
217
 
RabbitMQ 2.3.1 and up.
218
 
 
219
 
publish_properties
220
 
------------------
221
 
 
222
 
This is a list of tuples which override fields in the basic class
223
 
properties when publishing to the destination. This can be used to
224
 
override any of the following fields: content_type, content_encoding,
225
 
headers, delivery_mode, priority, correlation_id, reply_to,
226
 
expiration, message_id, timestamp, type, user_id, app_id, cluster_id.
227
 
 
228
 
By default, all the properties of the basic class that are received
229
 
with the delivery are passed through to the destination, but this
230
 
field can be used to override them.
231
 
 
232
 
 
233
 
publish_fields
234
 
--------------
235
 
 
236
 
This is a list of tuples which override fields in the publish method
237
 
when publishing to the destination. This can be used to direct
238
 
messages to a particular exchange on the destination, for example, or
239
 
change the routing key. By default, the exchange and the routing key
240
 
of the message as it is received by the shovel is passed through, but
241
 
this can be overridden as necessary.
242
 
 
243
 
 
244
 
reconnect_delay :: non-negative-number
245
 
--------------------------------------
246
 
 
247
 
When an error occurs, the shovel will disconnect from both the source
248
 
and destination broker immediately. This will force uncommitted
249
 
transactions at the destination to be rolled back, and delivered but
250
 
unacknowledged messages from the source to be requeued. The shovel
251
 
will then try connecting again. If this is unsuccessful, then it's not
252
 
a good idea for the shovel to very quickly and repeatedly try to
253
 
reconnect. The value specified here is determines the delay, in
254
 
seconds, between each connection attempt.
255
 
 
256
 
Note that if set to 0, the shovel will never try to reconnect: it'll
257
 
stop after the first error.
258
 
 
259
 
Also, the value can be a floating point number, thus permitting the
260
 
specification of delays at a granularity smaller than whole seconds.
261
 
 
262
 
 
263
 
Obtaining shovel statuses
264
 
-------------------------
265
 
 
266
 
From the broker Erlang prompt, call
267
 
rabbit_shovel_status:status(). This will return a list, with one row
268
 
for each configured shovel. Each row has three fields: the shovel
269
 
name, the shovel status, and the timestamp (a local calendar time of
270
 
{{YYYY,MM,DD},{HH,MM,SS}}). There are 3 possible statuses:
271
 
 
272
 
'starting': The shovel is starting up, connecting and creating
273
 
    resources.
274
 
 
275
 
{'running'|'blocked', {'source', Source},
276
 
                      {'destination', Destination}}:
277
 
 
278
 
    When 'running', the shovel is up and running, shovelling
279
 
    messages. When 'blocked', the destination has raised channel.flow,
280
 
    preventing the shovel from sending messages to the
281
 
    destination. The shovel will raise channel.flow to the source,
282
 
    asking the source to stop sending further messages to the
283
 
    shovel. Any messages that are received by the shovel before the
284
 
    source observes the channel.flow are correctly buffered and
285
 
    maintained in order, and are published to the destination as soon
286
 
    as the destination drops the channel.flow block.
287
 
 
288
 
    Source and Destination give the connection parameters used to
289
 
    connect to the endpoints.
290
 
 
291
 
{'terminated', Reason}: Something's gone wrong. The Reason should give
292
 
    a further indication of where the fault lies.
 
1
Generic build instructions are at:
 
2
        http://www.rabbitmq.com/plugin-development.html
 
3
 
 
4
See the http://www.rabbitmq.com/shovel.html page for full instructions.