JavaSpaces、パート1のためのスペースを作る

この記事は、Jiniologyシリーズの2番目のスレッドを開始します。6月、Bill Vennersは、Jiniテクノロジーの概要を説明するJiniologyを立ち上げました。これは、サービスのフェデレーションとして編成された分散システムを構築および展開するための強力な新しいインフラストラクチャです。このコラムで隔月で取り上げられるこのスレッドは、JavaSpacesに焦点を当てていますコラボレーションおよび分散アプリケーションを作成するための高レベルの手段を提供する、SunMicrosystemsのコアJiniサービス。Jiniを使用してアプリケーションを構築している場合は、JavaSpacesを使用してJiniフェデレーションの参加者を調整する方法を知りたいと思うでしょう。ただし、Javaで一般的な分散システムを構築するためのツールとして、Jiniとは別にJavaSpacesを使用できることを覚えておくことも重要です。いずれの場合も、JavaSpacesは、分散アプリケーションの設計とコーディングを大幅に容易にすることができるため、一見の価値があります。

JavaSpacesのためのスペースを作る:シリーズ全体を読んでください!

  • パート1。JavaSpacesを使用して分散アプリの開発を容易にする
  • パート2。JavaSpacesを使用して計算サーバーを構築する
  • パート3.JiniアプリをJavaSpacesで調整する
  • パート4。JavaSpacesを使用したJiniトランザクションの調査
  • パート5.コンピューティングサーバーを堅牢でスケーラブルにする

このシリーズでは、あなたが精通しているかもしれない他のネットワークや分散ツールとはかなり異なる、ユニークなJavaSpacesプログラミングモデルを紹介することから始めます。以降の記事では、JavaSpaces APIの詳細と、それを使用してプロセスを分散アプリケーションに接着する方法、およびJavaSpacesがJiniの他のコンポーネントと相互作用する方法について説明します。シリーズ全体を通して、JavaSpacesはシンプル(APIはほんの一握りの操作で構成されています)、表現力豊か(JavaSpacesを使用して多数の問題を解決できます)、強力(少量で洗練された分散システムを構築できます)であることがわかります。 JavaSpacesコードの)。

始めましょう。

新しい分散コンピューティングモデル

従来のネットワークツールを使用して分散アプリケーションを構築するには、通常、プロセス間でメッセージを渡すか、リモートオブジェクトでメソッドを呼び出す必要があります。対照的に、JavaSpacesアプリケーションでは、プロセスは直接通信しませんが、代わりに、スペースまたは共有メモリを介してオブジェクトを交換することにより、プロセスのアクティビティを調整します。プロセスは、write新しいオブジェクトをスペースに、takeオブジェクトをスペースから、またはread(コピーを作成する)スペース内のオブジェクト。図1は、これらの操作を使用してスペースと相互作用するいくつかのプロセス(Dukesで表される)を示しています。オブジェクトを取得または読み取る場合、プロセスはフィールドの値に基づいた単純なマッチングを使用して、オブジェクトにとって重要なオブジェクトを見つけます。一致するオブジェクトがすぐに見つからない場合、プロセスはオブジェクトが到着するまで待機できます。JavaSpacesでは、従来のオブジェクトストアとは異なり、プロセスはスペース内のオブジェクトを変更したり、メソッドを直接呼び出したりしません。その間、オブジェクトは単なるパッシブデータです。オブジェクトを変更するには、プロセスがオブジェクトを明示的に削除して更新し、スペースに再挿入する必要があります。

