AMQP 1.0 and Shared Subscriptions

2015-05-06 Thread Dominic Evans
When we were implementing the MQ Light broker, we wanted to be able to support 
sharing of subscriptions across a group of clients - in particular for the 
worker offload scenario. At the time we were unable to find guidance in the 
specification or extensions thereof, so we went ahead with encoding this into 
the terminus addresses of an attach. Using a `private:` prefix to denote an 
exclusive subscription, and `share:sharename` to indicate a shared one.

i.e.,

- @attach(18) [name=share:sharename:topicname, handle=0, role=true, 
snd-settle-mode=0, rcv-settle-mode=0, source=@source(40) 
[address=share:sharename:topicname, durable=0, timeout=0, dynamic=false], 
target=@target(41) [address=share:sharename:topicname, durable=0, timeout=0, 
dynamic=false], initial-delivery-count=0]

vs

- @attach(18) [name=private:topicname, handle=0, role=true, 
snd-settle-mode=0, rcv-settle-mode=0, source=@source(40) 
[address=private:topicname, durable=0, timeout=0, dynamic=false], 
target=@target(41) [address=private:topicname, durable=0, timeout=0, 
dynamic=false], initial-delivery-count=0]

The other day I happened to notice that the qpid-cpp broker also supports a 
similar functionality since https://issues.apache.org/jira/browse/QPID-4917 / 
https://github.com/apache/qpid/commit/d4dafd3 - and it does this by supporting 
a capability of 'shared' on the exchange, and expecting a client @attach to 
request this capability, whereupon the link-name is used as-is for the name of 
the share. I wasn't able to find this behaviour documented any further than 
that, and it wasn't clear to me what the behaviour should be for the various 
scenarios.

Ideally we'd like to conform to a common standard. Does anyone know if there 
were any plans to register this (or another) shared subscription behaviour with 
the working group as an extension?


-- 

Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number 
741598. 
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU



Re: AMQP 1.0 and Shared Subscriptions

2015-05-06 Thread Ken Giusti
Bump this up.

I'm essentially in the same boat.  The olso.messaging library in Openstack has 
introduced a feature called 'consumer pools' which is essentially the same 
pattern: a set of subscribers to a topic can belong to a pool.  Each distinct 
pool of subscribers get a copy of the message sent to the topic, and only one 
subscriber from the pool claims the message.

This pattern is available in the JMS 2.0 API via the createdSharedConsumer call 
[1]

I'm particularly interested in how such a feature could be implemented in a 
qpid-dispatch based federation of brokers.  I suspect that all subscribers to a 
given share would have to belong on the same broker - if shares existed on 
multiple brokers then each 'sub-share' would get a copy of the same message in 
violation of the pattern. 


[1] http://www.oracle.com/technetwork/articles/java/jms2messaging-1954190.html

- Original Message -
 From: Dominic Evans dominic.ev...@uk.ibm.com
 To: proton@qpid.apache.org
 Sent: Wednesday, May 6, 2015 7:41:59 AM
 Subject: AMQP 1.0 and Shared Subscriptions
 
 When we were implementing the MQ Light broker, we wanted to be able to
 support sharing of subscriptions across a group of clients - in particular
 for the worker offload scenario. At the time we were unable to find guidance
 in the specification or extensions thereof, so we went ahead with encoding
 this into the terminus addresses of an attach. Using a `private:` prefix to
 denote an exclusive subscription, and `share:sharename` to indicate a shared
 one.
 
 i.e.,
 
 - @attach(18) [name=share:sharename:topicname, handle=0, role=true,
 snd-settle-mode=0, rcv-settle-mode=0, source=@source(40)
 [address=share:sharename:topicname, durable=0, timeout=0, dynamic=false],
 target=@target(41) [address=share:sharename:topicname, durable=0,
 timeout=0, dynamic=false], initial-delivery-count=0]
 
 vs
 
 - @attach(18) [name=private:topicname, handle=0, role=true,
 snd-settle-mode=0, rcv-settle-mode=0, source=@source(40)
 [address=private:topicname, durable=0, timeout=0, dynamic=false],
 target=@target(41) [address=private:topicname, durable=0, timeout=0,
 dynamic=false], initial-delivery-count=0]
 
 The other day I happened to notice that the qpid-cpp broker also supports a
 similar functionality since https://issues.apache.org/jira/browse/QPID-4917
 / https://github.com/apache/qpid/commit/d4dafd3 - and it does this by
 supporting a capability of 'shared' on the exchange, and expecting a client
 @attach to request this capability, whereupon the link-name is used as-is
 for the name of the share. I wasn't able to find this behaviour documented
 any further than that, and it wasn't clear to me what the behaviour should
 be for the various scenarios.
 
 Ideally we'd like to conform to a common standard. Does anyone know if there
 were any plans to register this (or another) shared subscription behaviour
 with the working group as an extension?
 
 
 --
 
 Unless stated otherwise above:
 IBM United Kingdom Limited - Registered in England and Wales with number
 741598.
 Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU
 
 

