NServiceBus offers four levels of consistency guarantees with regards to message processing, depending on the selected transport. The default consistency level is TransactionScope (Distributed Transaction), but a different level can be specified using code configuration API.
See the Transports Transactions article to learn more about NServiceBus consistency guarantees.
TransactionScope timeout limit is 1 minute. This limit can be adjusted up to the machine-wide maximum timeout value. The machine-wide maximum is 10 minutes by default, but it can be adjusted if needed.
In Windows, the Distributed Transaction Coordinator (DTC) is an OS-level service which manages transactions that span multiple resources, e.g. queues and databases.
The DTCPing tool is useful for verifying that the DTC service is configured correctly, as well as for troubleshooting:
For more information, refer to the Troubleshooting MSDTC issues with the DTCPing tool article on MSDN.
DTCPing WARNING: The CID Values for Both Test Machines Are the Same message appears when running the DTCPing tool, check to see if the machine name is longer than 14 characters. For DTCPing and MSDTC to work, the machine name should be 14 characters or shorter.
Messages are processed in NServiceBus in the following steps:
- The queue is peeked to see if there is a message.
- If there's a message then a transaction is started.
- The queue is contacted again to receive a message, multiple threads may have peeked the same message. The queue makes sure only one thread actually gets a given message.
- If the thread is able to get it, NServiceBus tries to deserialize the message. If it fails, the message moves to the configured error queue and the transaction commits.
- After a successful deserialization, NServiceBus invokes all infrastructure, message mutators, and handlers. An exception in this step causes the transaction to roll back and the message to return to the input queue. The message will be re-sent for a configured number of times; if all attempts fail then it will be moved to the error queue.
Refer to the Message Handling Pipeline article to learn more about message processing.