Orleans は、分散アプリの構築を簡素化するように設計されたクロスプラットフォーム フレームワークです。 1 台のサーバーから数千のクラウドベースのアプリにスケーリングする場合でも、 Orleans は分散システムの複雑さを管理するのに役立つツールを提供します。 これにより、使い慣れた C# の概念がマルチサーバー環境に拡張され、開発者はアプリのロジックに集中できます。
Orleansが提供するものは次のとおりです。
- これは、弾力的にスケーリングするように設計されています。 サーバーを追加または削除し、 Orleans はフォールト トレランスとスケーラビリティを維持するように適宜調整します。
- これにより、一般的なパターンと API のセットを使用して分散アプリの開発が簡素化され、分散システムを初めて使用する場合でもアクセスできます。
- これはクラウドネイティブであり、.NET がサポートされているプラットフォーム (Linux、Windows、macOS など) で実行されます。
- Kubernetes、Azure App Service、Azure Container Apps などの最新のデプロイ オプションがサポートされています。
Orleans は、回復力のあるスケーラブルなクラウドネイティブ サービスの構築に重点を置いているため、"分散 .NET" と呼ばれることがよくあります。 次にアクター モデルを調べてみましょう。
アクター モデル
Orleans はアクター モデルに基づいています。 1970 年代初頭から、アクター モデルは現在、 Orleansの中核となるコンポーネントです。 アクター モデルでは、各 アクター は、状態とそれに対応する動作をカプセル化する、軽量で同時実行の不変オブジェクトです。 アクターは非同期メッセージを使用して排他的に通信します。 Orleans 特に、アクターが永続的に存在する 仮想アクター 抽象化を発明しました。
手記
アクターは、仮想的に常に存在する、純粋な論理エンティティです。 アクターを明示的に作成したり破棄したりすることはできません。また、その仮想の存在は、アクターを実行するサーバーの障害の影響を受けません。 アクターは常に存在するため、常にアドレス指定可能です。
この新しいアプローチは、クラウド時代の新しい世代の分散アプリを構築するのに役立ちます。 Orleans プログラミング モデルは、機能を制限したり制約を課したりすることなく、高度に並列分散されたアプリに固有の複雑さを軽減します。
詳細については、「Orleans: Microsoft Research を使用した仮想アクターの」を参照してください。 仮想アクターは、Orleans グレインとして表されます。
グレインとは
粒度は、いくつかの Orleans プリミティブの 1 つです。 アクター モデルに関しては、グレインは仮想アクターです。 任意の Orleans アプリケーションにおける基本的な構成要素は グレインです。 グレインは、ユーザー定義の ID、動作、および状態で構成されるエンティティです。 グレインの次の視覚的表現について考えてみましょう。
グレイン ID はユーザー定義キーであり、グレインを常に呼び出しに使用できるようにします。 その他のグレインや任意の数の外部クライアントがグレインを呼び出すことができます。 各グレインは、次のインターフェイスの 1 つ以上を実装するクラスのインスタンスです。
-
IGrainWithGuidKey:
Guid
キーを持つ粒度のマーカー インターフェイス。 -
IGrainWithIntegerKey:
Int64
キーを持つ粒度のマーカー インターフェイス。 -
IGrainWithStringKey:
string
キーを持つ粒度のマーカー インターフェイス。 - IGrainWithGuidCompoundKey: 複合キーを持つ粒度のマーカー インターフェイス。
- IGrainWithIntegerCompoundKey: 複合キーを持つ粒度のマーカー インターフェイス。
グレインは、揮発性または永続的な状態データを任意のストレージ システムに格納できます。 そのため、グレインはアプリケーションの状態を暗黙的にパーティション分割し、自動スケーラビリティを実現し、障害からの復旧を簡略化します。 Orleans は、グレインがアクティブな間にグレインの状態をメモリに保持し、待機時間を短縮し、データ ストアの負荷を軽減します。
Orleans ランタイムは、デマンドに応じてグレインを自動的にインスタンス化します。 しばらく使用されていないグレインは、リソースを解放するためにメモリから自動的に削除されます。 この削除は、安定した ID が原因で可能であり、メモリに読み込まれているかどうかにかかわらず、グレインを呼び出せるようにします。 また、呼び出し元は、どのサーバーでグレインがインスタンス化されているかを知る必要がないため、障害からの透過的な復旧も可能になります。 グレインにはマネージド ライフサイクルがあり、 Orleans ランタイムは必要に応じてグレインのアクティブ化/非アクティブ化と配置/配置を行います。 これにより、すべてのグレインが常にメモリ内にあるかのようにコードを記述できます。
サイロとは
サイロは、Orleans プリミティブのもう 1 つの例です。 サイロは、1 つ以上のグレインをホストします。 Orleans ランタイムは、アプリケーションのプログラミング モデルを実装します。
通常、複数のサイロは、スケーラビリティと耐障害性のためにクラスターとして実行されます。 クラスターとして実行すると、作業を分散し、障害を検出して復旧するためにサイロが調整されます。 ランタイムにより、クラスターでホストされているグレインは、単一のプロセス内にあるかのように通信できます。 クラスター、サイロ、およびグレイン間の関係を視覚化するには、次の図を検討してください。
上の図は、クラスター、サイロ、およびグレイン間の関係を示しています。 クラスターはいくつでもかまいません。各クラスターには 1 つ以上のサイロがあり、各サイロには 1 つ以上のグレインがあります。
サイロは、コア プログラミング モデルに加えて、タイマー、アラーム (永続的タイマー)、永続化、トランザクション、ストリームなどのランタイム サービスをグレインに提供します。 詳細については、「Orleansでできること」を参照してください。
Web アプリやその他の外部クライアントは、ネットワーク通信を自動的に管理するクライアント ライブラリを使用して、クラスター内のグレインを呼び出します。 クライアントは、シンプルにするためにサイロを使用して同じプロセスで共同ホストすることもできます。
Orleansでできること
Orleans はクラウドネイティブ アプリを構築するためのフレームワークであり、最終的にスケーリングが必要になる可能性がある .NET アプリを構築する際に考慮する必要があります。 Orleansを使用する方法は一見無限に見えますが、ゲーム、銀行、チャット アプリ、GPS 追跡、株式取引、ショッピング カート、投票アプリなど、最も一般的なものの一部を次に示します。 Microsoft では、Azure、Xbox、Skype、Halo、PlayFab、Gears of War、およびその他の多くの内部サービスで Orleans を使用しています。 Orleans には、さまざまなアプリケーションに簡単に使用できる多くの機能があります。
固執
Orleans は、要求を処理し、整合性を維持する前に状態の可用性を確保する単純な永続化モデルを提供します。 グレインには、複数の名前付き永続データ オブジェクトを含めることができます。 たとえば、ユーザーのプロファイルは "profile" と呼ばれ、インベントリは "inventory" と呼ばれることがあります。 この状態は、任意のストレージ システムに格納できます。
グレインの実行中、 Orleans はメモリ内の状態を保持し、ストレージにアクセスせずに読み取り要求を処理します。 グレインが状態を更新すると、 IStorage.WriteStateAsync を呼び出すと、持続性と一貫性のためのバッキング ストアの更新が保証されます。
タイマーとアラーム
アラームは、グレインの永続的なスケジューリング メカニズムです。 グレインが現在アクティブ化されていない場合でも、将来の時点でアクションが完了することを確認するために使用します。 タイマーは、アラームに対応する非永続的なイベントであり、信頼性を必要としない頻度の高いイベントに使用できます。
詳細については、「タイマーとリマインダー」を参照してください。
柔軟なグレイン配置
Orleansでグレインがアクティブ化される際に、ランタイムはそれをどのサーバー(サイロ)で行うかを決定します。 このプロセスはグレイン配置と呼ばれます。
Orleans の配置プロセスは完全に構成可能です。 ランダム、優先ローカル、負荷に基づくなどのすぐに使える配置ポリシーから選択するか、カスタムロジックを設定します。 これにより、グレインを作成する場所を柔軟に決定できます。 たとえば、運用する必要があるリソースや、通信する他のグレインに近いサーバーにグレインを配置します。
詳細については、「グレイン配置」を参照してください。
グレイン バージョン管理と異種クラスター
特にステートフル システムでは、変更を考慮して運用システムを安全にアップグレードすることは困難な場合があります。 これを考慮するために、グレイン インターフェイスを Orleans でバージョン管理できます。
クラスターでは、どのサイロとそのバージョンで使用できるグレイン実装のマッピングが維持されます。 ランタイムは、このバージョン情報を配置戦略と共に使用して、グレインに呼び出しをルーティングするときに配置の決定を行います。 これにより、バージョン管理されたグレインを安全に更新するだけでなく、異なるサイロで使用可能なグレイン実装のセットが異なる異種クラスターも可能になります。
詳細については、「グレインのバージョン管理」を参照してください。
ステートレス ワーカー
ステートレス ワーカーは、複数のサイロで同時にアクティブ化できる、関連付けられた状態のない特別にマークされたグレインです。 これにより、ステートレス関数の並列処理が向上します。
詳細については、「ステートレス ワーカー グレイン」を参照してください。
グレイン呼び出しフィルター
グレイン呼び出しフィルターは、多くのグレインに共通するロジックです。 Orleans では、着信呼び出しと発信呼び出しの両方のフィルターがサポートされます。 一般的な用途には、承認、ログ記録とテレメトリ、エラー処理などがあります。
要求コンテキスト
要求コンテキストを使用して、一連の要求でメタデータやその他の情報を渡します。 分散トレース情報またはその他の定義された値を保持するために要求コンテキストを使用します。
分散 ACID トランザクション
前述の単純な永続化モデルに加えて、グレインは トランザクション状態を持つことができます。 複数のグレインは、状態が最終的に格納される場所に関係なく、 ACID トランザクションに一緒に参加できます。 Orleans内のトランザクションは分散および分散化され (中央トランザクション マネージャーやコーディネーターは存在しません)、シリアル化可能な分離があります。
トランザクションに関する詳細については、「トランザクション」を参照してください。
ストリーム
ストリームは、一連のデータ項目をほぼリアルタイムで処理するのに役立ちます。 Orleans ストリームは 管理されます。ストリームは、グレインまたはクライアントが発行またはサブスクライブする前に作成または登録する必要はありません。 これにより、ストリーム プロデューサーとコンシューマーを互いに分離し、インフラストラクチャを切り離すことができます。
ストリーム処理は信頼性が高く、グレインはチェックポイント (カーソル) を格納し、アクティブ化中またはその後の任意の時点で保存されたチェックポイントにリセットできます。 ストリームでは、効率と回復のパフォーマンスを向上させるために、コンシューマーへのメッセージのバッチ配信がサポートされます。
ストリームは、Azure Event Hubs、Amazon Kinesis などのキューサービスによってサポートされます。
任意の数のストリームを少数のキューに多重化でき、これらのキューを処理する責任はクラスター全体で均等に分散されます。
Orleans ビデオの概要
Orleansのビデオの概要については、次のビデオをご覧ください。
次の手順
.NET