> For the complete documentation index, see [llms.txt](https://brightercommand.gitbook.io/paramore-brighter-documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://brightercommand.gitbook.io/paramore-brighter-documentation/outbox-and-inbox/distributedlock/azureblobdistributedlock.md).

# Azure Blob Distributed Lock

The Azure Blob locking provider implements Brighter's [distributed lock](/paramore-brighter-documentation/outbox-and-inbox/distributedlock.md) using **blob leases** in Azure Blob Storage, so a single [Outbox Sweeper](/paramore-brighter-documentation/outbox-and-inbox/brighteroutboxsupport.md#implicit-clear) and Archiver run when you scale out. It is a good choice when your workloads already run on Azure.

## Package

* **Paramore.Brighter.Locking.Azure**

The provider takes a lease on a blob inside a container that you must create in advance — see [Provisioning](#provisioning).

## Configuration

Configure the provider with `AzureBlobLockingProvider`, passing an `AzureBlobLockingProviderOptions`. The options constructor takes the container URI and a `TokenCredential`:

```csharp
new AzureBlobLockingProvider(
    new AzureBlobLockingProviderOptions(
        blobContainerUri: new Uri("https://myaccount.blob.core.windows.net/brighter-locks"),
        tokenCredential: new DefaultAzureCredential()));
```

| Setting               | Type                   | Default                          | Description                                                                                                   |
| --------------------- | ---------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `BlobContainerUri`    | `Uri`                  | *(required)*                     | The URI of the blob container that holds the lock blobs.                                                      |
| `TokenCredential`     | `TokenCredential`      | *(required)*                     | The Azure credential used to authenticate, for example `DefaultAzureCredential`.                              |
| `LeaseValidity`       | `TimeSpan`             | 1 minute                         | How long the blob lease is held before it expires automatically. Set it longer than a Sweeper/Archiver cycle. |
| `StorageLocationFunc` | `Func<string, string>` | `resource => $"lock-{resource}"` | Maps a resource name to the blob name used for its lock.                                                      |

## Example

```csharp
services
    .AddBrighter()
    .AddProducers(opt =>
    {
        opt.Outbox = /* your external Outbox */;
        // ... connection/transaction providers for your Outbox ...

        opt.DistributedLock = new AzureBlobLockingProvider(
            new AzureBlobLockingProviderOptions(
                new Uri("https://myaccount.blob.core.windows.net/brighter-locks"),
                new DefaultAzureCredential())
            {
                LeaseValidity = TimeSpan.FromMinutes(2)
            });
    })
    .UseOutboxSweeper(opt => { opt.BatchSize = 10; });
```

## Provisioning

Create the blob container referenced by `BlobContainerUri` before the provider runs. The provider creates the per-resource lock blobs (named by `StorageLocationFunc`) inside that container as needed; it does not create the container itself. Grant the `TokenCredential` permission to read, write, and lease blobs in the container.

## Notes

* Keep `LeaseValidity` longer than a typical Sweeper or Archiver batch so the lease does not expire mid-run. See [Lease Expiry vs Manual Release](/paramore-brighter-documentation/outbox-and-inbox/distributedlock.md#lease-expiry-vs-manual-release).
* If the holding instance crashes, the blob lease expires after `LeaseValidity` and another instance can take over on a later cycle.

## Further Reading

* [Distributed Lock](/paramore-brighter-documentation/outbox-and-inbox/distributedlock.md) — concepts and the full provider list
* [Outbox Support](/paramore-brighter-documentation/outbox-and-inbox/brighteroutboxsupport.md) — the Sweeper and Archiver


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://brightercommand.gitbook.io/paramore-brighter-documentation/outbox-and-inbox/distributedlock/azureblobdistributedlock.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
