.NET リモート処理のアーキテクチャ
.NET リモート処理インフラストラクチャは、プロセス間通信に対する抽象的なアプローチです。システムの大部分の機能が目立たずに機能します。たとえば、値渡し、つまり値によるコピーが可能なオブジェクトは、異なるアプリケーション ドメイン内または異なるコンピュータ上にあるアプリケーションの間で自動的に受け渡しされます。この機能は、カスタム クラスをシリアル化することをマーク付けするだけで使用できます。
しかし、リモート処理システムの本当の利点は、異なるトランスポート プロトコル、シリアル化フォーマット、オブジェクト有効期間スキーマ、オブジェクト生成モードを使用した、異なるアプリケーション ドメインやプロセス内にあるオブジェクト間の通信機能に常駐できる点にあります。さらに、リモート処理を使用すると、通信プロセスのほぼすべての段階で、なんらかの理由で必要となったインターフェイス処理を実行できます。
既に多数の分散アプリケーションを実装している場合でも、プログラムのスケーラビリティを向上するためにコンポーネントを他のコンピュータに移動するだけでよい場合でも、リモート処理システムは、いくつかの既定の実装を使用するだけで、ほとんどのシナリオを簡単に処理できるプロセス間通信の汎用システムと考えることができます。以下では、初めに、リモート処理を使用したプロセス間通信の基礎について説明します。
コピーと参照の相違点
プロセス間通信では、プロセスの外部にある呼び出し元に機能を提供するサーバー オブジェクトと、そのサーバー オブジェクトに対して呼び出しを行うクライアント、そしてその呼び出しを終端から終端へ転送するトランスポート機構が必要です。サーバー メソッドのアドレスは論理アドレスなので、あるプロセス内では正しく機能しても、別のクライアント プロセスでは正しく機能しません。この問題を軽減するには、オブジェクト全体のコピーを作成し、このコピーをクライアント プロセスに移動することにより、クライアントがサーバー オブジェクトを呼び出すことができます。クライアント プロセスでは、コピーしたオブジェクトのメソッドを直接呼び出すことができます。
しかし多くのオブジェクトでは、実行対象の他のプロセスに対して、コピーまたは移動をできない場合や不都合を生じる場合があります。多数のメソッドを持つ巨大なオブジェクトにとって、他のプロセスへのコピーや値渡しは必ずしもよい選択とは限りません。通常、クライアントには、サーバー オブジェクト上の 1 つまたは少数のメソッドから返された情報だけが必要です。サーバー オブジェクト全体を、クライアントには必要なく、巨大なサイズとなる可能性のある内部情報や実行可能構造体も含めてコピーすることは、クライアントのメモリや処理時間、および帯域幅の無駄になります。また、多くのオブジェクトはパブリックな機能を公開しますが、内部で実行するにはプライベートなデータを必要とします。このようなオブジェクトをコピーすると、認証されていないクライアントが内部データをチェックできるようになる可能性があるため、セキュリティ問題の原因となります。さらに、一部のオブジェクトは、通常の方法ではコピーできないデータを使用しています。たとえば FileInfo オブジェクトには、オペレーティング システム ファイルへの参照が含まれており、この参照にはサーバー プロセスのメモリの一意なアドレスが割り当てられています。このアドレスはコピーできますが、他のプロセスでは意味を持ちません。
このような状況では、サーバー プロセスはクライアント プロセスに対して、サーバー オブジェクトのコピーよりも、サーバー オブジェクトへの参照を渡す必要があります。クライアントでは、この参照を使用してサーバー オブジェクトを呼び出すことができます。これらの呼び出しは、クライアント プロセス内では実行されません。その代わりに、リモート処理システムは呼び出しに関するすべての情報を収集し、呼び出しをサーバー プロセスに送信します。サーバー プロセスはこの呼び出しを解釈し、正しいサーバー オブジェクトを検索し、クライアント オブジェクトに代わってサーバー オブジェクトに対する呼び出しを行います。呼び出しの結果はクライアント プロセスに返送され、クライアントに返されます。帯域幅は重要な情報、つまり呼び出し、呼び出しの引数、および戻り値や例外に対してだけ使用されます。
単純化されたリモート処理アーキテクチャ
リモート処理の核心は、サーバー オブジェクトとクライアントとの通信にオブジェクト参照を使用する点にあります。しかし、リモート処理アーキテクチャは、より単純な手順で利用することもできます。クライアントを正しく構成していれば、new (またはマネージ プログラミング言語のインスタンス生成関数) を使用してリモート オブジェクトの新しいインスタンスを生成するだけで済みます。クライアントはサーバー オブジェクトへの参照を受け取り、そのオブジェクトが別のコンピュータ上ではなく、クライアントのプロセス内にある場合と同様に、そのオブジェクトのメソッドを呼び出すことができます。リモート処理システムではプロキシ オブジェクトを使用して、サーバー オブジェクトがクライアントのプロセス内にあるかのような印象を作り出しています。プロキシは、自分自身を他のオブジェクトとして表す代理オブジェクトです。クライアントでリモート型のインスタンスが生成されると、リモート処理インフラストラクチャでは、クライアントからはそのリモート型とまったく同じに見えるプロキシ オブジェクトが生成されます。クライアントがプロキシ上のメソッドを呼び出すと、リモート処理システムはその呼び出しを受け取ってサーバー プロセスにルーティングし、サーバー オブジェクトを呼び出し、戻り値をクライアントのプロキシに返します。呼び出しの結果は、プロキシからクライアントに返されます。
リモート呼び出しは、クライアントとサーバー プロセスとの間をなんらかの方法で搬送される必要があります。リモート処理システムを独自に構築する場合は、まず、ネットワーク プログラミングと、多種多様なプロトコルやシリアル化フォーマット仕様について学習を必要とする可能性があります。.NET リモート処理システムでは、ネットワーク接続を開いたり、バイトを受信側アプリケーションに送信するための特定のプロトコルを使用するために必要な基になる技術の組み合わせは、トランスポート チャネルとして表されます。
チャネルはデータのストリームを取る型で、特定のネットワーク プロトコルに応じたパッケージを生成し、そのパッケージを他のコンピュータに送信します。チャネルには、情報を受信するだけのチャネル、情報を送信するだけのチャネル、さらに、たとえば既定の TcpChannel クラスや HttpChannel クラスのように、情報の受信と送信の両方に使用できるチャネルがあります。
サーバー プロセスはそれぞれの一意な型に関するすべての情報を把握していますが、クライアントは、他のアプリケーション ドメイン、多くの場合は他のコンピュータ上にあるオブジェクトへの参照が必要であるという以外の情報を持っていません。サーバーのアプリケーション ドメインの外部からは、URL によってオブジェクトを検索します。外部に対して一意な型を表す URL はアクティベーション URL と呼ばれ、リモート呼び出しが正しい型に対して行われるようにします。詳細については、「アクティベーション URL」を参照してください。
リモート処理システムのデザインの完了
1 台のコンピュータ上でアプリケーションを実行していて、別のコンピュータ上に配置されている型によって公開されている機能を使用するとします。一般的なリモート処理プロセスを次の図に示します。
リモート処理プロセス
このリレーションシップの両端が正しく構成されていれば、クライアントはサーバー クラスの新しいインスタンスを生成します。リモート処理システムは、そのクラスを表すプロキシ オブジェクトを生成し、クライアント オブジェクトに対してプロキシへの参照を返します。クライアントがメソッドを呼び出すと、リモート処理インフラストラクチャが呼び出しを処理し、型情報をチェックし、チャネルを通じてサーバー プロセスに呼び出しを送信します。待機しているチャネルは要求を傍受し、その要求をサーバーのリモート処理システムに転送します。サーバーのリモート処理システムは、要求されたオブジェクトを検索 (必要な場合には生成) して呼び出します。次に、この処理は反転され、サーバーのリモート処理システムが応答をメッセージにバンドルし、このメッセージをサーバー チャネルがクライアント チャネルに送信します。最後に、クライアントのリモート処理システムが、呼び出しの結果をプロキシを通じてクライアント オブジェクトに返します。
この作業のために作成する必要のあるコードはわずかですが、リレーションシップのデザインと構成には考慮が必要です。コードが完全に正確であっても、URL やポート番号が間違っているために失敗する可能性があります。詳細については、「構成」を参照してください。
リモート処理プロセスに関するこの高いレベルでの概要はわかりやすい内容ですが、低いレベルでの詳細は大変複雑です。リモート処理の主な要素に関する詳細な説明については、次に示すそれぞれのトピックを参照してください。
参照
.NET リモート処理の概要 | 境界 : プロセスとアプリケーション ドメイン | リモート処理可能オブジェクトとリモート処理不可能オブジェクト | オブジェクトのアクティベーションと有効期間 | チャネル | セキュリティ | 構成