スペースは、JavaSpaceを強力で表現力豊かなツールにするのに役立ついくつかの重要なプロパティを持つオブジェクトストアです。詳細を見てみましょう:

  • スペースは共有されます:多くのリモートプロセスは同時にスペースと対話できます-スペース自体が同時アクセスの詳細を処理するため、プロセス間の高レベルプロトコルの設計に集中できます。

  • スペースは永続的です:スペースはオブジェクトに信頼できるストレージを提供します。オブジェクトをスペースに保存すると、削除されるまで無期限にそこに残ります。オブジェクトを保存する必要があるリース期間を要求することもできます。スペースに格納されると、オブジェクトは、リース時間(更新可能)が終了するまで、またはプロセスが明示的に削除するまで、そこに残ります。リースについては、このシリーズの後半で詳しく説明します。

  • スペースは連想的です:スペース内のオブジェクトは、メモリの場所や識別子はなく、連想ルックアップを介して配置されます。連想ルックアップは、オブジェクトの名前、作成者、またはオブジェクトの保存場所を知らなくても、コンテンツに応じて関心のあるオブジェクトを見つける簡単な手段を提供します。オブジェクトを検索するには、テンプレート(フィールドの一部またはすべてが特定の値に設定され、その他はnullワイルドカードとして機能するように残されたオブジェクト)を作成します。スペース内のオブジェクトは、テンプレートの指定されたフィールドと完全に一致する場合、テンプレートと一致します。連想ルックアップを使用すると、「計算するタスクはありますか?」などのオブジェクトのクエリを簡単に表現できることがわかります。または「私が求めた素因数に対する答えはありますか?」

  • スペースはトランザクション的に安全です。JavaSpacesはJiniのトランザクションサービスを利用して、スペースに対する操作がアトミックであることを確認します(操作が適用されるかどうかにかかわらず)。トランザクションは、単一のスペースでの単一の操作、および1つ以上のスペースでの複数の操作(すべての操作が適用されるか、適用されない)でサポートされます。シリーズの後半で説明するように、トランザクションは部分的な障害に対処するための重要な方法です。

  • スペースを使用すると、実行可能コンテンツを交換できます。スペース内では、オブジェクトは単なるパッシブデータであり、オブジェクトを変更したり、メソッドを呼び出したりすることはできません。ただし、スペースからオブジェクトを読み取ったり取得したりすると、オブジェクトのローカルコピーが作成されます。他のローカルオブジェクトと同様に、これまでにそのようなオブジェクトを見たことがない場合でも、パブリックフィールドを変更してメソッドを呼び出すことができます。この機能は、スペースを介してアプリケーションの動作を拡張するための強力なメカニズムを提供します。

このシリーズが進むにつれて、これらのプロパティが、ネットワーキングが自発的であることが多く、プロセスが動的に計算に参加したり離れたりするJini環境でうまく機能する分散アプリケーションを作成する上で重要な役割を果たす方法を示します。ネットワーク障害。

JavaSpacesの起源

JavaSpacesを新しい分散コンピューティングモデルとして説明しましたが、その起源は1980年代初頭のイェール大学にまでさかのぼることができます。そこで、David Gelernter博士は、分散アプリケーションを作成するためのLindaと呼ばれるツールを開発しました。 Lindaは、タプルスペースと呼ばれる永続ストアと組み合わされた少数の操作で構成されています。これらの操作は、特定のプログラミング言語に直交しています。これらは、他の計算言語に追加できる調整言語の一部です。Lindaの調査結果は驚くべきものでした。オブジェクトストアと少数の単純な操作を使用することで、ネットワークシステムを構築する際の落とし穴の多くを軽減する手法を使用して、多数の並列分散問題を簡単に実装できます。言い換えれば、宇宙ベースのシステムは単純であるだけでなく(わずかな操作しか必要としない)、表現力もあります(多くの分散した問題を解決するのに役立ちます)。

Gelernter博士の仕事は、SunのJavaSpacesサービスに影響を与え、コアJiniテクノロジーのルックアップおよび検出コンポーネントの設計にも影響を与えました(Jiniologyシリーズが進むにつれて表示されます)。JavaSpacesはLindaからスペースモデルを継承しましたが、JavaSpacesの設計者は、Javaオブジェクト、Jini、RMI、およびオブジェクトのシリアル化の機能を活用して、モデルを大幅に更新しました。

コンテキスト内のJavaSpaces

これまでの説明は少し抽象的だったので、スペースを介してオブジェクトを交換するプロセスとしてモデル化できる実際の分散アプリケーションの例をいくつか考えてみましょう。

チャットシステム

スペースがディスカッションを構成するすべてのメッセージを保持するチャットエリアとして機能する、単純なマルチユーザーチャットシステムについて考えてみます。話すために、参加者はメッセージオブジェクトをスペースに置きます。すべてのチャットメンバーは、新しいメッセージオブジェクトが表示されるのを待ち、それらを読み、その内容を表示します。到着が遅れると、スペース内の既存のメッセージオブジェクトを調べて、以前のディスカッションを確認できます。実際、スペースが永続的であるため、新しい参加者は、他の全員が去った後もずっとディスカッションを見ることができ、参加者は、中断したところから会話を再開するためにずっと後で戻ってくることさえできます。チャット参加者のリストは、スペースに保持して、誰かが会話に参加または会話から離れるたびに更新することもできます。

計算サーバー

