基本的な概念
Orleans は、分散型でスケーラブルなアプリケーションの構築プロセスを簡素化します。 Orleans と効果的に連携するためには、理解する必要があるいくつかの主要な概念があります。
Orleans は、1970 年代から存在する確立された設計パターンである「アクターモデル」を中心に構築されています。 Orleans の使用を開始するためにアクター モデルを深く理解する必要はありませんが、より複雑なアプリを構築するにつれてこのパターンに精通することが必要になります。 現時点では、Grain や Silo などのいくつかの重要な概念を基本的に理解していれば、この後の演習を簡単に完了できます。
グレインとは
Grain は、Orleans アプリケーションの最も重要なプリミティブであり構成要素です。 それらはアクター モデルにおけるアクターを表し、ショッピング カートや製品などのエンティティの状態データと動作を定義します。 Grain はそれぞれユーザー定義キーによって識別および追跡され、他の Grain やクライアントからアクセスできます。
Grain は、Silo (後に探索する) に格納されます。 現在アクティブであり、アプリケーションで使用されている Grain はメモリ内に残りますが、非アクティブな Grain はストレージに保持できます。 アプリで必要な場合や要求されると、Grain は再びアクティブになります。 Grain には管理されたライフ サイクルがあります。つまり、アプリケーションの必要性に応じて Grain のアクティブ化、非アクティブ化、格納、および検出が Orleans ランタイムによって処理されます。 開発者は、これらの懸念事項を自身で管理することを心配することなく、Grain がメモリ内で使用可能であることを前提としてコードを記述できます。
Grain はどのように実装されるか
より明確なコーディング用語では、Grain は Grain
基底クラスから継承されるクラスです。 Grain
クラスは、Orleans フレームワークを使用して、さまざまな内部動作と統合ポイントを管理します。 Grain クラスでは、以下に示す Grain インターフェイスの種類のいずれかが実装されている必要もあります。 これらの各インターフェイスは、同様のコントラクトを定義していますが、Grain を追跡するために Orleans で使用される識別子に対して異なるデータ型 (string
や integer
など) でクラスにマークを付けます。
IGrainWithGuidKey
IGrainWithIntegerKey
IGrainWithStringKey
IGrainWithGuidCompoundKey
IGrainWithIntegerCompoundKey
次のコードでは、Grain の基底クラスから継承され、識別子インターフェイスのいずれかを実装する単純な Grain クラス定義を示しています。
public class UrlShortenerGrain : Grain, IGrainWithStringKey
{
// Custom grain implementation details
}
Grain では、通常、カスタム データと動作を管理するために、ユーザーが設計したインターフェイスも実装されます。 URL 短縮サービスのサンプル Grain インターフェイスは、次のコードのようになります。
public interface IUrlShortenerGrain
{
Task SetUrl(string url);
Task<string?> GetUrl();
}
IUrlShortenerGrain
インターフェイスを実装するには、次の UrlShortenerGrain
クラスを検討してください。
public sealed class UrlShortenerGrain
: Grain, IGrainWithStringKey, IUrlShortenerGrain
{
public Task SetUrl(string shortenedRouteSegment, string url)
{
// TODO: Implementation details
}
public Task<string?> GetUrl()
{
// TODO: Implementation details
}
}
Silo とは
Silo は Grain の格納を担当する、Orleans のもう一つの中核的な構成要素です。 Silo には、1 つ以上の Grain を含めることができます。Silo のグループはクラスターと呼ばれます。 クラスターは Silo 間の作業を調整して、あたかもすべてが 1 つのプロセス内で使用可能であるかのように Grain との通信を行うことができます。 さまざまな種類の Grain をさまざまな Silo に格納することによってデータを整理できます。 アプリケーションは、クラスター内での管理方法の詳細を気にすることなく、個々の Grain を取得できます。
クラスターと Silo は、Orleans の初期セットアップの一環として、プロジェクトの Program.cs クラスに構成されます。
builder.Host.UseOrleans(siloBuilder =>
{
siloBuilder.UseLocalhostClustering();
});
Orleans では、ストリームや ACID トランザクションなど、より具体的または高度なシナリオ向けに、他にも多くの機能がサポートされています。 これらの機能は、より複雑なアプリの構築を開始するときに検討できます。 次に、基本的なアプリケーションを作成し、いくつかの基本的な構成を適用して Orleans の使用を開始します。