Re: MSMQT Dummy Problem

From: Iuliu Rus (iuliur_at_microsoft.com)
Date: 06/02/04


Date: Wed, 02 Jun 2021 17:23:13 GMT

I'll try. First, InOrdAckT. The MSMQ protocol uses order acks to guarantee
only once and in order delivery. It works like this: the sender puts
sequence numbers in every MSMQ message that it sends to a queue. Because of
network issues, some messages might be lost. To guarantee that delivery,
the sender needs to resend the messages that get lost. To do that, he needs
to figure out what messages reached the destination and what messages were
lost. Here the receiver comes into play. For every queue, the receiver
maintains the last good sequence number that it got from the network. For
example if the receiver gets M1, M2, M3 and M6 from the network, he
discards M6 (because M4 and M5 are missing) and sets the last good sequence
number to 3. Periodically (every X minutes) the receiver sends back to the
sender a special message called an Order Ack, that contains the last good
sequence number. It is a way of saying "I have all the messages up to 3,
please resend M4 and above" (M6 will be resent again).

InOrdAckT is a timer message that MSMQT posts to itself to remind him to
send order ack for this queue. MSMQT cannot use in-memory timers because
there might be more that one physical computer that needs that timer, so it
uses the Biztalk routing infrastructure to post a message himself.

Second, InReleaseT. Because MSMQT needs to guarantee ordered delivery, at
any point in time only one thread on only one computer in the group must
process messages that are delivered to a specific queue. This thread works
on some persistent data that is saved and loaded from the database. We call
this a MSMQT instance. When the thread is running on a specific computer,
we say that the MSMQT instance is "Active". When the data is persisted in
the database and there is no one working on it we say that the instance is
"Dehydrated". An active MSMQT instance maintains a lock on the queue object
in the database, so that no other active instance on any other computer can
work on this queue. For load-balancing purposes and to save memory, active
MSMQT instances are dehydrated if the queue wasn't used in a while.

InReleaseT is a special timer message that MSMQT posts to all instances to
remind them to dehydrate if the queue wasn't used since the last time they
received this message.

If a queue wasn't used in a long, long time, MSMQT will delete any database
objects and state associated with that queue. InCleanT is message that
posts to itself to remind him to check if the queue was used and to delete
the database objects if it wasn't



Relevant Pages