Support Garnet as a replacement for Redis with Aspire/ServiceDiscovery
- 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
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