Hi Matt,
Comments inline.
On Mon, Nov 21, 2016 at 7:02 PM, Matt Pavlovich
<[email protected]> wrote:
Martyn-
I think you nailed it here-- well done =)
My notes in-line--
On 11/21/16 10:45 AM, Martyn Taylor wrote:
1. Ability to route messages to queues with the same address, but
different
routing semantics.
The proposal outlined in ARTEMIS-780 outlines a new model that
introduces
an address object at the configuration and management layer. In the
proposal it is not possible to create 2 addresses with different
routing
types. This causes a problem with existing clients (JMS, STOMP
and for
compatability with other vendors).
Potential Modification: Addresses can have multiple routing type
“endpoints”, either “multicast” only, “anycast” only or both. The
example
below would be used to represent a JMS Topic called “foo”, with a
single
subscription queue and a JMS Queue called “foo”. N.B. The actual
XML is
just an example, there are multiple ways this could be
represented that we
can define later.
<*addresses*> <*address* *name**="foo"*> <*anycast*>
<*queues*> <*queue* *name**="**foo”* />
</*queues*>
</*anycast*> <*mulcast*> <*queues*>
<*queue* *name**="my.topic.subscription" */> </*queues*>
</*multicast*> </*address*></*addresses*>
I think this solves it. The crux of the issues (for me) boils down to
auto-creation of destinations across protocols. Having this show
up in the
configs would give developers and admins more information to
troubleshoot
the mixed address type+protocol scenario.
2. Sending to “multicast”, “anycast” or “all”
As mentioned earlier JMS (and other clients such as STOMP via
prefixing)
allow the producer to identify the type of end point it would
like to send
to.
If a JMS client creates a producer and passes in a topic with
address
“foo”. Then only the queues associated with the “multicast”
section of the
address. A similar thing happens when the JMS producer sends to a
“queue”
messages should be distributed amongst the queues associated with
the
“anycast” section of the address.
There may also be a case when a producer does not identify the
endpoint
type, and simply sends to “foo”. AMQP or MQTT may want to do
this. In this
scenario both should happen. All the queues under the multicast
section
get
a copy of the message, and one queue under the anycast section
gets the
message.
Modification: None Needed. Internal APIs would need to be updated
to allow
this functionality.
I think the "deliver to all" scenario should be fine. This seems
analogous
to a CompositeDestination in ActiveMQ 5.x. I'll map through some
scenarios
and report back any gotchas.
3. Support for prefixes to identify endpoint types
Many clients, ActiveMQ 5.x, STOMP and potential clients from
alternate
vendors, identify the endpoint type (in producer and consumer)
using a
prefix notation.
e.g. queue:///foo
Which would identify:
<*addresses*> <*address* *name**="foo"*> <*anycast*>
<*queues*> <*queue* *name**="my.foo.queue" */>
</*queues*> </*anycast*> </*address*></*addresses*>
Modifications Needed: None to the model. An additional parameter
to the
acceptors should be added to identify the prefix.
Just as a check point in the syntax+naming convention in your
provided
example... would the name actually be:
<*queue* *name**="foo" .. vs "my.foo.queue" ?
The queue name can be anything. It's the address that is used by
consumer/producer. The protocol handler / broker will decided
which queue
to connect to.
4. Multiple endpoints are defined, but client does not specify
“endpoint
routing type” when consuming
Handling cases where consumers does not pass enough information
in their
address or via protocol specific mechanisms to identify an
endpoint. Let’s
say an AMQP client, requests to subscribe to the address “foo”,
but passes
no extra information. In the cases where there are only a single
endpoint
type defined, the consumer would associated with that endpoint type.
However, when both endpoint types are defined, the protocol
handler does
not know whether to associate this consumer with a queue under the
“anycast” section, or whether to create a new queue under the
“multicast”
section. e.g.
Consume: “foo”
<*addresses*>
<*address* *name**="foo"*> <*anycast*> <*queues*>
<*queue* *name**="**foo”* /> </*queues*>
</*anycast*> <*multicast*> <*queues*> <*queue*
*name**="my.topic.subscription" */> </*queues*>
</*multicast*> </*address*></*addresses*>
In this scenario, we can make the default configurable on the
protocol/acceptor. Possible options for this could be:
“multicast”: Defaults multicast
“anycast”: Defaults to anycast
“error”: Returns an error to the client
Alternatively each protocol handler could handle this in the most
sensible
way for that protocol. MQTT might default to “multicast”, STOMP
“anycast”,
and AMQP to “error”.
Yep, this works great. I think there are two flags on the
acceptors.. one
for auto-create and one for default handling of name collision. The
defaults would most likely be the same.
Something along the lines of:
auto-create-default = "multicast | anycast"
no-prefix-default = "multicast | anycast | error"
5. Fully qualified address names
This feature allows a client to identify a particular address on a
specific
broker in a cluster. This could be achieved by the client using
some form
of address as:
queue:///host/broker/address/
Matt could you elaborate on the drivers behind this requirement
please.
I am of the opinion that this is out of the scope of the addressing
changes, and is more to do with redirecting in cluster scenarios.
The
current model will support this address syntax if we want to use
it in the
future.
I agree that tackling the impl of this should be out-of-scope. My
recommendation is to consider it in addressing now, so we can
hopefully
avoid any breakage down the road.
A widely used feature in other EMS brokers (IBM MQ, Tibco EMS,
etc) is the
ability to fully address a destination using a format similar to
this:
queue://brokerB/myQueue
The advantage of this is to allow for scaling of the number of
destinations
and allows for more dynamic broker networks to be created without
applications having to have connection information for all brokers
in a
broker network. Think simple delivery+routing, and not horizontal
scaling.
It is very analogous to SMTP mail routing.
Producer behavior:
1. Client X connects to brokerA and sends it a message addressed:
queue://brokerB/myQueue
2. brokerA accepts the message on behalf of brokerB and handles all
acknowledgement and persistence accordingly
3. brokerA would then store the message in a "queue" for brokerB.
Note:
All messages for brokerB are generally stored in one queue-- this
is how it
helps with destination scaling
Broker to broker behavior:
There are generally two scenarios: always-on or periodic-check
In "always-on"
1. brokerA looks for a brokerB in its list of cluster connections
and then
sends all messages for all queues for brokerB (or brokerB pulls all
messages, depending on cluster connection config)
In "periodic-check"
1. brokerB connects to brokerA (or vice-versa) on a given time
interval
and then receives any messages that have arrived since last check
TL;DR;
It would be cool to consider remote broker delivery for messages
while
refactoring the address handling code. This would bring Artemis
inline with
the rest of the commercial EMS brokers. The impact now, hopefully,
is minor
and just thinking about default prefixes.
Understood, from our conversations on IRC I can see why this might be
useful.
Thanks,
-Matt