Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
affe275
feat(aspire): integrate Azure and Redis providers
ReubenBond Aug 23, 2026
a1d4bbd
feat(aws): integrate DynamoDB providers with Aspire
ReubenBond Aug 23, 2026
a057b55
feat(streaming): add Kinesis Aspire configuration
ReubenBond Aug 23, 2026
84fd587
feat(adonet): integrate Aspire database resources
ReubenBond Aug 23, 2026
5a6a915
feat(streaming): integrate NATS with Aspire
ReubenBond Aug 23, 2026
84a4710
docs(aspire): add provider integration matrix
ReubenBond Aug 23, 2026
baded3e
test(aws): cover DynamoDB Aspire integration
ReubenBond Aug 23, 2026
f281b18
fix(streaming): preserve explicit Kinesis configuration
ReubenBond Aug 23, 2026
c492edf
fix(aspire): validate generated provider configuration
ReubenBond Aug 23, 2026
679f6c1
fix(test): configure DynamoDB Aspire live hosts
ReubenBond Aug 23, 2026
1253b93
fix(cosmos): improve Aspire connection errors
ReubenBond Aug 23, 2026
2829c47
fix(streaming): use durable Aspire state stores
ReubenBond Aug 23, 2026
005af8a
fix(aspire): harden generated configuration parsing
ReubenBond Aug 24, 2026
e7f5b61
fix(test): normalize null Aspire environment values
ReubenBond Aug 24, 2026
c78827d
fix(test): use runtime file storage
ReubenBond Aug 25, 2026
3e78ca5
fix(providers): harden Aspire configuration handling
ReubenBond Aug 25, 2026
4f3f14a
feat(aws): model DynamoDB Aspire topology with CDK
ReubenBond Aug 25, 2026
ef93f43
feat(streaming): model Kinesis Aspire with AWS CDK
ReubenBond Aug 25, 2026
5e86da2
fix(streaming): preserve Kinesis CDK identity
ReubenBond Aug 25, 2026
38db80c
test(streaming): cover Kinesis Aspire recovery
ReubenBond Aug 25, 2026
de52671
fix(streaming): stabilize Kinesis Aspire CI
ReubenBond Aug 25, 2026
a3cb2eb
test(aspire): propagate test cancellation
ReubenBond Aug 28, 2026
e45751d
fix(test): import Orleans test attributes
ReubenBond Aug 28, 2026
19c78ab
fix(aws): preserve DynamoDB provider defaults
ReubenBond Sep 3, 2026
1186b86
fix(providers): restore required imports
ReubenBond Sep 3, 2026
e9c11df
fix(aws): preserve DynamoDB validation diagnostics
ReubenBond Sep 3, 2026
33135a0
fix(aws): validate DynamoDB grain storage service
ReubenBond Sep 3, 2026
2973b17
test(aws): propagate reminder cancellation
ReubenBond Sep 4, 2026
c27c5d4
style(test): format DynamoDB provider tests
ReubenBond Sep 4, 2026
378ab5d
fix(aspire): validate ADO.NET stream partitions
ReubenBond Sep 4, 2026
23129e1
fix(cosmos): clarify missing keyed reminder client
ReubenBond Sep 4, 2026
1a64f27
fix(aspire): validate provider lifecycle configuration
ReubenBond Sep 5, 2026
f469095
fix(aws): use async membership APIs in Aspire test
ReubenBond Sep 14, 2026
9dc897d
fix(aspire): improve provider configuration diagnostics
ReubenBond Sep 15, 2026
6854928
fix(aspire): preserve explicit DynamoDB alias precedence
ReubenBond Sep 16, 2026
3fc1e97
refactor(aspire): separate standalone provider fixes
ReubenBond Sep 17, 2026
378a256
fix(aspire): validate provider connection references
ReubenBond Sep 17, 2026
3f4aee9
fix(aspire): preserve merged NATS validation
ReubenBond Sep 17, 2026
16bd40f
refactor(aspire): use named Journaling configuration
ReubenBond Sep 17, 2026
dfd444b
test(aspire): register configuration in provider fixtures
ReubenBond Sep 17, 2026
ed8ef88
fix(aspire): authenticate Kinesis emulator endpoints
ReubenBond Sep 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<PackageVersion Include="Aspire.Azure.Data.Tables" Version="13.0.0" />
<PackageVersion Include="Aspire.Azure.Storage.Blobs" Version="13.0.0" />
<PackageVersion Include="Aspire.Azure.Storage.Queues" Version="13.0.0" />
<PackageVersion Include="Aspire.Microsoft.Azure.Cosmos" Version="13.0.0" />
<PackageVersion Include="Aspire.Hosting.AppHost" Version="13.1.1" />
<PackageVersion Include="Aspire.Hosting.Orleans" Version="13.1.1" />
<PackageVersion Include="Aspire.Hosting.Redis" Version="13.1.1" />
Expand Down Expand Up @@ -133,12 +134,21 @@
<PackageVersion Update="Aspire.Azure.Data.Tables" Version="13.2.4" />
<PackageVersion Update="Aspire.Azure.Storage.Blobs" Version="13.2.4" />
<PackageVersion Update="Aspire.Azure.Storage.Queues" Version="13.2.4" />
<PackageVersion Update="Aspire.Microsoft.Azure.Cosmos" Version="13.2.4" />
<PackageVersion Update="Aspire.Hosting.AppHost" Version="13.2.4" />
<PackageVersion Include="Aspire.Hosting.Azure.CosmosDB" Version="13.2.4" />
<PackageVersion Include="Aspire.Hosting.Azure.EventHubs" Version="13.2.4" />
<PackageVersion Include="Aspire.Hosting.Azure.Redis" Version="13.2.4" />
<PackageVersion Include="Aspire.Hosting.Azure.Storage" Version="13.2.4" />
<PackageVersion Include="Aspire.Hosting.MySql" Version="13.2.4" />
<PackageVersion Include="Aspire.Hosting.Nats" Version="13.2.4" />
<PackageVersion Include="Aspire.Hosting.Oracle" Version="13.2.4" />
<PackageVersion Update="Aspire.Hosting.Orleans" Version="13.2.4" />
<PackageVersion Include="Aspire.Hosting.PostgreSQL" Version="13.2.4" />
<PackageVersion Update="Aspire.Hosting.Redis" Version="13.2.4" />
<PackageVersion Include="Aspire.Hosting.SqlServer" Version="13.2.4" />
<PackageVersion Include="Aspire.Hosting.Testing" Version="13.2.4" />
<PackageVersion Include="Aspire.NATS.Net" Version="13.2.4" />
<PackageVersion Update="Aspire.StackExchange.Redis" Version="13.2.4" />
<PackageVersion Update="BenchmarkDotNet" Version="0.15.6" />
<PackageVersion Update="FSharp.Core" Version="10.0.103" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Azure Cosmos DB grain persistence
description: Configure Azure Cosmos DB for NoSQL as an Orleans grain storage provider.
ms.date: 08/02/2026
ms.date: 08/23/2026
ms.topic: how-to
---

