我可以将 Orleans 用于进程中的 actors / grains 吗?

Can I use Orleans for in process actors / grains?

我正在玩 Orleans,但我不依赖于网络和端点配置,而是希望能够在下面的代码中处理谷物:

public interface IGreeter : IActorGrain
{
}

public class Greeter : DispatchActorGrain, IGreeter
{
    void On(Greet msg) => WriteLine($"Hello, {msg.Who}");
}

[SerializableAttribute]
public class Greet
{
    public string Who { get; set; }
}

public static class Program
{
    public static async Task Main()
    {
        WriteLine("Running example. Booting cluster might take some time ...\n");

        var host = new SiloHostBuilder()
            .Configure<ClusterOptions>(options =>
            {
                options.ClusterId = "localhost-demo";
                options.ServiceId = "localhost-demo-service";
            })
            .Configure<SchedulingOptions>(options =>
            {
                options.AllowCallChainReentrancy = false;
            })
            .Configure<SiloMessagingOptions>(options =>
            {
                options.ResponseTimeout = TimeSpan.FromSeconds(5);
                options.ResponseTimeoutWithDebugger = TimeSpan.FromSeconds(5);
            })
            .ConfigureLogging(logging =>
            {
                logging.SetMinimumLevel(LogLevel.Information);
                logging.AddConsole();
            })
            .UseDevelopmentClustering(options => options.PrimarySiloEndpoint = new IPEndPoint(IPAddress.Loopback, 30000))
            .ConfigureEndpoints(IPAddress.Loopback, 11111, 30000)
            .ConfigureApplicationParts(x => x
                .AddApplicationPart(Assembly.GetExecutingAssembly())
                .WithCodeGeneration())
            .UseOrleankka()
            .Build();

        await host.StartAsync();

        var client = new ClientBuilder()
            .Configure<ClusterOptions>(options => {
                options.ClusterId = "localhost-demo";
                options.ServiceId = "localhost-demo-service";
            })
            .UseStaticClustering(options => options.Gateways.Add(new IPEndPoint(IPAddress.Loopback, 30000).ToGatewayUri()))
            .ConfigureApplicationParts(x => x
                .AddApplicationPart(Assembly.GetExecutingAssembly())
                .WithCodeGeneration())
            .UseOrleankka()
            .Build();

        await client.Connect();

        var greeter = client.ActorSystem().ActorOf<IGreeter>("id");
        await greeter.Tell(new Greet {Who = "world"});

        Write("\n\nPress any key to terminate ...");
        ReadKey(true);
    }
}

可以吗?

完全可以在没有集群的情况下将 Orleans 作为单个进程使用(我在测试和 pre-production 阶段做了),但是你会失去可用性。

筒仓应该是 运行 作为集群中的 long-running 进程,因此单个节点大约 30 秒的启动时间对于云环境来说永远不是问题。如果您需要 single-host 演员系统,akka.net 可能是更好的解决方案