Orleans の利点
Orleans の主な利点は次のとおりです。
- 専門家以外のプログラマーを含めた開発者の生産性。
- プログラマーによる特別な労力を必要としない、既定で透過的なスケーラビリティ。
開発者の生産性
Orleans プログラミング モデルでは、以下の重要な抽象化、保証、およびシステム サービスを提供することで、上級者と初心者の両方のプログラマーの生産性を向上させます。
使い慣れたオブジェクト指向プログラミング (OOP) パラダイム
グレインは、非同期メソッドを備えた宣言済みの .NET グレイン インターフェイスを実装する .NET クラスです。 そのため、プログラマーからは、グレインはメソッドを直接呼び出すことができるリモート オブジェクトのように見えます。 これにより、メソッドの呼び出しをメッセージにして、正しいエンドポイントにルーティングし、ターゲット グレインのメソッドを呼び出して、エラーや困難なケースを透過的に処理することで、使い慣れた OOP パラダイムがプログラマーに提供されます。
グレインのシングル スレッド実行
ランタイムでは、グレインが一度に複数のスレッドで実行されないように保証します。 プログラマーは、他のグレインからの分離と組み合わせることで、グレイン レベルでコンカレンシーに直面することがなくなります。また、共有データへのアクセスを制御するためにロックやその他の同期メカニズムを使用する必要はありません。 この機能だけで、分散アプリケーションの開発は専門家以外のプログラマーにとって容易になります。
透過的なアクティブ化
このランタイムでは、処理するメッセージがある場合にのみ、グレインをアクティブにします。 これにより、グレイン参照の作成 (アプリケーションのコードによって認識されて制御される) の概念と、メモリ内でのグレインの物理的なアクティブ化 (アプリケーションに対して透過的) が、明確に分離されます。 これは、グレインを "ページアウト" (非アクティブ化) または "ページイン" (アクティブ化) するタイミングを決定するという点で、仮想メモリに似ています。アプリケーションは、特定の時点でグレインが物理メモリ内にあるかどうかにかかわらず、論理的に作成されたグレインの完全な "メモリ領域" に中断なくアクセスできます。
ハードウェア リソースのプールへのグレインの配置と移行により、透過的なアクティブ化では、動的な適応型の負荷分散が可能になります。 この機能は、アクターの有効期間がアプリケーションで管理される従来のアクター モデルを大幅に改善したものです。
場所の透過性
グレインのメソッドを呼び出したり、他のコンポーネントに渡したりするためにプログラマーが使用するグレイン参照 (プロキシ オブジェクト) には、グレインの論理 ID のみが含まれています。 グレインの論理 ID から物理的な場所への変換と、メッセージの対応するルーティングは、Orleans ランタイムによって透過的に行われます。
アプリケーション コードはグレインと通信しますが、物理的な場所は認識されないままです。この場所は、エラーやリソース管理に伴って、またはグレインが呼び出し時に非アクティブ化されたために、時間の経過と共に変化する可能性があります。
永続ストアとの透過的な統合
Orleans では、グレインのメモリ内状態から永続ストアへの宣言型のマッピングを行うことができます。 これは更新を同期化し、永続的な状態が正常に更新された後でのみ呼び出し元が結果を受け取ることを透過的に保証します。 使用可能な一連の既存の永続ストレージ プロバイダーを拡張またはカスタマイズするのは簡単です。
エラーの自動伝達
ランタイムでは、非同期および分散 try/catch のセマンティクスを使用して、未処理のエラーを呼び出しチェーンに自動的に伝達します。 その結果、アプリケーション内でエラーが失われることはありません。 これにより、プログラマーはエラー処理ロジックを適切な場所に配置できます。各レベルで手動でエラーを伝達するという面倒な作業は不要です。
透過的なスケーラビリティ (既定)
Orleans プログラミング モデルは、アプリケーションまたはサービスを数桁スケーリングするときに、成功する可能性のあるパスにプログラマーを導くように設計されています。 これは、実績のあるベスト プラクティスとパターンを組み込み、下位レベルのシステム機能の効率的な実装を提供することによって実現されます。
スケーラビリティとパフォーマンスを可能にするいくつかの重要な要因を次に示します。
アプリケーション状態の暗黙的な細かいパーティション分割
プログラマーは、直接アドレス指定可能なエンティティとしてグレインを使用することで、アプリケーションの全体的な状態を暗黙的に分割します。 Orleans プログラミング モデルでは、グレインの規模は規定されていません。しかし、ほとんどの場合、比較的多数 (数百万個以上) のグレインを持ち、それぞれがユーザー アカウントや発注書などのアプリケーションの自然なエンティティを表すことが理にかなっています。
グレインは個別にアドレス指定可能であり、ランタイムによって物理的な場所が抽象化されます。そのため、アプリケーション開発者が何も考えなくても、負荷を分散し、Orleans はホット スポットを透過的かつ汎用的に処理する上で、高い柔軟性を保つことができます。
適応型のリソース管理
グレインでは、他のグレインとの対話時にそれらのグレインの場所を想定しません。 場所の透過性により、ランタイムでは、利用できるハードウェア リソースを動的に管理し、割り当てを調整することができます。 このときランタイムでは、入ってくる要求を落とすことなく、負荷と通信のパターンに対し、細かく決定した上でコンピューティング クラスター全体にグレインを配置し、移行します。 特定のグレインの複数のレプリカを作成することで、ランタイムでは、アプリケーションのコードを変更しなくても、グレインのスループットを向上させることができます。
多重化通信
Orleans のグレインは論理エンドポイントを持ち、グレイン間のメッセージは、すべて対すべての物理接続 (TCP ソケット) の固定セットによって多重化されます。 これにより、このランタイムでは、OS のオーバーヘッドを抑えながら、グレインごとに数百万のアドレス指定可能なエンティティをホストできます。 さらに、グレインのアクティブ化と非アクティブ化では、物理エンドポイント (TCP ポートや HTTP URL など) の登録と登録解除、または TCP 接続の終了のコストは発生しません。
効率的なスケジューリング
ランタイムは、パフォーマンスのために高度に最適化された .NET スレッド プールを使用して、多数のシングル スレッド 粒度の実行をスケジュールします。 非ブロッキング継続ベースの形式 (Orleans プログラミング モデルの必要条件) で記述されたグレインのコードでは、アプリケーション コードは競合のない非常に効率的な "協調" マルチスレッド方式で実行されます。 これにより、システムは高スループットを達成し、きわめて安定した非常に高い CPU 使用率 (最大 90%以上) で実行できます。
システム内のグレインの数と負荷が増加してもスレッドまたは他の OS プリミティブが増えないことは、個々のノードとシステム全体のスケーラビリティの向上につながります。
明示的な非同期性
Orleans プログラミング モデルにより、分散アプリケーションの非同期的性質が明確になり、プログラマーが非ブロッキング非同期コードを作成する指針となります。 非同期メッセージングと効率的なスケジューリングを組み合わせることで、マルチスレッドを明示的に使用することなく、大規模な分散並列処理が可能となり、全体的なスループットが向上します。
.NET