Certain features of NServiceBus require persistence to permanently store data. Among them are subscription storage, sagas, and outbox. Various storage options are available including Azure Table and Azure Cosmos DB Table API.
For a description of each feature, see the persistence at a glance legend.
|Supported storage types||Sagas, Outbox, Subscriptions|
|Transactions||Using TransactionalBatch, with caveats|
|Concurrency control||Optimistic concurrency|
|Scripted deployment||Not supported|
|Installers||Supported. Subscription, the default table or saga tables derived by convention when no default table is set are created at runtime, when enabled.|
First add a reference to the assembly that contains the Azure Table persistence, which is done by adding a NuGet package reference to
var persistence = endpointConfiguration.UsePersistence<AzureTablePersistence>(); persistence.ConnectionString("DefaultEndpointsProtocol=https;AccountName=[ACCOUNT];AccountKey=[KEY];");
The Azure Table persister supports using the Azure Table TableBatchOperation API. However, Azure Table only allows operations to be batched if all operations are performed within the same partition key. This is due to the distributed nature of the Azure Table service, which does not support distributed transactions.
The transactions documentation provides additional details on how to configure NServiceBus to resolve the incoming message to a specific partition key to take advantage of this Azure Table feature.
When simultaneously handling messages, conflicts may occur. See below for examples of the exceptions which are thrown. Saga concurrency explains how these conflicts are handled, and contains guidance for high-load scenarios.
Azure Table Persistence uses optimistic concurrency control when updating or deleting saga data.
Microsoft.WindowsAzure.Storage.StorageException: Element 0 in the batch returned an unexpected response code. Request Information RequestID:010c234e-3002-0145-06eb-72b85a000000 RequestDate:Tue, 24 Sep 2019 15:16:45 GMT StatusMessage:The update condition specified in the request was not satisfied. ErrorCode: ErrorMessage:The update condition specified in the request was not satisfied. RequestId:010c234e-3002-0145-06eb-72b85a000000 Time:2019-09-24T15:16:46.0746310Z
Azure Table Persistence supports same set of types as Azure Table Storage and additional types that can be serialized into JSON. When a saga containing a property of an unsupported type is persisted, an exception containing the following information is thrown:
The property type 'the_property_name' is not supported on Azure Table Storage and it cannot be serialized with JSON..
Saga correlation property values are subject to the underlying Azure Storage table
- Up to 1KB in size
- Cannot contain invalid characters