-- 
-K


Re: AMQP 1.0 and Shared Subscriptions

2015-05-06 Thread Ted Ross


On 05/06/2015 10:05 AM, Ken Giusti wrote:

Bump this up.

I'm essentially in the same boat.  The olso.messaging library in Openstack has 
introduced a feature called 'consumer pools' which is essentially the same 
pattern: a set of subscribers to a topic can belong to a pool.  Each distinct 
pool of subscribers get a copy of the message sent to the topic, and only one 
subscriber from the pool claims the message.

This pattern is available in the JMS 2.0 API via the createdSharedConsumer call 
[1]

I'm particularly interested in how such a feature could be implemented in a 
qpid-dispatch based federation of brokers.  I suspect that all subscribers to a 
given share would have to belong on the same broker - if shares existed on 
multiple brokers then each 'sub-share' would get a copy of the same message in 
violation of the pattern.


A half-baked idea:

What if we implemented a shared-target in Dispatch?  It's like a 
waypoint except it doesn't have any external component and has no 
connections or links associated with it.


You would configure a shared-target to receive from topic address T and 
send to pool address P.  The semantics for T are multicast (i.e. each 
pool receiving from T will get one copy of every message from T) and the 
semantics for P are anycast (i.e. messages to P will be sent to exactly 
one of the consumers of P).


Would that solve your problem?




[1] http://www.oracle.com/technetwork/articles/java/jms2messaging-1954190.html

- Original Message -

From: Dominic Evans dominic.ev...@uk.ibm.com
To: proton@qpid.apache.org
Sent: Wednesday, May 6, 2015 7:41:59 AM
Subject: AMQP 1.0 and Shared Subscriptions

When we were implementing the MQ Light broker, we wanted to be able to
support sharing of subscriptions across a group of clients - in particular
for the worker offload scenario. At the time we were unable to find guidance
in the specification or extensions thereof, so we went ahead with encoding
this into the terminus addresses of an attach. Using a `private:` prefix to
denote an exclusive subscription, and `share:sharename` to indicate a shared
one.

i.e.,

- @attach(18) [name=share:sharename:topicname, handle=0, role=true,
snd-settle-mode=0, rcv-settle-mode=0, source=@source(40)
[address=share:sharename:topicname, durable=0, timeout=0, dynamic=false],
target=@target(41) [address=share:sharename:topicname, durable=0,
timeout=0, dynamic=false], initial-delivery-count=0]

vs

- @attach(18) [name=private:topicname, handle=0, role=true,
snd-settle-mode=0, rcv-settle-mode=0, source=@source(40)
[address=private:topicname, durable=0, timeout=0, dynamic=false],
target=@target(41) [address=private:topicname, durable=0, timeout=0,
dynamic=false], initial-delivery-count=0]

The other day I happened to notice that the qpid-cpp broker also supports a
similar functionality since https://issues.apache.org/jira/browse/QPID-4917
/ https://github.com/apache/qpid/commit/d4dafd3 - and it does this by
supporting a capability of 'shared' on the exchange, and expecting a client
@attach to request this capability, whereupon the link-name is used as-is
for the name of the share. I wasn't able to find this behaviour documented
any further than that, and it wasn't clear to me what the behaviour should
be for the various scenarios.

Ideally we'd like to conform to a common standard. Does anyone know if there
were any plans to register this (or another) shared subscription behaviour
with the working group as an extension?


--

Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number
741598.
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU






Re: AMQP 1.0 and Shared Subscriptions

