You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Aspire AppHost实现Orleans 9的SQL Server集群?

Aspire 9 + Orleans 9 配置SQL Server集群与存储问题解决

问题背景

使用Aspire 9搭建基于Orleans 9的项目,采用SQL Server实现集群,但无法在AppHost中正确配置Orleans集群提供程序。当前配置代码如下:

IResourceBuilder<SqlServerServerResource> sqlServer = builder.AddSqlServer("sql-server")
//...

IResourceBuilder<SqlServerDatabaseResource> sqlDb = sqlServer.AddDatabase("orleans-db");

//...orleans db migration scripts

OrleansService orleans = builder.AddOrleans("orleans-cluster")
    .WithClustering(provider1)  // 此处参数未知
    .WithGrainStorage("Default", provider2) // 此处参数未知
    ;

builder.AddProject<Projects.DataProcessor>("silo")
    .WithReference(orleans)
    .WithReference(sqlServer);

排查发现:

  • Orleans.Clustering.AdoNet中的AdoNetClusteringProviderBuilder未在GetRegisteredProviders中注册,不同于RedisClusteringProviderBuilder
  • 已引用Orleans.Clustering.AdoNet和Orleans.Persistence.AdoNet,但GetRelevantAssemblies未加载这两个程序集,仅成功加载Orleans.Streaming.AdoNet
  • Orleans.Streaming.AdoNet带有[assembly: ApplicationPart("Orleans.Streaming.AdoNet")]特性,而前两者缺失该特性

解决方案

1. 正确配置Clustering与GrainStorage

由于AdoNet提供程序未被Aspire自动注册,需手动传入配置委托,直接使用SQL Server连接字符串:

// 获取SQL数据库的连接字符串
var connectionString = sqlDb.GetConnectionString();

OrleansService orleans = builder.AddOrleans("orleans-cluster")
    // 配置SQL Server集群
    .WithClustering(clusterBuilder => clusterBuilder.AdoNet(options =>
    {
        options.ConnectionString = connectionString;
        options.Invariant = "Microsoft.Data.SqlClient"; // SQL Server的标准Invariant名称
    }))
    // 配置SQL Server默认Grain存储
    .WithGrainStorage("Default", storageBuilder => storageBuilder.AdoNet(options =>
    {
        options.ConnectionString = connectionString;
        options.Invariant = "Microsoft.Data.SqlClient";
    }));

2. 修复程序集未加载问题

因为Orleans.Clustering.AdoNet和Orleans.Persistence.AdoNet缺少ApplicationPart特性,导致Aspire无法自动发现,可通过以下两种方式解决:

方式一:手动加载程序集

在AppHost的Program.cs开头添加程序集加载代码:

// 在创建DistributedApplicationBuilder之前执行
System.Reflection.Assembly.Load("Orleans.Clustering.AdoNet");
System.Reflection.Assembly.Load("Orleans.Persistence.AdoNet");

var builder = DistributedApplication.CreateBuilder(args);
// 后续配置代码...

方式二:添加ApplicationPart特性

在AppHost项目的任意代码文件(如AssemblyInfo.cs)中添加特性声明:

[assembly: Orleans.ApplicationPart("Orleans.Clustering.AdoNet")]
[assembly: Orleans.ApplicationPart("Orleans.Persistence.AdoNet")]

3. 确保数据库迁移完成

执行Orleans针对SQL Server的迁移脚本,创建集群管理和Grain存储所需的表。脚本可从Orleans官方资源获取,或通过Orleans.Clustering.AdoNet包提供的工具生成。


内容的提问来源于stack exchange,提问作者Igor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:37:23