UseOrleans(IHostBuilder, Action<HostBuilderContext,ISiloBuilder>)拡張メソッドといくつかの補助オプション クラスを使用して、プログラムによってサイロを構成します。 Orleansのオプション クラスは.NET の Options パターンに従い、ファイル、環境変数、またはその他の有効な構成プロバイダーから読み込むことができます。
サイロ構成には、いくつかの重要な側面があります。
- クラスタリング プロバイダー
- (省略可能) Orleans クラスタリング情報
- (省略可能)サイロ間およびクライアント間通信のエンドポイント
この例では、クラスター情報を定義し、Azure クラスタリングを使用してアプリケーション パーツを構成するサイロ構成を示します。
using IHost host = Host.CreateDefaultBuilder(args)
.UseOrleans(builder =>
{
builder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString));
})
.UseConsoleLifetime()
.Build();
ヒント
Orleans用に開発するときは、UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String)を呼び出してローカル クラスターを構成できます。 運用環境では、デプロイに適したクラスタリング プロバイダーを使用する必要があります。
クラスタリング プロバイダー
siloBuilder.UseAzureStorageClustering(
options => options.ConfigureTableServiceClient(connectionString))
通常、 Orleans 上に構築されたサービスを、専用のハードウェアまたはクラウド上のノードのクラスターにデプロイします。 開発と基本的なテストでは、単一ノード構成で Orleans をデプロイできます。 ノードのクラスターにデプロイすると、 Orleans は、ノード障害の検出や自動再構成など、クラスター内の Orleans サイロのメンバーシップを検出して維持するためのプロトコルを内部的に実装します。
信頼性の高いクラスター メンバーシップ管理のために、 Orleans はノード同期に Azure Table、SQL Server、または Apache ZooKeeper を使用します。
このサンプルでは、メンバーシップ プロバイダーとして Azure Table を使用します。
Orleans クラスタリング情報
必要に応じてクラスタリングを構成するには、ClusterOptions
インスタンスのConfigure メソッドの型パラメーターとしてISiloBuilder
を使用します。
siloBuilder.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "SampleApp";
})
ここでは、次の 2 つのオプションを指定します。
-
ClusterId
を"my-first-cluster"
に設定します。これは、Orleans クラスターの一意の ID です。 この ID を使用するすべてのクライアントとサイロは、相互に直接通信できます。 ただし、デプロイごとに異なるClusterId
を使用することもできます。 -
ServiceId
を"SampleApp"
に設定します。これは、永続化プロバイダーなど、一部のプロバイダーによって使用されるアプリケーションの一意の ID です。 この ID は安定しており、デプロイ間で変更されないようにする必要があります。
既定では、Orleansは"default"
とServiceId
の両方にClusterId
を使用します。 ほとんどの場合、これらの値を変更する必要はありません。
ServiceId
は、より重要であり、さまざまな論理サービスを区別し、干渉なしでバックエンド ストレージ システムを共有できるようにします。
ClusterId
は、クラスターを形成するために接続するホストを決定します。
各クラスター内では、すべてのホストが同じ ServiceId
を使用する必要があります。 ただし、複数のクラスターで ServiceId
を共有できます。 これにより、別のデプロイをシャットダウンする前に新しいデプロイ (クラスター) を開始する青/緑のデプロイ シナリオが可能になります。 これは、Azure App Service でホストされているシステムに一般的です。
より一般的なケースは、 ServiceId
と ClusterId
がアプリケーションの有効期間にわたって固定されたままであり、ローリング デプロイ戦略を使用することです。 これは、Kubernetes と Service Fabric でホストされているシステムに一般的です。
エンドポイント
既定では、 Orleans は、ポート 11111
上のすべてのインターフェイスでサイロ間通信と、クライアント間通信用のポート 30000
をリッスンします。 この動作をオーバーライドするには、 ConfigureEndpoints(ISiloBuilder, Int32, Int32, AddressFamily, Boolean) を呼び出し、使用するポート番号を渡します。
siloBuilder.ConfigureEndpoints(siloPort: 17_256, gatewayPort: 34_512)
前のコードでは、次のようになります。
- サイロ ポートは
17_256
に設定されます。 - ゲートウェイ ポートは
34_512
に設定されます。
Orleans サイロには、次の 2 種類の一般的なエンドポイント構成があります。
- サイロ間エンドポイント: 同じクラスター内のサイロ間の通信に使用されます。
- クライアント間 (またはゲートウェイ) エンドポイント: 同じクラスター内のクライアントとサイロ間の通信に使用されます。
ほとんどの場合、この方法で十分ですが、必要に応じてさらにカスタマイズできます。 ポートフォワーディングで外部 IP アドレスを使用する例を次に示します。
siloBuilder.Configure<EndpointOptions>(options =>
{
// Port to use for silo-to-silo
options.SiloPort = 11_111;
// Port to use for the gateway
options.GatewayPort = 30_000;
// IP Address to advertise in the cluster
options.AdvertisedIPAddress = IPAddress.Parse("172.16.0.42");
// The socket used for client-to-silo will bind to this endpoint
options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40_000);
// The socket used by the gateway will bind to this endpoint
options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50_000);
})
内部的には、サイロは0.0.0.0:40000
と0.0.0.0:50000
で待機しますが、メンバーシッププロバイダーで公開される値は172.16.0.42:11111
と172.16.0.42:30000
です。
SiloHostBuilderといくつかの補助オプション クラスを使用して、プログラムによってサイロを構成します。 Orleansのオプション クラスは.NET の Options パターンに従い、ファイル、環境変数、またはその他の有効な構成プロバイダーから読み込むことができます。
サイロ構成には、いくつかの重要な側面があります。
- Orleans クラスタリング情報
- クラスタリング プロバイダー
- サイロ間およびクライアント間通信のエンドポイント
- アプリケーション パーツ
この例では、クラスター情報を定義し、Azure クラスタリングを使用してアプリケーション パーツを構成するサイロ構成を示します。
var silo = Host.CreateDefaultBuilder(args)
.UseOrleans(builder =>
{
builder
.UseAzureStorageClustering(
options => options.ConnectionString = connectionString)
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "AspNetSampleApp";
})
.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
.ConfigureApplicationParts(
parts => parts.AddApplicationPart(typeof(ValueGrain).Assembly).WithReferences())
})
.UseConsoleLifetime()
.Build();
このサンプルで使用する手順を次に示します。
クラスタリング プロバイダー
siloBuilder.UseAzureStorageClustering(
options => options.ConnectionString = connectionString)
通常、 Orleans 上に構築されたサービスを、専用のハードウェアまたはクラウド上のノードのクラスターにデプロイします。 開発と基本的なテストでは、単一ノード構成で Orleans をデプロイできます。 ノードのクラスターにデプロイすると、 Orleans は、ノード障害の検出や自動再構成など、クラスター内の Orleans サイロのメンバーシップを検出して維持するためのプロトコルを内部的に実装します。
信頼性の高いクラスター メンバーシップ管理のために、 Orleans はノード同期に Azure Table、SQL Server、または Apache ZooKeeper を使用します。
このサンプルでは、メンバーシップ プロバイダーとして Azure Table を使用します。
Orleans クラスタリング情報
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "my-first-cluster";
options.ServiceId = "AspNetSampleApp";
})
ここでは、次の 2 つのことを行います。
-
ClusterId
を"my-first-cluster"
に設定します。これは、Orleans クラスターの一意の ID です。 この ID を使用するすべてのクライアントとサイロは、相互に直接通信できます。 ただし、デプロイごとに異なるClusterId
を使用することもできます。 -
ServiceId
を"AspNetSampleApp"
に設定します。これは、永続化プロバイダーなど、一部のプロバイダーによって使用されるアプリケーションの一意の ID です。 この ID は安定しており、デプロイ間で変更されないようにする必要があります。
既定では、Orleansは"default"
とServiceId
の両方にClusterId
を使用します。 ほとんどの場合、これらの値を変更する必要はありません。
ServiceId
は、より重要であり、さまざまな論理サービスを区別し、干渉なしでバックエンド ストレージ システムを共有できるようにします。
ClusterId
は、クラスターを形成するために接続するホストを決定します。
各クラスター内では、すべてのホストが同じ ServiceId
を使用する必要があります。 ただし、複数のクラスターで ServiceId
を共有できます。 これにより、別のデプロイをシャットダウンする前に新しいデプロイ (クラスター) を開始する青/緑のデプロイ シナリオが可能になります。 これは、Azure App Service でホストされているシステムに一般的です。
より一般的なケースは、 ServiceId
と ClusterId
がアプリケーションの有効期間にわたって固定されたままであり、ローリング デプロイ戦略を使用することです。 これは、Kubernetes と Service Fabric でホストされているシステムに一般的です。
エンドポイント
siloBuilder.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
Orleans サイロには、次の 2 種類の一般的なエンドポイント構成があります。
- サイロ間エンドポイント: 同じクラスター内のサイロ間の通信に使用されます。
- クライアントからサイロへのエンドポイント (またはゲートウェイ): 同じクラスター内のクライアントとサイロ間の通信に使用されます。
このサンプルでは、ヘルパー メソッド .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
を使用します。これは、サイロ間通信のポートを 11111
に設定し、ゲートウェイ ポートを 30000
に設定します。 このメソッドは、リッスンするインターフェイスを検出します。
ほとんどの場合、この方法で十分ですが、必要に応じてさらにカスタマイズできます。 ポートフォワーディングで外部 IP アドレスを使用する例を次に示します。
siloBuilder.Configure<EndpointOptions>(options =>
{
// Port to use for silo-to-silo
options.SiloPort = 11111;
// Port to use for the gateway
options.GatewayPort = 30000;
// IP Address to advertise in the cluster
options.AdvertisedIPAddress = IPAddress.Parse("172.16.0.42");
// The socket used for client-to-silo will bind to this endpoint
options.GatewayListeningEndpoint = new IPEndPoint(IPAddress.Any, 40000);
// The socket used by the gateway will bind to this endpoint
options.SiloListeningEndpoint = new IPEndPoint(IPAddress.Any, 50000);
})
内部的には、サイロは0.0.0.0:40000
と0.0.0.0:50000
で待機しますが、メンバーシッププロバイダーで公開される値は172.16.0.42:11111
と172.16.0.42:30000
です。
アプリケーション パーツ
siloBuilder.ConfigureApplicationParts(
parts => parts.AddApplicationPart(
typeof(ValueGrain).Assembly)
.WithReferences())
技術的に必須の手順ではありませんが(構成されていない場合、現在のフォルダー内のすべてのアセンブリをOrleansでスキャンします)、構成することをお勧めします。 この手順は、ユーザー アセンブリと型 Orleans 読み込むのに役立ちます。 これらのアセンブリは、アプリケーション パーツと呼ばれます。 Orleans は、アプリケーション パーツを使用して、すべてのグレイン、グレイン インターフェイス、およびシリアライザーを検出します。
IApplicationPartManagerおよびConfigureApplicationParts
のIClientBuilder拡張メソッドを使用してアクセスできる、ISiloHostBuilderを使用してアプリケーション パーツを構成します。
ConfigureApplicationParts
メソッドは、デリゲート (Action<IApplicationPartManager>
) を受け入れます。
IApplicationPartManagerの次の拡張メソッドは、一般的な用途をサポートしています。
- ApplicationPartManagerExtensions.AddApplicationPart: この拡張メソッドを使用して、1 つのアセンブリを追加します。
-
ApplicationPartManagerExtensions.AddFromAppDomain:
AppDomain
に現在読み込まれているすべてのアセンブリを追加します。 - ApplicationPartManagerExtensions.AddFromApplicationBaseDirectory: 現在の基本パス内のすべてのアセンブリを読み込んで追加します ( AppDomain.BaseDirectoryを参照)。
戻り値の型 ( IApplicationPartManagerWithAssemblies) で次の拡張メソッドを使用して、上記のメソッドによって追加されたアセンブリを補足します。
- ApplicationPartManagerExtensions.WithReferences: 追加したパーツから参照されているすべてのアセンブリを追加します。 これにより、推移的に参照されるアセンブリが直ちに読み込まれます。 アセンブリの読み込みエラーは無視されます。
-
ApplicationPartManagerCodeGenExtensions.WithCodeGeneration: 追加されたパーツのサポート コードを生成し、パーツ マネージャーに追加します。 これには、
Microsoft.Orleans.OrleansCodeGenerator
パッケージをインストールする必要があり、一般的にランタイム コード生成と呼ばれることに注意してください。
型検出では、指定されたアプリケーション パーツに特定の属性を含める必要があります。 ビルド時コード生成パッケージ (Microsoft.Orleans.CodeGenerator.MSBuild
または Microsoft.Orleans.OrleansCodeGenerator.Build
) をグレイン、グレインインターフェイス、またはシリアライザーを含む各プロジェクトに追加することは、これらの属性が確実に存在するための推奨アプローチです。 ビルド時のコード生成では、C# のみがサポートされます。 F#、Visual Basic、およびその他の .NET 言語の場合は、上記の WithCodeGeneration メソッドを使用して、構成時にコードを生成できます。 コード生成の詳細については 、対応するセクションを参照してください。
.NET