62 lines
3.5 KiB
Markdown
62 lines
3.5 KiB
Markdown
Virtual Topics
|
|
==============
|
|
|
|
Virtual Topics (a specialisation of virtual destinations) in ActiveMQ 5.x typically address two different but related
|
|
problems. Lets take each in turn:
|
|
|
|
Shared access to a JMS durable topic subscription
|
|
-------------------------------------------------
|
|
With JMS1.1, a durable subscription is identified by the pair of clientId and subscriptionName. The clientId
|
|
component must be unique to a connection on the broker. This means that the subscription is exclusive. It is
|
|
not possible to load balance the stream of messages across consumers and quick failover is difficult because the
|
|
existing connection state on the broker needs to be first disposed.
|
|
With virtual topics, each subscription's stream of messages is redirected to a queue.
|
|
|
|
In Artemis there are two alternatives, the new JMS 2.0 api or direct access to a subscription queue via the FQQN.
|
|
|
|
JMS 2.0 shared subscriptions
|
|
----------------------------
|
|
JMS 2.0 adds the possibility of shared subscriptions with new API's that are fully supported in Artemis.
|
|
|
|
Fully Qualified Queue name (FQQN)
|
|
---------------------------------
|
|
Secondly, Artemis uses a queue per topic subscriber model internally and it is possibly to directly address the
|
|
subscription queue using its Fully Qualified Queue name (FQQN).
|
|
|
|
For example, a default 5.x consumer destination for topic `VirtualTopic.Orders` subscription `A`:
|
|
```
|
|
...
|
|
Queue subscriptionQueue = session.createQueue("Consumer.A.VirtualTopic.Orders");
|
|
session.createConsumer(subscriptionQueue);
|
|
|
|
```
|
|
would be replaced with an Artemis FQQN comprised of the address and queue.
|
|
```
|
|
...
|
|
Queue subscriptionQueue = session.createQueue("VirtualTopic.Orders::Consumer.A.VirtualTopic.Orders");
|
|
session.createConsumer(subscriptionQueue);
|
|
```
|
|
|
|
This does require modification to the destination name used by consumers which is not ideal.
|
|
If OpenWire clients cannot be modified, Artemis supports a virtual topic wildcard filter
|
|
mechanism on the OpenWire protocol handler that will automatically convert the consumer destination into the
|
|
corresponding FQQN.
|
|
The format is a comma separated list of strings pairs, delimited with a ';'. Each pair identifies a filter to match
|
|
the virtual topic consumer destination and an int that specifies the number of path matches that terminate the consumer
|
|
queue identity.
|
|
|
|
E.g: For the default 5.x virtual topic consumer prefix of ```Consumer.*.``` the parameter ```virtualTopicConsumerWildcards``` should be: ```Consumer.*.>;2```.
|
|
However, there is a caveat because this value needs to be encoded in a uri for the xml configuration. Any unsafe url characters
|
|
, in this case: ```> ;``` need to be escaped with their hex code point representation; leading to a value of ```Consumer.*.%3E%3B2```.
|
|
In this way a consumer destination of ```Consumer.A.VirtualTopic.Orders``` will be transformed into a FQQN of
|
|
```VirtualTopic.Orders::Consumer.A.VirtualTopic.Orders```.
|
|
|
|
|
|
Durable topic subscribers in a network of brokers
|
|
-------------------------------------------------
|
|
The store and forward network bridges in 5.x create a durable subscriber per destination. As demand migrates across a
|
|
network, duplicate durable subs get created on each node in the network but they do not migrate. The end result can
|
|
result in duplicate message storage and ultimately duplicate delivery, which is not good.
|
|
When durable subscribers map to virtual topic subscriber queues, the queues can migrate and the problem can be avoided.
|
|
|
|
In Artemis, because a durable sub is modeled as a queue, this problem does not arise. |