Expand All @@ -18,6 +18,18 @@ Configure a named provider with <xref:Orleans.Hosting.HostingExtensions.AddCosmo
:::code language="csharp" source="../../snippets/compiled/Grains/PersistenceSnippets.cs" id="configure_cosmos_storage":::
<xref:Orleans.Persistence.Cosmos.CosmosOptions.DatabaseName> defaults to `Orleans`, <xref:Orleans.Persistence.Cosmos.CosmosOptions.ContainerName> defaults to `OrleansStorage`, and <xref:Orleans.Persistence.Cosmos.CosmosGrainStorageOptions.PartitionKeyPath> defaults to `/PartitionKey`. Provision the database and container before startup when <xref:Orleans.Persistence.Cosmos.CosmosOptions.IsResourceCreationEnabled> is `false`. Enabling resource creation is convenient for development but production provisioning is usually managed separately.

## Use with Aspire

Reference the Azure Cosmos DB account resource from Orleans so Aspire emits the `AzureCosmosDB` provider type and a keyed Cosmos client. Declare the database and containers as child resources to provision the provider topology:

:::code language="csharp" source="../../host/snippets/aspire/AppHost/AppHostExamples.cs" id="cosmos_providers_aspire":::

Register the keyed client in the silo before Orleans reads the generated clustering, storage, and reminder configuration:

:::code language="csharp" source="../../host/snippets/aspire/Silo/SiloProgram.cs" id="cosmos_providers_silo":::

The clustering container uses `/ClusterId`; grain storage and reminders use `/PartitionKey`. Keep the AppHost container names aligned with the Orleans configuration supplied to each provider.

## Partitioning and indexing

The <xref:Orleans.Persistence.Cosmos.DefaultDocumentIdProvider> derives the document ID and partition key for each grain record. To customize either value, implement <xref:Orleans.Persistence.Cosmos.IDocumentIdProvider> and register it using the generic <xref:Orleans.Hosting.HostingExtensions.AddCosmosGrainStorage*?displayProperty=nameWithType> overload.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Azure Storage grain persistence
description: Configure Azure Table Storage or Azure Blob Storage for Orleans grain state.
ms.date: 08/02/2026
ms.date: 08/23/2026
ms.topic: how-to
---

Expand Down Expand Up @@ -37,6 +37,18 @@ Connection strings are useful for local emulators and constrained environments,

Use a secret store when a connection string is unavoidable.

## Use with Aspire

Aspire can provision the storage account and emit Orleans configuration for Azure Table clustering, grain storage, reminders, grain directories, Azure Blob grain storage, and Azure Queue streaming:

:::code language="csharp" source="../../host/snippets/aspire/AppHost/AppHostExamples.cs" id="azure_storage_providers_aspire":::

Register keyed Azure SDK clients with the resource names used by the AppHost. Orleans provider builders consume those clients through the emitted `ServiceKey` values:

:::code language="csharp" source="../../host/snippets/aspire/Silo/SiloProgram.cs" id="azure_storage_providers_silo":::

Aspire provisions the account and declared blob containers or queues. Orleans creates its configured tables and grain-state blob container during provider initialization when the selected provider enables resource creation.

## Operational guidance

