個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

Orleans の構成要素:サイロ

目次

 
前の記事はこちらです。
hiro128.hatenablog.jp
 

サイロの役割

 

 

  • サイロは複数の仮想アクターつまりグレインをホストするコンテナです。サイロは単一ではその効力を発揮できません。複数のサイロによって構成されるグループを一緒に実行しクラスターを形成することでスケーラビリティや耐障害性を提供する役割を果たします。
  • サイロのクラスターにより、アプリケーションの状態は物理的に暗黙的・透過的に分割され、負荷に応じて並列に処理が実行されますが、開発者はそれを意識することはなく 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