サイロの役割
- サイロは複数の仮想アクターつまりグレインをホストするコンテナです。サイロは単一ではその効力を発揮できません。複数のサイロによって構成されるグループを一緒に実行しクラスターを形成することでスケーラビリティや耐障害性を提供する役割を果たします。
- サイロのクラスターにより、アプリケーションの状態は物理的に暗黙的・透過的に分割され、負荷に応じて並列に処理が実行されますが、開発者はそれを意識することはなく Orleans を利用するだけでスケーラビリティを確保することができます。
- サイロのクラスターにより、分割されたアプリケーションの状態のバックアップを使用することで、回復力が向上し、障害からの回復性が高まります。
サイロの実装例
サイロの実装では以下を行います。
- IP、ポート番号などネットワーク関連の設定
- クラスタの設定、ロギングの設定
サイロのアプリケーションコードはデプロイするインスタンスが単一であっても複数(N個)であってもコード自体は同一になります。
(スケールアウト、スケールインへの対応)
using System.Net; using Orleans.Configuration; using OrleansPoc; var siloHost = await StartSiloAsync(); // Silo 動作確認用 var app = WebApplication.Create(); app.MapGet("/", () => $"Silo is activated {DateTime.Now}"); await app.RunAsync(); static async Task<IHost> StartSiloAsync() { var builder = Host.CreateDefaultBuilder() .UseOrleans( (context, builder) => { var siloIPAddress = IPAddress.Parse(context.Configuration["WEBSITE_PRIVATE_IP"] ?? ""); // WEBSITE_PRIVATE_PORTS は再起動で変更されるのでWEBSITE_PRIVATE_PORTS として取得し Parse すること var strPorts = (context.Configuration["WEBSITE_PRIVATE_PORTS"] ?? "").Split(','); if (strPorts.Length < 2) throw new Exception("Insufficient private ports configured."); var (siloPort, gatewayPort) = (int.Parse(strPorts[0]), int.Parse(strPorts[1])); var connectionString = context.Configuration["ORLEANS_AZURE_STORAGE_CONNECTION_STRING"]; builder .ConfigureEndpoints(siloIPAddress, siloPort, gatewayPort) .Configure<ClusterOptions>( options => { options.ClusterId = "PoCCluster"; options.ServiceId = "OrleansPoC"; }) .UseAzureStorageClustering( options => options.ConfigureTableServiceClient(connectionString)) .AddAzureTableGrainStorage( "PocStore", options => options.ConfigureTableServiceClient(connectionString) ) .ConfigureLogging(logging => logging.AddConsole()); }); var host = builder.Build(); await host.StartAsync(); return host; }
次の記事はこちらです。
hiro128.hatenablog.jp