グレインには安定した論理 ID があります。 アプリケーションのライフサイクル中に何度でもアクティブ化(インスタンス化)および非アクティブ化できますが、ある時点では、グレインのアクティブ化は最大1回のみ存在します。 グレインがアクティブになるたびに、クラスター内の別のサイロに配置される可能性があります。 クラスターでグレインがアクティブになると、グレインディレクトリに自ら登録されます。 これにより、そのグレインの後続の呼び出しがそのアクティブ化に配信され、そのグレインの他のアクティブ化 (インスタンス) が作成されないようにします。 グレイン ディレクトリは、グレイン ID と現在のアクティブ化の場所 (どのサイロ) との間のマッピングを維持します。
Orleans には、いくつかのグレイン ディレクトリ実装が用意されています。
| ディレクトリ | パッケージ | Description |
|---|---|---|
| クラスター内分散 (既定) | 組み込み | 最終的に一貫性が確保され、分散ハッシュテーブルを使用してサイロ間でパーティション分割されます。 クラスターが不安定な場合に、重複するアクティブ化を時折許可します。 |
| クラスタ内での強い一貫性 | 組み込み | バージョン管理された範囲ロックを持つ厳密に一貫性のある分散ハッシュ テーブル。 重複するアクティブ化を防止しますが、より多くの調整が必要です。 |
| ADO.NET | Microsoft.Orleans.GrainDirectory.AdoNet |
SQL Server、PostgreSQL、MySQL、Oracle をサポートするデータベースベースのディレクトリ。 |
| Azure Table Storage | Microsoft.Orleans.GrainDirectory.AzureStorage |
永続的なグレイン格納場所のための Azure テーブルベースのディレクトリ。 |
| Redis(レディス) | Microsoft.Orleans.GrainDirectory.Redis |
高パフォーマンスの永続的な検索用の Redis ベースのディレクトリ。 |
既定では、 Orleans は組み込みの分散クラスター内ディレクトリを使用します。 このディレクトリは最終的に一貫性があり、クラスター内のすべてのサイロに分散ハッシュ テーブルの形式でパーティション分割されます。
バージョン 3.2.0 以降では、 Orleans ではプラグ可能なグレイン ディレクトリの実装もサポートされています。
3.2.0 リリースには、次の 2 つのプラグインが含まれています。
- Azure Table の実装: Microsoft.Orleans.GrainDirectory.AzureStorage
- Redis ストアの実装: Microsoft.Orleans.GrainDirectory.Redis
グレインの種類ごとに使用するグレイン ディレクトリの実装を構成でき、実装を挿入することもできます。
使用する必要があるグレイン ディレクトリ
既定のディレクトリ (組み込みのクラスター内分散ディレクトリ) から始めてお勧めします。 最終的には一貫性があり、クラスターが不安定な場合は重複するアクティブ化が可能になりますが、組み込みディレクトリは自己十分であり、外部の依存関係がなく、構成も必要なく、最初から運用環境で正常に使用されています。
Orleansの経験があり、より強力な単一アクティブ化の保証を必要とするユース ケースがある場合、またはサイロがシャットダウンしたときに非アクティブ化されるグレインの数を最小限に抑える場合は、Redis の実装などのストレージ ベースのグレイン ディレクトリの実装の使用を検討してください。 まず、有効期間が長く、重要な状態を持つか、初期化プロセスが高価なグレインの種類から試用してみてください。そして、1つまたは複数のグレインの種類に使用を開始してください。
厳密に一貫性のあるクラスター内ディレクトリ
Important
この機能は、 Orleans 10.0 以降で使用できます。 現在 プレビュー 段階であり、今後のリリースで変更される可能性があります。
Orleans また、仮想ノードを含む分散ハッシュ テーブルを使用して、厳密に一貫性のあるグレイン ディレクトリを提供します (Amazon Dynamo や Apache Cassandra と同様)。 この実装は、最終的に整合性のある既定のディレクトリとは異なり、クラスターが不安定な場合でも、重複するグレインのアクティブ化を防ぎます。
主な機能
- 強力な整合性: ビューの変更中にバージョン管理された範囲ロックを使用して一貫性を確保します
- 仮想ノード: 各サイロは、ハッシュ リング上の 30 個の仮想ノード (パーティション) を管理して、より適切な分散を実現します
- 自動回復:ハンドオフを完了せずにサイロがクラッシュしたときに自動的に回復します
- 2 フェーズ動作: 正常フェーズおよびビュー変更フェーズで動作し、メンバーシップを安全に切り替えます。
構成
厳密に一貫性のあるディレクトリを使用するには、 AddDistributedGrainDirectoryを使用して明示的に追加します。
// Use as the default grain directory
builder.AddDistributedGrainDirectory();
// Or add as a named directory
builder.AddDistributedGrainDirectory("MyDistributedDirectory");
いつ使用するか
クラスター メンバーシップの変更中にグレインのアクティブ化が重複しないようにする必要がある場合は、厳密に一貫性のあるディレクトリを使用します。 最終的に一貫性のある既定のディレクトリは、重複するアクティブ化が許容されるほとんどのシナリオに適しています。
次の場合は、外部ストレージベースのディレクトリ (Redis、Azure Table、ADO.NET) を検討してください。
- クラスター全体を再起動してもグレインの登録を保持する必要があります
- メモリ使用量が懸念される非常に大規模なクラスターがある
ADO.NET グレイン ディレクトリ
ADO。NET ベースのグレイン ディレクトリは、リレーショナル データベースにグレインの場所を格納します。 これにより、クラスターの再起動後も存続する永続的なグレイン ロケーション ストレージが提供されます。
サポートされるデータベース
- SQL Server
- PostgreSQL
- MySQL/MariaDB
- Oracle
Installation
NuGet パッケージをインストールします。
dotnet add package Microsoft.Orleans.GrainDirectory.AdoNet
構成
ADO.NET グレイン ディレクトリを既定または名前付きディレクトリとして構成します。
// Use as the default grain directory
builder.UseAdoNetGrainDirectoryAsDefault(options =>
{
options.Invariant = "System.Data.SqlClient"; // or "Npgsql", "MySql.Data.MySqlClient"
options.ConnectionString = "Server=localhost;Database=Orleans;...";
});
// Or add as a named directory
builder.AddAdoNetGrainDirectory("MyAdoNetDirectory", options =>
{
options.Invariant = "Npgsql";
options.ConnectionString = "Host=localhost;Database=Orleans;...";
});
AdoNetGrainDirectoryOptions
| Option | タイプ | Description |
|---|---|---|
Invariant |
string |
必須。 ADO.NET プロバイダーの不変名 (例: System.Data.SqlClient、 Npgsql、 MySql.Data.MySqlClient)。 |
ConnectionString |
string |
必須。 データベース接続文字列。 この値はログで編集されます。 |
データベースのセットアップ
ADO.NET グレイン ディレクトリを使用する前に、必要なデータベース テーブルを作成する必要があります。 データベースに適した SQL スクリプトを実行します。
- SQL Server: CreateOrleansTables_SqlServer.sql
- PostgreSQL: CreateOrleansTables_PostgreSql.sql
- MySQL: CreateOrleansTables_MySql.sql
構成
既定では、何もする必要はありません。 Orleans クラスター内グレイン ディレクトリが自動的に使用され、クラスター全体でパーティション分割されます。 既定以外のグレイン ディレクトリ構成を使用する場合は、使用するディレクトリ プラグインの名前を指定する必要があります。 これを行うには、グレイン クラスの属性を使用し、サイロの構成中に依存関係の挿入を使用して、その名前でディレクトリ プラグインを構成します。
グレインの構成
GrainDirectoryAttributeを使用して、グレイン ディレクトリ プラグイン名を指定します。
[GrainDirectory(GrainDirectoryName = "my-grain-directory")]
public class MyGrain : Grain, IMyGrain
{
// ...
}
サイロの構成
Redis グレイン ディレクトリの実装を構成する方法を次に示します。
siloBuilder.AddRedisGrainDirectory(
"my-grain-directory",
options => options.ConfigurationOptions = redisConfiguration);
次のように Azure グレイン ディレクトリを構成します。
siloBuilder.AddAzureTableGrainDirectory(
"my-grain-directory",
options => options.ConnectionString = azureConnectionString);
異なるグレイン クラスで使用するために、異なる名前の複数のディレクトリを構成できます。
siloBuilder
.AddRedisGrainDirectory(
"redis-directory-1",
options => options.ConfigurationOptions = redisConfiguration1)
.AddRedisGrainDirectory(
"redis-directory-2",
options => options.ConfigurationOptions = redisConfiguration2)
.AddAzureTableGrainDirectory(
"azure-directory",
options => options.ConnectionString = azureConnectionString);
.NET