如何 运行 Microsoft Orleans Silo 和客户端在同一个 AppDomain 中

How to run Microsoft Orleans Silo and Client in the same AppDomain

我想要完成的只是:运行 筒仓和客户端在同一个 AppDomain

使用 Orleans 的教程一切顺利:

static void Main(string[] args)
{
    AppDomain hostDomain = AppDomain.CreateDomain("OrleansHost", null,
        new AppDomainSetup()
        {
            AppDomainInitializer = InitSilo
        });

    DoSomeClientWork();

    hostDomain.DoCallBack(ShutdownSilo);
}

static void InitSilo(string[] args)
{
    siloHost = new SiloHost(System.Net.Dns.GetHostName())
    {
        ConfigFileName = "SiloConfiguration.xml"
    };

    siloHost.InitializeOrleansSilo();
    var startedok = siloHost.StartOrleansSilo(); //Works perfectly
    if (!startedok)
        throw new SystemException(String.Format("Failed to start Orleans silo '{0}' as a {1} node", siloHost.Name, siloHost.Type));
}

static void DoSomeClientWork()
{
    var config = Orleans.Runtime.Configuration.ClientConfiguration.LocalhostSilo(30000);
    GrainClient.Initialize(config);

    var friend = GrainClient.GrainFactory.GetGrain<IHello>(0);
    var result = friend.SayHello("Goodbye").Result;
    Console.WriteLine(result);
}

当我想使用相同的 AppDomain 时出现问题:

static void Main(string[] args)
{
    //Same AppDomain
    Task.Run(() => InitSilo());
    DoSomeClientWork(); //This is changed to await/retry until the Silo is Up

    ShutdownSilo();
}

为什么我要尝试遵循这条路径: 这个想法是为了防止客户端通过网络进出,因为它们是 运行在同一台机器上。由于网络 activity,这会产生开销。 所以我试图避免这种开销。

当然,如果本地 Silo 出现故障,客户端必须通过网络外出才能找到可用的 silo。

让事情变得太复杂的事实是我看不到任何有用的错误,只有错误和一些 lib reference not found 错误。

The original code was simplified just to avoid get it dirty, but if you feel like you need to see what I've done so far, just let me know. Any help, recommendation or suggestion is useful.

如果您升级到 Orleans 1.5.0,您应该能够实现这一目标,因为删除了很多静态信息。您还应该直接使用 ClientBuilder 和 IClusterClient 而不是静态 GrainClient 来工作。事实上,升级到 1.5.0 后,VS 中的默认模板不再为 client/silo 主机使用单独的 AppDomains。

话虽如此,即使在同一个 AppDomain 下,目前也没有完全跳过网络代码的内置支持,但我们正处于开始支持它的计划阶段。目前的想法是您仍然使用 IClusterClient 抽象,但在幕后,我们将通过不做任何额外的网络来做一些更聪明的事情。因此,即使尚未优化,开始使用它也是最安全的选择。