So for configuring this capability I was thinking of something along the
lines of two messenger level settings for reliability, e.g. something for
incoming messages controlling at-most-once vs at-least-once vs
exactly-once, and likewise for outgoing messages.

I think controlling whether or not the application is required to ack at
the subscription level might be a bit weird since you might or might not
need to ack a message depending on where it has come from and that could be
error prone/confusing. I think we could have a separate control at the
subscription level that would influence what acking happens on the wire,
but I think we should think of the responsibilities of the programmer and
his interaction the outgoing/incoming queues as distinct from what acking
may or may not happen on the wire.

--Rafael

On Sun, Oct 28, 2012 at 2:58 AM, David Ingham <david.ing...@microsoft.com>wrote:

> I like option 2 too for the concept separation reasons that have already
> been stated.
>
> The next question is how would an app select which receive mode it's
> interested in (auto ack vs. explicit ack). Would this be an option on
> Messenger.subscribe()?
>
> Dave.
>
> -----Original Message-----
> From: William Henry [mailto:whe...@redhat.com]
> Sent: Friday, October 26, 2012 12:27 PM
> To: proton@qpid.apache.org
> Subject: Re: acks for messenger
>
> +1  I like the separation.  And the analogy to tracking is not only
> palatable but also kinda proves out the idea.
>
> William
>
> ----- Original Message -----
> > I like option 2) for two reasons.  One, it produces very
> > straightforward semantics for the various levels of delivery
> > guarantee.  Two, it's easy to ignore if you'd like: if you just want
> > fire-and-forget messaging, you don't have to engage delivery as an api
> > concept; if you later change your mind, it's not hard to level up.
> >
> > Justin
> >
> > On Fri, 26 Oct 2012, Rafael Schloming wrote:
> >
> > > I'm taking a look at expanding the messenger API to support
> > > reliability and so far there seem to be two directions to explore
> > > which I'll attempt to describe below:
> > >
> > > Option 1)
> > >
> > >  Messenger.ack(Message) or possibly Message.ack()
> > >
> > >  I'll describe this as the simple/expected/conservative option, and
> > > those really are its strong points. Some less desirable points are
> > > that it takes the Message concept in a bit of a different  direction
> > > from where it is now. Message is no longer simply a holder of
> > > content, but it is also now (at least internally) tracking some
> > > kind  of delivery state. This is undesirable from a design
> > > perspective  since you're really merging two separate concepts here,
> > > delivery  state and message content, e.g. you now end up holding
> > > onto the  message content to track the delivery state when arguablly
> > > the  common case is that an app will be done processing the content
> > > quickly but may care about the delivery state for longer. Another
> > > implication of this merging is that it makes messages harder to
> > > reuse, e.g. imagine if you want to receive a message, mutate it a
> > > bit, and then resend it or send a number of similar messages.
> > >
> > >  It's also potentially more work from an implementation perspective
> > > as the underlying model treats Message as pure content and has
> > > delivery factored out as a separate concept, so this would be the
> > > start of a bit of an impedence missmatch between layers. It's
> > > certainly doable, but might result in more overall code since we'd
> > > be expressing similar concepts in two different ways.
> > >
> > > Option 2)
> > >
> > >  Introduce/surface the notion of a delivery/tracking number through
> > > the Messenger API, e.g.:
> > >
> > >  Messenger.put(Message) -> Delivery/Tracking-Number/Whatever
> > >  Messenger.get(Message) -> Delivery/Tracking-Number/Whatever
> > >
> > >  (I'll abbreviate Delivery/Tracking-Number/Whatever as DTW for
> > >  now.)
> > >
> > >  There are a couple of choices with this option, DTW could be a
> > > value  object (i.e. similar to a handle), with actions on the
> > > messenger  itself, e.g. Messenger.ack(DTW), Messenger.status(DTW).
> > > This kind  of  takes the tracking number analogy and runs with it,
> > > you ask your  messenger about the status of a given delivery via its
> > > tracking  number. Alternatively, DTW itself could be a more action
> > > oriented  interface with its own methods for acking/status/etc. This
> > > isn't  necessarily an either/or as there are reasons the C API might
> > > want  to use a handle approach even if we wish to
> > > conceptualize/surface  DTW as more of an independent thing in the
> > > object oriented  interfaces.
> > >
> > >  On the negative side this is less traditional/expected relative to
> > > Option (1), and it does in total add more surface area to the API.
> > >  On the positive side however it does provide a lot more capability
> > > since the same concept extends quite easily to track the state of
> > > outgoing deliveries.
> > >
> > >  From a design perspective this is nicer for a couple of reasons,
> > > unlike Option (1) by keeping Message as a pure holder of content
> > > you  have more flexibility with how you use the API, e.g. you can
> > > discard/reuse the Message but still track the status of your
> > > deliveries. Also, it seems likely that once the Option 1) path
> > > includes the ability to track the status of outgoing deliveries,
> > > the  total surface area balance might fall more in favor of Option
> > > (2).
> > >
> > >  A possible addendum to Option (2) suggested by Rob in order to
> > > deal  with the surface area concerns is adding some kind of
> > >  Messenger.ack() that would acknowledge all unacked deliveries
> > > pulled  from the incoming queue. This would enable you to do basic
> > > acking  without ever needing to bother with DTWs if you don't care
> > > about  them. This could in fact be a nice place to start as it
> > > doesn't  necessarily commit us to either path initially.
> > >
> > > FWIW, my bias right now is towards exploring Option (2). I think the
> > > fact that it is less expected is sufficiently mitigated by the fact
> > > that with the addendum there is a very gentle learning curve, and
> > > even if you explain all the concepts up front, the whole tracking
> > > number analogy makes it fairly intuitive. I can even imagine playing
> > > up the difference as a selling point from a technical marketing
> > > perspective.
> > >
> > > --Rafael
> > >
> >
>

Reply via email to