+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 > > >