ここで、地球外生命体の兆候についてリアルタイムの電波望遠鏡データを分析することを検討してください(SETI @ homeプロジェクトと同じように)。このようなデータは膨大であり、それを分析することは、コンピューターのネットワーク、つまり「計算サーバー」による並列計算に適した、計算量の多い作業です。 JavaSpacesテクノロジーを使用して、一連のタスク(たとえば、分析が必要なデータのチャンクごとに1つのタスク)がスペースに書き込まれます。参加している各コンピューターは、スペースでタスクを検索して削除し、必要な計算作業を完了して、結果をスペースに戻し、さらにタスクを探し続けます。このアプローチは自然に拡張できます。使用可能なコンピューターが10台でも1,000台でも同じように機能します。このアプローチは、自然な負荷分散も提供します。 なぜなら、各ワーカーは、与えられた時間内に処理できるのとまったく同じ量の作業を引き受け、遅いコンピューターはより少ない作業を行い、速いコンピューターはより多くの作業を行うからです。

ブローカーシステム

3番目の例として、商品やサービスの買い手と売り手を結び付けるオンラインオークションシステムについて考えてみます。潜在的な購入者として、購入したい商品(車など)と支払いたい価格を説明し、その情報をエントリにラップして、結果として購入したいエントリを記述したとします。スペースに。同時に、潜在的な売り手は、在庫内のアイテムと一致する購入したいエントリの到着のスペースを継続的に監視します。たとえば、マツダのディーラーはマツダを説明するエントリのスペースを監視し、中古車のディーラーはすべての中古車のリクエストのスペースを監視します。一致するリクエストが見つかり、読み取られると、潜在的な売り手が入札エントリをスペースに書き込み、提示価格を示します。潜在的な購入者として、未処理のリクエストに対する入札のスペースを継続的に監視し、そして、許容できるものを見つけたら、入札を削除して販売者に連絡します(おそらく別のエントリを介してスペースを介して)。

APIの概要

次に、JavaSpacesAPIを紹介します。すでに述べたように、それは簡単です。実際、この記事の残りの部分では、それについて知っておく必要のあるすべてのことをカバーします(いくつかの小さな詳細は除きます)。ただし、JavaSpaceインターフェイスとそのメソッドについて説明する前に、まずエントリについて説明する必要があります。

エントリー

スペースに格納されているオブジェクトは、

エントリ。

エントリになるには、オブジェクトは実装する必要があります

Entry

インターフェース。例として、スペースに書き込むことができるメッセージエントリを定義しましょう。

インポートnet.jini.core.entry.Entry;

パブリッククラスMessageはEntry {public Stringcontent;を実装します。

//引数なしのコンストラクタpublicMessage(){}}

ここではMessage、メッセージのコンテンツを保持する文字列フィールドを持つクラスを定義しました。このクラスをスペースで使用したいのでnet.jini.core.entry.Entry、パッケージにあるインターフェースを実装する必要がありますnet.jini.core.entry。これEntryマーカーインターフェイスであることを指摘することが重要です。つまり、インターフェイスには定数やメソッドが含まれていないimplements Entryため、クラス定義に追加する以外に、実装するための特別な作業は必要ありません。

Entryインターフェイスの実装に加えて、エントリが従わなければならない他のいくつかの規則があります。その理由については後の記事で詳しく説明しますが、ここでは大まかな概要だけを見ていきます。エントリには、引数をとらないパブリックコンストラクタ(いわゆる引数なしコンストラクタ)が必要です。この要件は、エントリがスペースに出入りするときに発生する基本的なシリアル化に起因します。の定義にMessageは引数なしのコンストラクターが含まれていることに注意してください。別の規則は、エントリのフィールドを宣言する必要があるというものですpublic;これにより、他のプロセスは、それらのフィールドの値に基づいて、連想ルックアップを介してスペース内のエントリを見つけることができます。 3番目の規則では、エントリのフィールドには、プリミティブ型ではなくオブジェクトへの参照が含まれている必要があります(つまり、などのプリミティブ型フィールドを定義する必要がある場合は、代わりにint対応するラッパークラスを使用する必要がありますInteger)。エントリを定義する際にすべての基盤を確実にカバーするために、詳細については、JavaSpacesの原則、パターン、および実践、またはSun MicrosystemsJavaSpaces仕様を参照することをお勧めします。また、前述のように、後の記事でより細かい点のいくつかに触れます。

これらの要件を除けば、エントリは他のJavaクラスと同じです。インスタンス化してメソッドを呼び出し、パブリックフィールドに値を割り当てることができます。Messageエントリクラスを定義したので、スペース内のエントリを操作するために使用できる操作を見てみましょう。

JavaSpaceインターフェース

スペースと対話するには、JavaSpaceインターフェイスを実装するオブジェクトへのアクセスを取得する必要があります。このようなオブジェクトへのアクセスを取得する方法はたくさんあります(たとえば、JiniルックアップまたはRMIレジストリを使用できます)。その詳細については、次の記事で説明します。今のところ、JavaSpaceインターフェース自体に集中します。