blob: 7703601c94ed576f2f6bcbcf35def5dc0cef2ad2 [file] [log] [blame]
////
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License
////
[[indirect-waypoints-and-auto-links]]
Indirect Waypoints and Auto-Links
---------------------------------
This feature was introduced in Qpid Dispatch 0.6. It is a significant
improvement on an earlier somewhat experimental feature called
Waypoints.
Auto-link is a feature of Qpid Dispatch Router that enables a router to
actively attach a link to a node on an external AMQP container. The
obvious application for this feature is to route messages through a
queue on a broker, but other applications are possible as well.
An auto-link manages the lifecycle of one AMQP link. If messages are to
be routed to and from a queue on a broker, then two auto-links are
needed: one for sending messages to the queue and another for receiving
messages from the queue. The container to which an auto-link attempts to
attach may be identified in one of two ways:
_________________________________________________________________________________________
* The name of the connector/listener that resulted in the connection of
the container, or
* The AMQP container-id of the remote container.
_________________________________________________________________________________________
[[queue-waypoint-example]]
Queue Waypoint Example
~~~~~~~~~~~~~~~~~~~~~~
Here is an example configuration for routing messages deliveries through
a pair of queues on a broker:
----
connector {
name: broker
role: route-container
host: <hostname>
port: <port>
saslMechanisms: ANONYMOUS
}
address {
prefix: queue
waypoint: yes
}
autoLink {
addr: queue.first
dir: in
connection: broker
}
autoLink {
addr: queue.first
dir: out
connection: broker
}
autoLink {
addr: queue.second
dir: in
connection: broker
}
autoLink {
addr: queue.second
dir: out
connection: broker
}
----
The +address+ entity identifies a namespace 'queue.' that will be used
for routing messages through queues via autolinks. The four +autoLink+ entities
identify the head and tail of two queues on the broker that will be connected
via auto-links.
If there is no broker connected, the auto-links shall remain
_inactive_. This can be observed by using the `qdstat` tool:
---------------------------
$ qdstat --autolinks
AutoLinks
addr dir phase link status lastErr
===================================================
queue.first in 1 inactive
queue.first out 0 inactive
queue.second in 1 inactive
queue.second out 0 inactive
---------------------------
If a broker comes online with a queue called 'queue.first', the
auto-links will attempt to activate:
--------------------
$ qdstat --autolinks
AutoLinks
addr dir phase link status lastErr
======================================================================
queue.first in 1 6 active
queue.first out 0 7 active
queue.second in 1 failed Node not found: queue.second
queue.second out 0 failed Node not found: queue.second
--------------------
Note that two of the auto-links are in _failed_ state because the queue
does not exist on the broker.
If we now use the Qpid Proton example application `simple_send.py` to send
three messages to 'queue.first' via the router:
--------------------------
$ python simple_send.py -a 127.0.0.1/queue.first -m3
all messages confirmed
--------------------------
and then look at the address statistics on the router:
----------------------------
$ qdstat -a
Router Addresses
class addr phs distrib in-proc local remote cntnr in out thru to-proc from-proc
========================================================================================================
mobile queue.first 1 balanced 0 0 0 0 0 0 0 0 0
mobile queue.first 0 balanced 0 1 0 0 3 3 0 0 0
----------------------------
we see that 'queue.first' appears twice in the list of addresses. The
+phs+, or phase column shows that there are two phases for the
address. Phase '0' is for routing message deliveries from producers to
the tail of the queue (the +out+ auto-link associated with the queue).
Phase 1 is for routing deliveries from the head of the queue to
subscribed consumers.
Note that three deliveries have been counted in the "in" and "out"
columns for phase '0'. The "in" column represents the three messages
that arrived from `simple_send.py` and the +out+ column represents the three
deliveries to the queue on the broker.
If we now use `simple_recv.py` to receive three messages from this address:
--------------
$ python simple_recv.py -a 127.0.0.1:5672/queue.first -m3
{u'sequence': int32(1)}
{u'sequence': int32(2)}
{u'sequence': int32(3)}
--------------
We receive the three queued messages. Looking at the addresses again, we
see that phase 1 was used to deliver those messages from the queue to
the consumer.
----------------------------
$ qdstat -a
Router Addresses
class addr phs distrib in-proc local remote cntnr in out thru to-proc from-proc
========================================================================================================
mobile queue.first 1 balanced 0 0 0 0 3 3 0 0 0
mobile queue.first 0 balanced 0 1 0 0 3 3 0 0 0
----------------------------
Note that even in a multi-router network, and with multiple producers
and consumers for 'queue.first', all deliveries will be routed through
the queue on the connected broker.
[[sharded-queue-example]]
Sharded Queue Example
~~~~~~~~~~~~~~~~~~~~~
Here is an extension of the above example to illustrate how Qpid
Dispatch Router can be used to create a distributed queue in which
multiple brokers share the message-queueing load.
----
connector {
name: broker1
role: route-container
host: <hostname>
port: <port>
saslMechanisms: ANONYMOUS
}
connector {
name: broker2
role: route-container
host: <hostname>
port: <port>
saslMechanisms: ANONYMOUS
}
address {
prefix: queue
waypoint: yes
}
autoLink {
addr: queue.first
dir: in
connection: broker1
}
autoLink {
addr: queue.first
dir: out
connection: broker1
}
autoLink {
addr: queue.first
dir: in
connection: broker2
}
autoLink {
addr: queue.first
dir: out
connection: broker2
}
----
In the above configuration, there are two instances of _queue.first_ on
brokers 1 and 2. Message traffic from producers to address _queue.first_
shall be balanced between the two instance and messages from the queues
shall be balanced across the collection of subscribers to the same
address.
[[dynamically-adding-shards]]
Dynamically Adding Shards
~~~~~~~~~~~~~~~~~~~~~~~~~
Since configurable entities in the router can also be accessed via the
management protocol, we can remotely add a shard to the above example
using `qdmanage`:
----
qdmanage create --type org.apache.qpid.dispatch.connector host=<host> port=<port> name=broker3
qdmanage create --type org.apache.qpid.dispatch.router.config.autoLink addr=queue.first dir=in connection=broker3
qdmanage create --type org.apache.qpid.dispatch.router.config.autoLink addr=queue.first dir=out connection=broker3
----