Orleans グレイン ディレクトリ
グレインには安定した論理 ID があり、アプリケーションの有効期間中に何度もアクティブ化 (インスタンス化) され、非アクティブ化される場合がありますが、グレインのアクティブ化は、任意の時点で最大 1 つ存在します。 グレインがアクティブ化されるたびに、クラスター内の別のサイロに配置される場合があります。 クラスターでグレインがアクティブ化されると、グローバル レジストリ、''グレイン ディレクトリ'' に登録されます。 これにより、そのグレインの後続の呼び出しがグレインのそのアクティブ化に配信され、そのグレインの他のアクティブ化 (インスタンス) は作成されなくなります。 グレイン ディレクトリは、グレイン ID と現在のアクティブ化の場所 (サイロ) との間のマッピングの保持を担当します。
既定では、Orleans で組み込みの分散メモリ内ディレクトリが使用されます。 このディレクトリは最終的に一貫性があり、分散ハッシュ テーブルの形式でクラスター内のすべてのサイロ間でパーティション分割されます。
3.2.0 以降では、Orleans でグレイン ディレクトリのプラグ可能な実装もサポートされています。
3.2.0 リリースには、次の 2 つのプラグインが含まれています。
- Azure Table の実装: Microsoft.Orleans.GrainDirectory.AzureStorage
- Redis ストアの実装: Microsoft.Orleans.GrainDirectory.Redis
グレインの種類ごとに使用するグレイン ディレクトリの実装を構成でき、実装を挿入することもできます。
使用する必要があるグレイン ディレクトリ
常に既定のもの (組み込みのメモリ内分散ディレクトリ) から始めることをお勧めします。 最終的に一貫性があり、クラスターが不安定な場合に重複するアクティブ化が可能になる場合でも、組み込みディレクトリは外部依存関係を持たない自己完結型であり、構成を必要とせず、運用環境で常に使用されています。
Orleansの経験があり、単一アクティブ化の保証が強化されたグレイン ディレクトリのユース ケースがある場合や、クラスター内のサイロがシャットダウンしたときに非アクティブ化されるグレインの数を最小限に抑えたい場合は、Redis 実装などのストレージ ベースのグレイン ディレクトリの実装の使用を検討してください。 有効期間が長く、非常に多くの状態があるか、負荷のかかる初期化プロセスを持つものから始めて、最初に 1 つまたは少数のグレインの種類で使ってみてください。
構成
既定では、何もする必要はありません。メモリ内グレイン ディレクトリが自動的に使用され、クラスター全体でパーティション分割されます。 既定以外のグレイン ディレクトリ構成を使う場合は、使用するディレクトリ プラグインの名前を指定する必要があります。 これは、グレイン クラスの属性を介して、依存関係の挿入と、サイロ構成時にその名前のディレクトリ プラグインを使用して行うことができます。
グレインの構成
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