Queues are remote, instead of local, and this has several implications:
- A message has to cross the network boundaries before it is persisted, this implies that it is subject to all kinds of network related issues like latency, timeouts, connection loss, network partitioning etc.
- Remote queues do not play along in transactions, as transactions are very brittle because of the possible network issues mentioned in the previous point, but also because they would require server-side locks to function properly and allowing anyone to take unbound locks on a service is a very good way to get a denial of service situation. Hence Azure services typically don't allow transactions.
For more details refer to the Transactions in Azure article.
No, they do not support an
exactly-once delivery model. Depending on the selected
TransportTransactionMode it is either
at-most-once delivery. Azure Storage Queues work using a
Peek-Lock model to overcome the lack of transactions. When an endpoint instance pulls a message from a queue, it is marked as invisible for a specified time. The endpoint instance has to process the messages in a well defined timeframe and delete it explicitly when done. When the message is not processed within the pre-defined time, a.k.a. Invisibility Timeout, the message will become visible on the queue and another endpoint instance can access it. Depending on the selected
TransportTransactionMode, the transport deletes a message after processing (
at-least-once) or before processing (