Date: Tue, 04 Dec 2001 10:16:21 -0600
From: David Fischer <david@drummondgroup.com>
Dan, did you mean to imply that messages are no longer stored once they are
acknowledged? This is not the case. Messages must be stored longer than
persistDuration. In your scenario, when 12 got to the Receiving MSH, 1-10 are
still in the store.
I've heard this said before but I don't understand it. Why must
messages be stored longer than persistDuration?
In fact, once a message has been given to the application, why does it
have to be stored persistently beyond that point?
And if it does have to be stored beyond that point, for how long does
it have to be stored?
You *do* have to store the MessageId of the message if you're doing
duplicate elimination, but that doesn't require storing the message
itself.
If you wait so long that 1-10 have passed persistDuration,
then I think you have waited so long that it does not matter any more.
Why is that so long that it doesn't matter any more? Perhaps MSH A
sends 10 messages, and MSH B receives and acknowledges them, and MSH B
delivers all ten messages to its application. Then three weeks pass
(the receiver is a supplier of rabbit soup, and it takes three weeks
to catch the rabbit), and then (perhaps after the B sends something to
A), A sends message 11 and message 12, and message 12 arrives first.
B needs to know that 12 is out of order, even though a lot of time
has passed.
However, this implies
the last ordered message/MessageId (which has been delivered in order) must be
stored indefinitely (forever?) which is probably not acceptable.
No, just until the conversation is over. (It's just like TCP.)
This also
points out the conflict between Message Order and persistDuration. What if
messages 1,2,3,4 have persistDuration of 2 days. Messages 1,2,4 are delivered.
The MSH hands 1,2 to the application but holds 4. For some reason, 3 is not
delivered for 3 days. In this case 3,4 have already passed persistDuration so
they are not delivered. The next day, 5 is delivered. Since 3,4 were not
delivered, then 5 cannot be delivered (nor any subsequent messages) even though
it is still within TTL, and the ordering is forever broken for this
ConversationId.
Well, if you asked for reliable messaging and you asked for messages
to be delivered in order, then surely you don't want to see message 5
when you haven't seen message 3. (I think we agreed that if you ask
for messages in order, then you have to be using reliable messaging,
which means acks are requested and duplicates are eliminated.)
I think the real problem here is: what has become of message 3? The
sender ought to realize that an ack has not come, and so it should
retransmit message 3. But if it just can't get message 3 through, on
a conversation on which message ordering has been specified, then
indeed no subsequent messages can be transmitted. The conversation
is stuck until message 3 gets through.
I am wondering why are we messing with all of this? Did I see Marty suggest, if
messages are order dependant, just wait for acknowledgment from the end before
sending the next message? Sounds good.
Well, I don't think it sounds good, for reasons that I have already
explained at length.
-- Dan