- Use separate provider names when records belong in different accounts, containers, or tables.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ The [AWS SDK for .NET credential and profile resolution chain](https://docs.aws.

<xref:Orleans.Configuration.DynamoDBStorageOptions.ServiceId> must remain stable across deployments that share the same logical application state. The provider uses optimistic concurrency and rejects stale writes.

For Aspire AppHost configuration, DynamoDB Local, and structured AWS CDK or CloudFormation outputs, see [Use Amazon DynamoDB with Aspire](../../host/dynamodb-aspire).

## Serialization

Set <xref:Orleans.Configuration.DynamoDBStorageOptions.GrainStorageSerializer> to customize the stored representation. Changing serializers doesn't rewrite existing items, so the replacement must read the previous representation or be accompanied by a migration.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Redis grain persistence
description: Configure Redis as an Orleans grain storage provider.
ms.date: 08/07/2026
ms.date: 08/23/2026
ms.topic: how-to
---

Expand All @@ -17,6 +17,18 @@ Configure a provider with <xref:Orleans.Hosting.RedisSiloBuilderExtensions.AddRe

The provider name must match the storage name in `[PersistentState]`.

## Use with Aspire

Aspire can model either a Redis container or Azure Managed Redis. The same resource can supply clustering, grain storage, reminders, and grain directories:

:::code language="csharp" source="../../host/snippets/aspire/AppHost/AppHostExamples.cs" id="redis_providers_aspire":::

Register the keyed StackExchange.Redis client named by the AppHost resource:

:::code language="csharp" source="../../host/snippets/aspire/Silo/SiloProgram.cs" id="redis_providers_silo":::

The Orleans Redis packages recognize the `Redis`, `AzureRedisCache`, and `AzureManagedRedis` provider aliases emitted by first-party Aspire resources.

## Configure the default provider

Use <xref:Orleans.Hosting.RedisSiloBuilderExtensions.AddRedisGrainStorageAsDefault*> when grains should use Redis without specifying a storage name:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Azure Storage providers for Journaling
description: Configure Azure Blob Storage or Azure Table Storage for experimental Orleans Journaling.
ms.date: 08/21/2026
ms.date: 08/23/2026
ms.topic: how-to
---

Expand All @@ -28,6 +28,14 @@ Granting only read access prevents successful draining. See
[Migrate Durable Jobs storage](durable-jobs-migration.md) for the staged rollout,
full inventory, and retirement criteria.

## Use with Aspire

Aspire injects the Azure Storage connection and keyed SDK client. Configure the journaling provider section explicitly in the silo resource:

:::code language="csharp" source="../../host/snippets/aspire/AppHost/AppHostExamples.cs" id="azure_table_journaling_aspire":::

The example activates Azure Table journal storage. Use `AzureBlobStorage` as `ProviderType`, reference the blob resource service key, and register the corresponding keyed <xref:Azure.Storage.Blobs.BlobServiceClient> to activate Azure Blob journal storage.

## Azure Blob Storage

Configure <xref:Orleans.Journaling.AzureBlobStorageHostingExtensions.AddAzureBlobJournalStorage*> with an authenticated <xref:Azure.Storage.Blobs.BlobServiceClient>:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Redis journal storage
description: Configure Redis as a storage provider for experimental Orleans Journaling durable state.
ms.date: 08/21/2026
ms.date: 08/23/2026
ms.topic: how-to
---

Expand Down Expand Up @@ -37,6 +37,14 @@ inventory is an observation rather than a transactionally frozen cluster view.
Follow [Migrate Durable Jobs storage](durable-jobs-migration.md), including
repeated complete inventories after all scheduling silos have cut over.

## Use with Aspire

Aspire injects the Redis connection and keyed client. Configure the journaling provider section explicitly in the silo resource:

:::code language="csharp" source="../../host/snippets/aspire/AppHost/AppHostExamples.cs" id="redis_journaling_aspire":::

The silo registers the `orleans-redis` keyed client before `UseOrleans`, as shown in the [Redis provider silo example](../grain-persistence/redis-storage.md#use-with-aspire). Orleans then activates the default Redis journal storage binding from `Orleans:Journaling:Default`.

## Storage behavior

The provider stores journal data in Redis strings and journal metadata in Redis hashes. Per-journal reads and mutations use atomic Lua scripts. Catalog operations discover journals by scanning metadata keys on each connected primary Redis server.
Expand Down
2 changes: 2 additions & 0 deletions docs/site/src/content/docs/grains/reminders/dynamodb.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,5 @@ When <xref:Orleans.Reminders.DynamoDB.DynamoDBClientOptions.AccessKey> and <xref
The example uses on-demand capacity and an infrastructure-managed table. Set <xref:Orleans.Configuration.DynamoDBReminderStorageOptions.UseProvisionedThroughput> to `true` and configure <xref:Orleans.Configuration.DynamoDBReminderStorageOptions.ReadCapacityUnits> and <xref:Orleans.Configuration.DynamoDBReminderStorageOptions.WriteCapacityUnits> for provisioned capacity.

<xref:Orleans.Configuration.DynamoDBReminderStorageOptions.CreateIfNotExists> and <xref:Orleans.Configuration.DynamoDBReminderStorageOptions.UpdateIfExists> allow the provider to create the reminder table and update its provisioned capacity. Infrastructure-managed provisioning keeps table lifecycle and capacity changes in the deployment workflow.

For Aspire AppHost configuration, DynamoDB Local, and structured AWS CDK or CloudFormation outputs, see [Use Amazon DynamoDB with Aspire](../../host/dynamodb-aspire).
Loading
Loading