2015-05-06 Thread Chuck Rolke
On some recent traces to an ActiveMQ 5.12 broker I observed that the broker 
signals some info in the open frame:
  capability:ANONYMOUS-RELAY, 
  property:{topic-prefix:topic://, queue-prefix:queue://}

Having written clients that try to go to ActiveMQ brokers and to Qpid brokers, 
getting the queue and topic prefixes from the broker is extremely convenient as 
long as the broker requires a prefix. If ActiveMQ needs a prefix, Qpidd uses a 
node property, and MQ Light uses different prefixes then interoperability 
becomes an issue. I'd much rather see all brokers use the property scheme and 
not overload the address with prefixes.

- Original Message -
 From: Gordon Sim g...@redhat.com
 To: us...@qpid.apache.org
 Cc: proton@qpid.apache.org
 Sent: Wednesday, May 6, 2015 10:54:26 AM
 Subject: Re: AMQP 1.0 and Shared Subscriptions
 
 Moving to the user list as this is a more general topic.
 
 On 05/06/2015 12:41 PM, Dominic Evans wrote:
  When we were implementing the MQ Light broker, we wanted to be able
  to support sharing of subscriptions across a group of clients - in
  particular for the worker offload scenario. At the time we were
  unable to find guidance in the specification or extensions thereof,
  so we went ahead with encoding this into the terminus addresses of an
  attach. Using a `private:` prefix to denote an exclusive
  subscription, and `share:sharename` to indicate a shared one.
 
  i.e.,
 
  - @attach(18) [name=share:sharename:topicname, handle=0,
  role=true, snd-settle-mode=0, rcv-settle-mode=0, source=@source(40)
  [address=share:sharename:topicname, durable=0, timeout=0,
  dynamic=false], target=@target(41)
  [address=share:sharename:topicname, durable=0, timeout=0,
  dynamic=false], initial-delivery-count=0]
 
  vs
 
  - @attach(18) [name=private:topicname, handle=0, role=true,
  snd-settle-mode=0, rcv-settle-mode=0, source=@source(40)
  [address=private:topicname, durable=0, timeout=0, dynamic=false],
  target=@target(41) [address=private:topicname, durable=0,
  timeout=0, dynamic=false], initial-delivery-count=0]
 
  The other day I happened to notice that the qpid-cpp broker also
  supports a similar functionality since
  https://issues.apache.org/jira/browse/QPID-4917 /
  https://github.com/apache/qpid/commit/d4dafd3 - and it does this by
  supporting a capability of 'shared' on the exchange, and expecting a
  client @attach to request this capability, whereupon the link-name is
  used as-is for the name of the share. I wasn't able to find this
  behaviour documented any further than that, and it wasn't clear to me
  what the behaviour should be for the various scenarios.
 
 The behaviour is briefly documented in
 https://svn.apache.org/repos/asf/qpid/trunk/qpid/cpp/AMQP_1.0.
 
 A link on which messages are to be sent out from the broker, i.e. a
 subscription from the clients perspective, can have the 'shared'
 capability requested on it. If two such subscription requests are made
 with the same link name, then messages for that subscription are
 distributed between those links, rather than each receiving their own copy.
 
 This came out of discussions on the user list:
 http://qpid.2158936.n2.nabble.com/c-Status-of-the-AMQP-1-0-work-td7591137.html#a7594079
 
  Ideally we'd like to conform to a common standard. Does anyone know
  if there were any plans to register this (or another) shared
  subscription behaviour with the working group as an extension?
 
 JMS 2.0 will need something similar (though more complicated), so at
 some point the JMS binding doc will presumably suggest something.
 


Re: AMQP 1.0 and Shared Subscriptions

2015-05-06 Thread Ken Giusti


- Original Message -
 From: Ted Ross tr...@redhat.com
 To: proton@qpid.apache.org
 Sent: Wednesday, May 6, 2015 10:25:32 AM
 Subject: Re: AMQP 1.0 and Shared Subscriptions
 
 
 On 05/06/2015 10:05 AM, Ken Giusti wrote:
  Bump this up.
 
  I'm essentially in the same boat.  The olso.messaging library in Openstack
  has introduced a feature called 'consumer pools' which is essentially the
  same pattern: a set of subscribers to a topic can belong to a pool.  Each
  distinct pool of subscribers get a copy of the message sent to the topic,
  and only one subscriber from the pool claims the message.
 
  This pattern is available in the JMS 2.0 API via the createdSharedConsumer
  call [1]
 
  I'm particularly interested in how such a feature could be implemented in a
  qpid-dispatch based federation of brokers.  I suspect that all subscribers
  to a given share would have to belong on the same broker - if shares
  existed on multiple brokers then each 'sub-share' would get a copy of the
  same message in violation of the pattern.
 
 A half-baked idea:
 
 What if we implemented a shared-target in Dispatch?  It's like a
 waypoint except it doesn't have any external component and has no
 connections or links associated with it.
 
 You would configure a shared-target to receive from topic address T and
 send to pool address P.  The semantics for T are multicast (i.e. each
 pool receiving from T will get one copy of every message from T) and the
 semantics for P are anycast (i.e. messages to P will be sent to exactly
 one of the consumers of P).
 
 Would that solve your problem?

Openstack's particular case may be better solved on the broker due to their 
store-and-forward requirements on notification messages.  oslo.messaging 
expects notifications get queued if there are no current consumers.

In oslo.messaging the notification topic actually acts like a queue - only one 
subscriber consumes the message, and messages are balanced across all 
subscribers.  A shared pool essentially adds another queue, with each pool 
getting its own copy of the message.  A topic may have a mix of shared and 
non-shared subscribers. So the non-pooled subscribers in effect share a default 
'anonymous' queue.

I don't -think- it's required to queue messages for a shared pool, since a pool 
doesn't exist until there are actually subscribers to it.  So maybe we 
implement a hybrid solution similar to what you describe: queue a copy of each 
message to the default queue using a queue route, and anycast a copy to each 
known pool consumer.   That could buy some extra scalability. 



 
 
 
  [1]
  http://www.oracle.com/technetwork/articles/java/jms2messaging-1954190.html
 
  - Original Message -
  From: Dominic Evans dominic.ev...@uk.ibm.com
  To: proton@qpid.apache.org
  Sent: Wednesday, May 6, 2015 7:41:59 AM
  Subject: AMQP 1.0 and Shared Subscriptions
 
  When we were implementing the MQ Light broker, we wanted to be able to
  support sharing of subscriptions across a group of clients - in particular
  for the worker offload scenario. At the time we were unable to find
  guidance
  in the specification or extensions thereof, so we went ahead with encoding
  this into the terminus addresses of an attach. Using a `private:` prefix
  to
  denote an exclusive subscription, and `share:sharename` to indicate a
  shared
  one.
 
  i.e.,
 
  - @attach(18) [name=share:sharename:topicname, handle=0, role=true,
  snd-settle-mode=0, rcv-settle-mode=0, source=@source(40)
  [address=share:sharename:topicname, durable=0, timeout=0,
  dynamic=false],
  target=@target(41) [address=share:sharename:topicname, durable=0,
  timeout=0, dynamic=false], initial-delivery-count=0]
 
  vs
 
  - @attach(18) [name=private:topicname, handle=0, role=true,
  snd-settle-mode=0, rcv-settle-mode=0, source=@source(40)
  [address=private:topicname, durable=0, timeout=0, dynamic=false],
  target=@target(41) [address=private:topicname, durable=0, timeout=0,
  dynamic=false], initial-delivery-count=0]
 
  The other day I happened to notice that the qpid-cpp broker also supports
  a
  similar functionality since
  https://issues.apache.org/jira/browse/QPID-4917
  / https://github.com/apache/qpid/commit/d4dafd3 - and it does this by
  supporting a capability of 'shared' on the exchange, and expecting a
  client
  @attach to request this capability, whereupon the link-name is used as-is
  for the name of the share. I wasn't able to find this behaviour documented
  any further than that, and it wasn't clear to me what the behaviour should
  be for the various scenarios.
 
  Ideally we'd like to conform to a common standard. Does anyone know if
  there
  were any plans to register this (or another) shared subscription behaviour
  with the working group as an extension?
 
 
  --
 
  Unless stated otherwise above:
  IBM United Kingdom Limited - Registered in England and Wales with number
  741598.
  Registered office: PO Box 41, North Harbour, Portsmouth

Re: AMQP 1.0 and Shared Subscriptions

2015-05-06 Thread Robbie Gemmell
On 6 May 2015 at 15:54, Gordon Sim g...@redhat.com wrote:
 Moving to the user list as this is a more general topic.


 On 05/06/2015 12:41 PM, Dominic Evans wrote:

 When we were implementing the MQ Light broker, we wanted to be able
 to support sharing of subscriptions across a group of clients - in
 particular for the worker offload scenario. At the time we were
 unable to find guidance in the specification or extensions thereof,
 so we went ahead with encoding this into the terminus addresses of an
 attach. Using a `private:` prefix to denote an exclusive
 subscription, and `share:sharename` to indicate a shared one.

 i.e.,

 - @attach(18) [name=share:sharename:topicname, handle=0,
 role=true, snd-settle-mode=0, rcv-settle-mode=0, source=@source(40)
 [address=share:sharename:topicname, durable=0, timeout=0,
 dynamic=false], target=@target(41)
 [address=share:sharename:topicname, durable=0, timeout=0,
 dynamic=false], initial-delivery-count=0]

 vs

 - @attach(18) [name=private:topicname, handle=0, role=true,
 snd-settle-mode=0, rcv-settle-mode=0, source=@source(40)
 [address=private:topicname, durable=0, timeout=0, dynamic=false],
 target=@target(41) [address=private:topicname, durable=0,
 timeout=0, dynamic=false], initial-delivery-count=0]

 The other day I happened to notice that the qpid-cpp broker also
 supports a similar functionality since
 https://issues.apache.org/jira/browse/QPID-4917 /
 https://github.com/apache/qpid/commit/d4dafd3 - and it does this by
 supporting a capability of 'shared' on the exchange, and expecting a
 client @attach to request this capability, whereupon the link-name is
 used as-is for the name of the share. I wasn't able to find this
 behaviour documented any further than that, and it wasn't clear to me
 what the behaviour should be for the various scenarios.


 The behaviour is briefly documented in
 https://svn.apache.org/repos/asf/qpid/trunk/qpid/cpp/AMQP_1.0.

 A link on which messages are to be sent out from the broker, i.e. a
 subscription from the clients perspective, can have the 'shared' capability
 requested on it. If two such subscription requests are made with the same
 link name, then messages for that subscription are distributed between those
 links, rather than each receiving their own copy.

 This came out of discussions on the user list:
 http://qpid.2158936.n2.nabble.com/c-Status-of-the-AMQP-1-0-work-td7591137.html#a7594079

 Ideally we'd like to conform to a common standard. Does anyone know
 if there were any plans to register this (or another) shared
 subscription behaviour with the working group as an extension?


 JMS 2.0 will need something similar (though more complicated), so at some
 point the JMS binding doc will presumably suggest something.


As Gordon says, when we get to JMS 2.0 the AMQP JMS Mapping doc would
need something in this area, since JMS 2.0 has shared durable and non
durable subscriptions. We are initially doing a 1.1 mapping, but did
spend some time thinking on this to see how it might work in with e.g
the old non-shared durable subscriptions.

We progressed an idea around an extended use the 'shared' capability.
The main issue with using just the capability and link name is that
links have to be unique (in a given direction) based on the
conainer-id-1 + link-name + container-id-2 triplet, so for a
particular 'broker container' that would limit you to having a single
subscriber per set of connections using the same container id, which
partly defeats the intent. As a result, we also ended up looking at
ways to encode the subscription name into the address. That idea also
came up independently because it was felt it would be better
conceptually to have different address strings for different shared
subscriptions on the same topic, given they would essentially be
different [psudeo-] nodes.

We eventually parked the idea and decided to revisit it when we
actually get to JMS 2.0, and quite possibly look at using AMQP
Management to do it instead, because things got horrendously
complicated when adapting things further to enable meeting numerous
additional restrictions needed for JMS subscription semantics.

For those wonderring, some the issues for shared subs with JMS 2.0
included: the requirements for unsubscribing (where you dont know the
topic), combined namespaces for shared and non shared durable
subscriptions that must be distinguishable, sharing across different
connections that might dont a clientid and so might have the same
special containerid (one possibility considered for handling
no-clientid), and creating new subscribers for a subscription with
different topic+selector details which must fail in some situations
but succeed in others. The list goes on.

Robbie