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

如何配置TestClusterBuilder使测试集群可访问SMSProvider?

解决Orleans测试集群找不到SMSProvider的问题

你碰到的KeyNotFoundException核心原因很明确:你只在Silo集群侧配置了SMSProvider,但客户端(Client)这边完全没注册这个Stream Provider。Orleans的Stream Provider要求Silo和Client两端都要配置一致的Provider,否则客户端根本不知道这个Provider的存在,自然会抛出找不到的错误。

下面是修复后的完整ClusterFixture代码,我添加了客户端的配置逻辑:

public class ClusterFixture : IDisposable
{
    // Silo端的配置器,保留原有逻辑
    private sealed class SiloConfigurator : ISiloBuilderConfigurator
    {
        public void Configure(ISiloHostBuilder siloBuilder)
        {
            siloBuilder.AddSimpleMessageStreamProvider("SMSProvider");
            siloBuilder.AddMemoryGrainStorage("PubSubStore");
        }
    }

    // 新增:客户端配置器,注册与Silo一致的SMSProvider
    private sealed class ClientConfigurator : IClientBuilderConfigurator
    {
        public void Configure(IConfiguration configuration, IClientBuilder clientBuilder)
        {
            clientBuilder.AddSimpleMessageStreamProvider("SMSProvider");
        }
    }

    public ClusterFixture()
    {
        var builder = new TestClusterBuilder();
        // 注册Silo配置器
        builder.AddSiloBuilderConfigurator<SiloConfigurator>();
        // 注册客户端配置器
        builder.AddClientBuilderConfigurator<ClientConfigurator>();
        this.Cluster = builder.Build();
        this.Cluster.Deploy();
    }

    public void Dispose()
    {
        this.Cluster.StopAllSilos();
    }

    public TestCluster Cluster { get; private set; }
}

为什么这能解决问题?

当你调用_cluster.Client.GetStreamProvider("SMSProvider")时,是在客户端层面请求这个Provider实例。如果客户端没有预先注册该Provider,Orleans客户端的服务容器中就没有对应的实例,必然会抛出找不到的异常。通过添加IClientBuilderConfigurator并在其中注册SMSProvider,客户端会与Silo端保持一致的配置,就能正常获取到这个Stream Provider了。

修改后再运行你的测试,KeyNotFoundException应该就会消失,你可以继续验证Stream的相关业务逻辑了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:18:14