dotnet / dotnet/orleans

Support Garnet as a replacement for Redis with Aspire/ServiceDiscovery

Open
#9,848 9 comments 1 reaction 0 assignees View on GitHub
Dominant language
C#
Stars
10.9k
Forks
2.1k
Avg merge
14h 42m
Merged PRs (30d)
354

Description

When using Garnet with Aspire like

```cs
var redis = builder.AddGarnet("redis");

var orleans = builder.AddOrleans("demo")
.WithClustering(redis);
// etc.
```

and referencing `Aspire.StackExchange.Redis` in the Orleans project, where I call

```cs
builder.AddKeyedRedisClient("redis");
```

I get the exception

> Unhandled exception. System.InvalidOperationException: Could not find Clustering provider named 'Garnet'. This can indicate that either the 'Microsoft.Orleans.Sdk' or the provider's package are not referenced by your application.

because the environment variable `Orleans__Clustering__ProviderType` is set to `Garnet`.

For me it looks like there's "just"™️ the `RegisterProviderAttribute` missing in
- `RedisClusteringProviderBuilder`
- `RedisRemindersProviderBuilder`
- `RedisGrainStorageProviderBuilder`
- `RedisGrainDirectoryProviderBuilder`

There's already another attribute for the provider type `"AzureRedisCache"`. So maybe adding another one for `"Garnet"` would be enough?
And should Valkey be added, too?

Or is there another way to override the `ProviderType` of Garnet as `"Redis"`?

```diff
diff --git a/src/Redis/Orleans.Clustering.Redis/Hosting/RedisClusteringProviderBuilder.cs b/src/Redis/Orleans.Clustering.Redis/Hosting/RedisClusteringProviderBuilder.cs
index ab77727f1..2a1dc5e3c 100644
--- a/src/Redis/Orleans.Clustering.Redis/Hosting/RedisClusteringProviderBuilder.cs
+++ b/src/Redis/Orleans.Clustering.Redis/Hosting/RedisClusteringProviderBuilder.cs
@@ -11,9 +11,11 @@

[assembly: RegisterProvider("Redis", "Clustering", "Silo", typeof(RedisClusteringProviderBuilder))]
[assembly: RegisterProvider("AzureRedisCache", "Clustering", "Silo", typeof(RedisClusteringProviderBuilder))]
+[assembly: RegisterProvider("Garnet", "Clustering", "Silo", typeof(RedisClusteringProviderBuilder))]

[assembly: RegisterProvider("Redis", "Clustering", "Client", typeof(RedisClusteringProviderBuilder))]
[assembly: RegisterProvider("AzureRedisCache", "Clustering", "Client", typeof(RedisClusteringProviderBuilder))]
+[assembly: RegisterProvider("Garnet", "Clustering", "Client", typeof(RedisClusteringProviderBuilder))]

namespace Orleans.Clustering.Redis.Hosting;

diff --git a/src/Redis/Orleans.GrainDirectory.Redis/Hosting/RedisGrainDirectoryProviderBuilder.cs b/src/Redis/Orleans.GrainDirectory.Redis/Hosting/RedisGrainDirectoryProviderBuilder.cs
index 4981fa791..df4beec59 100644
--- a/src/Redis/Orleans.GrainDirectory.Redis/Hosting/RedisGrainDirectoryProviderBuilder.cs
+++ b/src/Redis/Orleans.GrainDirectory.Redis/Hosting/RedisGrainDirectoryProviderBuilder.cs
@@ -11,6 +11,7 @@

[assembly: RegisterProvider("Redis", "GrainDirectory", "Silo", typeof(RedisGrainDirectoryProviderBuilder))]
[assembly: RegisterProvider("AzureRedisCache", "GrainDirectory", "Silo", typeof(RedisGrainDirectoryProviderBuilder))]
+[assembly: RegisterProvider("Garnet", "GrainDirectory", "Silo", typeof(RedisGrainDirectoryProviderBuilder))]

namespace Orleans.Hosting;

diff --git a/src/Redis/Orleans.Persistence.Redis/Hosting/RedisGrainStorageProviderBuilder.cs b/src/Redis/Orleans.Persistence.Redis/Hosting/RedisGrainStorageProviderBuilder.cs
index 43447fe16..052a77a5e 100644
--- a/src/Redis/Orleans.Persistence.Redis/Hosting/RedisGrainStorageProviderBuilder.cs
+++ b/src/Redis/Orleans.Persistence.Redis/Hosting/RedisGrainStorageProviderBuilder.cs
@@ -12,6 +12,7 @@

[assembly: RegisterProvider("Redis", "GrainStorage", "Silo", typeof(RedisGrainStorageProviderBuilder))]
[assembly: RegisterProvider("AzureRedisCache", "GrainStorage", "Silo", typeof(RedisGrainStorageProviderBuilder))]
+[assembly: RegisterProvider("Garnet", "GrainStorage", "Silo", typeof(RedisGrainStorageProviderBuilder))]

namespace Orleans.Hosting;

diff --git a/src/Redis/Orleans.Reminders.Redis/Hosting/RedisRemindersProviderBuilder.cs b/src/Redis/Orleans.Reminders.Redis/Hosting/RedisRemindersProviderBuilder.cs
index 974750460..15fa80288 100644
--- a/src/Redis/Orleans.Reminders.Redis/Hosting/RedisRemindersProviderBuilder.cs
+++ b/src/Redis/Orleans.Reminders.Redis/Hosting/RedisRemindersProviderBuilder.cs
@@ -10,6 +10,7 @@

[assembly: RegisterProvider("Redis", "Reminders", "Silo", typeof(RedisRemindersProviderBuilder))]
[assembly: RegisterProvider("AzureRedisCache", "Reminders", "Silo", typeof(RedisRemindersProviderBuilder))]
+[assembly: RegisterProvider("Garnet", "Reminders", "Silo", typeof(RedisRemindersProviderBuilder))]

namespace Orleans.Hosting;
```

Contributor guide

Open the contributing guide

Research direction

Start by reviewing the existing RegisterProvider attributes in RedisClusteringProviderBuilder.cs, RedisRemindersProviderBuilder.cs, RedisGrainStorageProviderBuilder.cs, and RedisGrainDirectoryProviderBuilder.cs. Compare the Redis and AzureRedisCache registrations and determine whether Garnet, and possibly Valkey, should be registered for the same provider roles. Done means Garnet no longer fails provider discovery when configured through Aspire/ServiceDiscovery.

Written by the indexing model from the issue text.

Assessment

Tech stack
csharp, redis
Domain
distributed-systems
Issue type
Feature
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.