(57)【特許請求の範囲】
【請求項１】
クライアント端末から受信した、データの送信要求または受信要求を示すアクセス要求に、受信した順に基づく識別子を付与する付与部と、
データの送受信処理を分散させる分散型ネットワークを形成する情報処理装置から、前記付与部による付与予定の識別子が付与されるアクセス要求を処理対象とする情報処理装置を探索し、探索された情報処理装置を特定する情報と前記付与予定の識別子とを対応付けて記憶部に記憶させる記憶制御部と、
前記付与部によってアクセス要求に前記付与予定の識別子が付与された場合に、付与された識別子に対応付けて前記記憶部に記憶される情報を、前記クライアント端末に応答する応答部と
を有することを特徴とする情報処理装置。
【請求項２】
前記付与部によってアクセス要求に付与された最新の識別子を記憶する識別子記憶部をさらに有し、
前記記憶制御部は、前記識別子記憶部に記憶される最新の識別子を増加または減少させた識別子を用いてハッシュ値を算出し、算出したハッシュ値によって特定されたデータの格納先となる情報処理装置を示す情報と前記ハッシュ値の算出に用いた識別子とを対応付けて、前記記憶部に記憶させることを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記記憶制御部は、前記識別子記憶部に記憶される最新の識別子を所定回数増加または減少させた各識別子を用いてハッシュ値を算出し、算出した各ハッシュ値によって特定された各格納先と前記各識別子とを対応付けて、前記最新の識別子を増加または減少させた順に前記記憶部に記憶させることを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記記憶制御部は、前記応答部によって応答された前記データの格納先を前記記憶部から削除するたびに、前記識別子記憶部に記憶される最新の識別子を用いて前記データの格納先を特定し、特定したデータの格納先と識別子とを対応付けて、前記記憶部に記憶させることを特徴とする請求項２に記載の情報処理装置。
【請求項５】
前記受信されたアクセス要求のうち、既に処理が実行された最新のアクセス要求に付与された識別子を記憶する処理済記憶部と、
前記付与部によって識別子が付与されたアクセス要求に対応する処理を実行する場合に、付与された識別子と前記処理済記憶部に記憶される識別子とを比較し、未処理のアクセス要求が存在すると判定した場合には、前記受信されたアクセス要求に先立って、当該未処理のアクセス要求に対応する処理を実行する処理実行部とをさらに有することを特徴とする請求項１に記載の情報処理装置。
【請求項６】
コンピュータが、
クライアント端末から受信した、データの送信要求または受信要求を示すアクセス要求に、受信した順に基づく識別子を付与し、
データの送受信処理を分散させる分散型ネットワークを形成する情報処理装置から、付与予定の識別子が付与されるアクセス要求を処理対象とする情報処理装置を探索し、探索された情報処理装置を特定する情報と前記付与予定の識別子とを対応付けて記憶部に記憶させ、
アクセス要求に前記付与予定の識別子が付与された場合に、付与された識別子に対応付けて前記記憶部に記憶される情報を、前記クライアント端末に応答する
各処理を実行することを特徴とするデータ制御方法。
【請求項７】
コンピュータに、
クライアント端末から受信した、データの送信要求または受信要求を示すアクセス要求に、受信した順に基づく識別子を付与し、
データの送受信処理を分散させる分散型ネットワークを形成する情報処理装置から、付与予定の識別子が付与されるアクセス要求を処理対象とする情報処理装置を探索し、探索された情報処理装置を特定する情報と前記付与予定の識別子とを対応付けて記憶部に記憶させ、
アクセス要求に前記付与予定の識別子が付与された場合に、付与された識別子に対応付けて前記記憶部に記憶される情報を、前記クライアント端末に応答する
各処理を実行させることを特徴とするデータ制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、データ制御方法およびデータ制御プログラムに関する。
【背景技術】
【０００２】
従来、メッセージの送信者からメッセージの受信者へメッセージを伝達する技術として、異なるプロセス間を非同期に連携させるメッセージキューが知られている。メッセージキューを利用する場合、メッセージキューの配置設計が行われて、メッセージキューにアクセスするサーバ、メッセージキューの容量などが事前に決定される。
【０００３】
一般的に、メッセージを送信するアプリケーションは、メッセージ受信側の状態を認識せずに送信するので、受信側が受信を行えない状態にある場合には、メッセージの格納領域が不足し、メッセージ送信が実行できない場合がある。すなわち、滞留による容量オーバーが発生する場合がある。この容量オーバーを回避する技術として、複数のサーバを仮想的な１つのメッセージキューに見せかけて、メッセージキューの物理容量を動的に拡張する技術が知られている。
【０００４】
また、メッセージキューは、大量のデータを扱うことが多いことから、メッセージの格納領域に対するＩ／Ｏ負荷により性能が劣化する場合がある。これに対して、メッセージの格納領域を複数に分割し、ラウンドロビンで格納領域を決定することで、Ｉ／Ｏ負荷を分散させる技術が利用されている。
【０００５】
また、データの格納領域の動的な拡張と負荷分散を行う技術として、複数のサーバにデータを分散させて管理する分散ハッシュテーブル（DHT：Distributed  Hash  Table）が知られている。ＤＨＴは、データに対してキーを割当て、割当てたキーによって、データを処理または格納させるサーバを決定する分散データ構造またはアルゴリズムである。なお、ＤＨＴの実装としては、コンシステント・ハッシュ（CH：Consistent  Hash）が知られている。
【０００６】
具体的には、ＤＨＴは、各サーバについて、ハッシュ関数を用いて固定長ビット空間の担当エリアを決定する。そして、ＤＨＴは、ハッシュ関数を用いて格納対象のデータのキーを算出し、担当エリアのサーバに格納する。このようにして、ＤＨＴは、Ｐ２Ｐ（Peer  to  Peer）オーバレイネットワークを構成する。また、ＣＨは、システム構成の変動に柔軟に対応できるアーキテクチャとして、拡張性を有する分散ストレージとして利用されている。
【０００７】
このようなＤＨＴでは、ＩＰ（Internet  Protocol）アドレスなどの宛先情報を用いて算出したハッシュ値から担当となるサーバを決定するために、ＣＨ空間を形成する各サーバのＩＰアドレスを管理することになる。管理手法としては、各サーバがアクセス可能な専用サーバで集中管理する方式と、各サーバ内で管理する方式とがある。近年の大規模分散システムでは、可用性の観点から、各サーバ内で管理する方式が採用されることが多い。
【０００８】
各サーバ内で管理する方式の場合、サーバ台数が多くなると管理する宛先情報も多くなり、また、各サーバの死活監視や宛先情報の同期処理などを行うための通信トラフィックが大量に発生する。このようなことから、１つのサーバで保持する宛先情報を削減し、目的のサーバに到達するまでに経由するサーバの台数（以下、ホップ数と呼ぶ）を減らすルーティングアルゴリズムがある。ルーティングアルゴリズムの例としては、閉じた数直線で論理空間を形成するChordやPastyなどのアルゴリズムや、Ｎ次元トーラスを用いて論理空間を形成するCANなどのアルゴリズムが知られている。Chordを用いた場合、サーバ台数（Ｎ）に関らず、Ｏ（ｌｏｇ２Ｎ）のホップ数で目的のサーバに到達する。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特表２０１０−５０１９４２号公報
【特許文献２】特開平１１−１７７６９号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら、従来技術では、データの処理速度が十分ではない場合があるという問題がある。
【００１１】
例えば、オンライン証券取引のＷｅｂフロントシステムのように、数百マイクロ秒である１回の通信でも削減してレイテンシを下げることが競争力につながるシステムでは、Chordでもデータを処理する速度やデータ処理にかかる速度の安定性は十分とは言えない。また、ストリーミング処理のように、通信速度が最も遅い場合に処理を合わせるシステムでも、同様のことが言える。
【００１２】
具体的には、Chordは、サーバ台数に寄らず５０%以上の確率で２ホップ以上となり、１００台構成ならば最大５ホップの通信となり、１ミリ秒以上の通信性能差が発生する場合がある。つまり、複数のサーバに跨る処理が行われること自体、オーバヘッドが高いことに加え、下位層のトポロジに無関係にオーバレイのトポロジが作られる場合、下位層での無駄な通信を引き起こしやすい。このように、Chordなどのアルゴリズムを用いたとしても、システムによっては満足する処理速度を発揮できない場合がある。
【００１３】
１つの側面では、データの処理速度を高速化する情報処理装置、データ制御方法およびデータ制御プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１４】
第１の案では、情報処理装置は、クライアント端末から受信した、データの送信要求または受信要求を示すアクセス要求に、受信した順に基づく識別子を付与する付与部を有する。情報処理装置は、記憶制御部を有する。記憶制御部は、データの送受信処理を分散させる分散型ネットワークを形成する情報処理装置から、前記付与部による付与予定の識別子が付与されるアクセス要求を処理対象とする情報処理装置を探索する。そして、記憶制御部は、探索された情報処理装置を特定する情報と前記付与予定の識別子とを対応付けて記憶部に記憶させる。情報処理装置は、前記付与部によってアクセス要求に前記付与予定の識別子が付与された場合に、付与された識別子に対応付けて前記記憶部に記憶される情報を、前記クライアント端末に応答する応答部を有する。
【発明の効果】
【００１５】
データの処理速度を高速化することができる。
【図面の簡単な説明】
【００１６】
【図１】図１は、実施例１に係るシステムの全体構成例を示す図である。
【図２】図２は、実施例１に係るシステムのＣＨ空間を示す図である。
【図３】図３は、実施例２に係るクライアント端末の構成を示す機能ブロック図である。
【図４】図４は、実施例２に係るサーバの構成を示す機能ブロック図である。
【図５】図５は、キューディクショナリデータ格納部に格納される情報の例を示す図である。
【図６】図６は、送信用先読み格納部に格納される情報の例を示す図である。
【図７】図７は、メッセージ格納部に格納される情報の例を示す図である。
【図８】図８は、キューオープン処理の全体的な流れを説明する図である。
【図９】図９は、キューオープン処理におけるメッセージの遷移を説明する図である。
【図１０】図１０は、キューオープン処理の流れを示すフローチャートである。
【図１１】図１１は、キューオープン処理の流れを示すフローチャートである。
【図１２】図１２は、キューオープン処理の流れを示すフローチャートである。
【図１３】図１３は、キューオープン処理の流れを示すフローチャートである。
【図１４】図１４は、メッセージキューに対するデータ送信処理の全体的な流れを説明する図である。
【図１５】図１５は、データ送信処理におけるメッセージの遷移を説明する図である。
【図１６】図１６は、データ送信処理の流れを示すフローチャートである。
【図１７】図１７は、データ送信処理の流れを示すフローチャートである。
【図１８】図１８は、メッセージキューに対するデータ受信処理の全体的な流れを説明する図である。
【図１９】図１９は、データ受信処理におけるメッセージの遷移を説明する図である。
【図２０】図２０は、データ受信処理の流れを示すフローチャートである。
【図２１】図２１は、データ受信処理の流れを示すフローチャートである。
【図２２】図２２は、データ受信処理の流れを示すフローチャートである。
【図２３】図２３は、送信用先読み格納部処理の全体的な流れを説明する図である。
【図２４】図２４は、送信用先読み格納部処理におけるメッセージの遷移を説明する図である。
【図２５】図２５は、送信用先読み格納部処理の流れを示すフローチャートである。
【図２６】図２６は、サーバＢがＣＨ空間から離脱する場合のキューディクショナリデータの挙動を説明する図である。
【図２７】図２７は、サーバＸがＣＨ空間に参加する場合のキューディクショナリデータの挙動を説明する図である。
【図２８】図２８は、データ制御プログラムを実行するコンピュータのハードウェア構成の例を示す図である。
【発明を実施するための形態】
【００１７】
以下に、本願の開示する情報処理装置、データ制御方法およびデータ制御プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
【実施例１】
【００１８】
図１は、実施例１に係るシステムの全体構成例を示す図である。図１に示すように、このシステムは、クライアント端末１０、クライアント端末２０、クライアント端末３０、サーバＡ５０、サーバＢ６０がネットワーク５を介して相互に通信可能に接続される。図１に示したシステムは、Chordを用いた分散ハッシュテーブルを形成する。すなわち、システムは、複数のサーバに形成されるメッセージキューと、メッセージキューにデータを送信するクライアント端末と、メッセージキューからデータを読み出して受信するクライアント端末との間で、非同期連携を行うシステムである。
【００１９】
なお、ここで示した各装置の台数等はあくまで例示であり、図示したものに限定されない。また、クライアント端末とサーバとは同一の物理マシン上で動作していてもよい。つまり、図１に示したシステムは、物理マシンで構成される物理的なシステムではなく、仮想マシン等で構成される論理的なシステムであってもよい。なお、分散ハッシュテーブルを実現するアルゴリズムは、Chord以外のアルゴリズムを用いることもできる。
【００２０】
サーバＡ５０やサーバＢ６０は、クライアント端末間のデータの送受信処理を分散させる分散型ネットワークであるＣＨ空間を形成する。図２は、実施例１に係るシステムのＣＨ空間を示す図である。図２に示す各サーバは、例えばメッセージキューのキュー名のハッシュ値によって、ＣＨ空間上の位置が決まる。また、ＣＨ空間は、ＣＨ空間上の位置に基づいて各サーバをリンク状に接続した空間であり、時計周りにデータ等が転送される。そして、各サーバには、ハッシュ値で区切られた空間が担当する空間として割り振られている。また、各サーバは、データを転送するのに使用するルーティングテーブルを保持する。このルーティングテーブルには、例えば、時計回りで次に位置するサーバのＩＰ（Internet  Protocol）アドレス、リンク状に対向する位置に位置するサーバのＩＰアドレス等を記憶する。なお、ルーティングテーブルが記憶する情報は、Chordなどで一般的に用いられる情報である。
【００２１】
ここで、図２に示したＣＨ空間でクライアント端末がデータを送信する一例を説明する。クライアント端末１０は、メッセージキューＸのキュー名を指定して、キューオープンの要求をサーバＡ５０に送信する。サーバＡ５０は、受信したキュー名をハッシュ値に変換し、自装置が担当でないことを特定した後に、受信した要求に自装置のＩＰアドレスを付加してＣｈｏｒｄのルーティング手法に準じて転送する。次にこの要求を受信したサーバは、同様の手法で自装置が担当でないことを特定した後に、要求を次にサーバに転送する。
【００２２】
このようにして転送されてきた要求をサーバＢ６０が受信する。すると、サーバＢ６０は、同様の手法で自装置が担当であることを特定する。そして、サーバＢ６０は、要求に既に付加されているサーバＡ５０のＩＰアドレスを宛先として、自装置のＩＰアドレスを付加した要求を送信する。この送信要求を受信したサーバＡ５０は、受信した要求に付加されているサーバＢ６０のＩＰアドレスをクライアント端末１０に応答する。
【００２３】
クライアント端末１０は、サーバＡ５０から受信したサーバＢ６０のＩＰアドレスに対してアクセスし、サーバＢ６０との間のコネクションを確立する。このようにして、クライアント端末が指定したメッセージキューがオープンされる。その後、クライアント端末１０は、コネクションが確立されたサーバＢ６０に、メッセージキューＸ宛てのデータの送信要求を送信する。
【００２４】
サーバＢ６０は、受信した送信要求に含まれるキュー名をハッシュ値に変換し、自装置が担当であることを特定する。その後、サーバＢ６０は、要求順に増加または減少する識別子と指定されたキュー名とをハッシュ値に変換し、上述した同様の手法でデータの格納先となるサーバＣ７０を特定する。サーバＢ６０は、サーバＣ７０からＩＰアドレスを受信すると、受信したＩＰアドレスを格納先としてクライアント端末１０に送信する。そして、クライアント端末１０は、サーバＣ７０にデータを格納する。このようにして、クライアント端末１０は、メッセージキューＸを用いたデータの送信を行うことができる。なお、データを受信する場合には、上述したデータの送信処理と同様の処理が実行される。
【００２５】
図１に戻り、このような処理を実行するサーバＡ５０は、記憶部５０ａと付与部５０ｂと記憶制御部５０ｃと応答部５０ｄを有する。なお、ＣＨ空間の各サーバは同様の構成を有する。
【００２６】
付与部５０ｂは、クライアント端末１０から受信した、データの送信要求または受信要求を示すアクセス要求に、受信した順に基づく識別子を付与する。記憶制御部５０ｃは、データの送受信処理を分散させる分散型ネットワークを形成するサーバから、付与部５０ｂによる付与予定の識別子が付与されるアクセス要求を処理対象とするサーバを探索する。そして、記憶制御部５０ｃは、探索されたサーバを特定する情報と付与予定の識別子とを対応付けて記憶部５０ａに記憶させる。応答部５０ｄは、付与部５０ｂによってアクセス要求に識別子が付与された場合に、付与された識別子に対応付けて記憶部５０ａに記憶される情報を、クライアント端末１０に応答する。
【００２７】
このように、ＣＨ空間を形成するサーバは、クライアント端末からの要求の有無に関わらず、次に発行される要求に対応する格納先サーバを検索し、格納先サーバの装置情報を予め蓄積することができる。このため、システム規模が大きくなるにつれて多くなるＣＨの内部転送のオーバヘッドを削減することができる。したがって、データの処理速度を高速化することができる。
【実施例２】
【００２８】
次に、図１に示したシステムを形成する各装置の構成を説明する。なお、各クライアント端末は同様の構成を有するので、ここでは、クライアント端末１０について説明する。また、各サーバも同様の構成を有するので、ここでは、サーバＡ５０について説明する。
【００２９】
［クライアント端末の構成］
図３は、実施例２に係るクライアント端末の構成を示す機能ブロック図である。図３に示すように、クライアント端末１０は、通信インタフェース１１と、記憶部１２と、制御部１３とを有するコンピュータ装置である。なお、ここで示した処理部は、あくまで例示であり、これに限定されるものではない。例えば、クライアント端末１０は、ディスプレイなどの表示部、マウスなどの入力部、媒体からデータを読み取る媒体読取装置等を有しいてもよい。
【００３０】
通信インタフェース１１は、他の装置の通信を制御するネットワークインタフェースカードなどである。例えば、通信インタフェース１１は、サーバＡ５０のメッセージキューのオープンを要求したり、サーバＡ５０にデータを送信したり、サーバＡ５０からデータを受信したりする。また、通信インタフェース１１は、サーバＡ５０からメッセージキューの担当となるサーバのＩＰアドレスを受信したり、サーバＡ５０からデータの格納先となるサーバのＩＰアドレスを受信したりする。
【００３１】
記憶部１２は、制御部１３が実行するプログラム、アプリケーション、ライブラリ、データ等を記憶する半導体メモリ素子やハードディスクなどの記憶装置である。制御部１３は、ＯＳ（Operating  System）を実行するプロセッサなどの電子回路であり、クライアント端末１０の全体の制御を司る制御部である。制御部１３は、アプリケーション実行部１４とライブラリ実行部１５とを有する。
【００３２】
アプリケーション実行部１４は、記憶部１２に記憶されるアプリケーションを実行する処理部である。アプリケーション実行部１４は、アプリケーションを実行し、ライブラリ実行部１５に対してデータの送信または受信を要求する。
【００３３】
ライブラリ実行部１５は、メッセージ制御部１６と通信制御部１７とを有し、これらによってサーバとの通信を制御する処理部である。メッセージ制御部１６は、アプリケーション実行部１４の指示にしたがって、メッセージキューのオープン要求やデータ送信要求などの各種要求をＣＨ空間のサーバに送信する。
【００３４】
また、メッセージ制御部１６は、アプリケーションが接続を宣言したメッセージキューのキューディクショナリの宛先情報を記憶部１２に記憶させる。つまり、記憶部１２は、オープンされたメッセージキューの情報を記憶する。例えば、記憶部１２は、オープンされたメッセージキューのキュー名と、当該メッセージキューを担当するサーバのＩＰアドレスとを対応付けて記憶する。メッセージ制御部１６は、データの送信要求や受信要求を他のサーバに転送する場合には、このキューディクショナリの宛先情報にしたがって送受信を制御する。
【００３５】
通信制御部１７は、通信資源の確保を実行し、サーバとの通信を制御する処理部である。例えば、通信制御部１７は、オープンされたメッセージキューを担当するサーバとの間でコネクションを確立する。通信制御部１７は、確立されたコネクションを用いて、サーバとの間でデータのやり取りを実行する。なお、１つのメッセージキューに対して、複数のクライアントが存在してもよい。
【００３６】
［サーバの構成］
図４は、実施例２に係るサーバの構成を示す機能ブロック図である。図４に示すように、サーバＡ５０は、通信インタフェース５１と、記憶部５２と、制御部５３とを有する。なお、ここで示した処理部は、あくまで例示であり、これに限定されるものではない。例えば、サーバＡ５０は、ディスプレイなどの表示部、マウスなどの入力部、媒体からデータを読み取る媒体読取装置等を有しいてもよい。
【００３７】
通信インタフェース５１は、他の装置との通信を制御するネットワークインタフェースカードなどであり、オープンしたメッセージキューを用いてデータの送受信を実行するクライアント端末との間でコネクションを確立する。例えば、通信インタフェース５１は、メッセージキューのオープンを要求するオープン要求を他のサーバやクライアント端末から受信したり、オープン要求に対する応答を他のサーバから受信してクライアント端末に応答したりする。また、通信インタフェース５１は、データの送信要求や受信要求をクライアント端末から受信し、当該要求に対する応答をクライアント端末に送信する。また、通信インタフェース５１は、クライアント端末から格納対象のデータを受信したり、記憶部５２から読み出されたデータを送信したりする。
【００３８】
記憶部５２は、制御部５３が実行するプログラムやデータを記憶する半導体メモリ素子やハードディスクなどの記憶装置である。記憶部５２は、キューディクショナリデータ格納部５２ａと、送信用先読み格納部５２ｂと、受信用先読み格納部５２ｃと、メッセージ格納部５２ｄと、受信待ちカウンタ５２ｅとを有する。また、記憶部５２は、ＣＨ空間におけるルーティングテーブルを記憶する。なお、ここで記憶されるルーティングテーブルは、Chordなどのアルゴリズムで用いられるルーティングテーブルと同様の情報を記憶する。
【００３９】
キューディクショナリデータ格納部５２ａは、メッセージキューごとに、データの送信要求や受信要求などのメッセージを識別する識別子を生成するためのカウンタと、処理済メッセージを管理するためのカウンタとを記憶する。図５は、キューディクショナリデータ格納部に格納される情報の例を示す図である。図５に示すように、キューディクショナリデータ格納部５２ａは、キュー名と属性とカウンタ値とを対応付けて記憶する。なお、キューディクショナリデータ格納部５２ａは、キュー名と属性との組み合わせでインデックスを持つ。つまり、キューディクショナリデータ格納部５２ａは、キュー名と属性との組み合わせをキー、カウンタ値をＶａｌｕｅとするキーバリューストア構造である。
【００４０】
ここで記憶される「キュー名」は、メッセージキューに割り与えられた、メッセージキューを識別する識別子である。「属性」は、カウンタ値の属性を示し、メッセージに付与された識別子を示すメッセージ識別子用カウンタの場合には「１」が格納され、処理済のメッセージに付与されていた識別子を示す処理済メッセージ管理用カウンタの場合には「２」が格納される。「カウンタ値」は、付与された最新の識別子または処理された最新の識別子を示し、ＦＩＦＯ（First  In  First  Out）制御するための整数値が格納される。
【００４１】
図５の場合、キューＡについては、キューＡに格納された最新のデータに対応する送信要求に付与された識別子が１００であり、キューＡから読み出された最新のデータに対応する受信要求に付与された識別子が９０であることを示す。同様に、キューＢについては、キューＢに格納された最新のデータに対応する送信要求に付与された識別子が５であり、キューＢから読み出された最新のデータに対応する受信要求に付与された識別子が５であることを示す。
【００４２】
図４に戻り、送信用先読み格納部５２ｂは、メッセージキューごとに、データの送信要求に付与される予定の識別子と、当該予定の識別子に対応する宛先情報とを対応付けて記憶する。図６は、送信用先読み格納部に格納される情報の例を示す図である。図６に示すように、送信用先読み格納部５２ｂは、「カウンタ、宛先情報、next」を１つの情報とするチェーン構造で情報を記憶する。
【００４３】
ここで記憶される「カウンタ」は、送信要求に付与される予定の識別子を示し、ここでは、送信用先読み格納部５２ｂに記憶される最小のカウンタ値がチェーン構造の最初である。「宛先情報」は、具体例としてサーバのＩＰアドレスを示しているが、本発明はこれに限定されるものではない。例えば、ＤＮＳのように一般的な通信技術によって通信を解決するならば、ホスト名であってもよい。「next」は、次のデータを示すポインタである。図６の場合、識別子として１０１が付与された送信要求に含まれるデータの格納先は、ＩＰアドレスがxxx.xxx.xxx.102であるサーバＡとなることを示す。次に、識別子として１０２が付与された送信要求に含まれるデータの格納先は、ＩＰアドレスがxxx.xxx.xxx.105であるサーバＤとなることを示す。
【００４４】
受信用先読み格納部５２ｃは、メッセージキューごとに、データの受信要求に付与される予定の識別子と、当該予定の識別子に対応する宛先情報とを対応付けて記憶する。受信用先読み格納部５２ｃは、図６に示した送信用先読み格納部５２ｂと同様、「カウンタ、宛先情報、next」を１つの情報とするチェーン構造で記憶する。ここで記憶される「カウンタ」は、受信要求に付与される予定の識別子を示し、ここでは、受信用先読み格納部５２ｃに記憶される最小のカウンタ値がチェーン構造の最初である。「宛先情報」は、サーバのＩＰアドレスを示し、「next」は、次のデータを示すポインタである。
【００４５】
メッセージ格納部５２ｄは、クライアント端末から送信されたデータを物理的に記憶する。図７は、メッセージ格納部に格納される情報の例を示す図である。図７に示すように、メッセージ格納部５２ｄは、メッセージ識別子とデータとを対応付けて記憶する。つまり、メッセージ格納部５２ｄは、メッセージ識別子をキー、データをＶａｌｕｅとするキーバリューストア構造である。
【００４６】
ここで記憶される「メッセージ識別子」は、メッセージに割り与えられた、メッセージを識別する識別子である。「データ」は、クライアント端末から受信したデータである。図７の場合、キューＡは、先頭がキューＡ＃０００１のデータＡ１、次がキューＡ＃０００２のデータＡ２とする待ち行列を形成し、キューＢは、先頭がキューＢ＃００１０のデータＢ１である待ち行列を形成していることを示す。
【００４７】
受信待ちカウンタ５２ｅは、メッセージキューを識別するキュー名ごとに、データの受信待ちとなっている順に、クライアント端末の宛先情報を記憶する。例えば、受信待ちカウンタ５２ｅは、「キュー名＝キューＡ」と「宛先情報＝クライアント端末１０のＩＰアドレス」との組、「キュー名＝キューＡ」と「宛先情報＝クライアント端末２０のＩＰアドレス」との組を順に記憶する。この場合、キューＡについては、クライアント端末１０、クライアント端末２０の順に待ち行列を形成していることを示す。
【００４８】
制御部５３は、ＯＳを実行するプロセッサなどの電子回路であり、Chordなどのアルゴリズムを実行するとともに、サーバＡ５０の全体を司る処理部である。制御部５３は、クラスタ制御部５４と種別判定部５５とオープン処理部５６とメッセージ処理部５７と先読み制御部５８とを有し、これらによってデータ処理を実行する。ここでは、各処理部が実行する代表的な処理の一例を説明し、詳細については処理の流れで説明する。
【００４９】
クラスタ制御部５４は、メッセージキューを構成するサーバ群の死活監視と、構成情報の同期処理を実行する。クラスタ制御部５４は、ＣＨ空間を形成し、維持するための各種処理を実行する。例えば、クラスタ制御部５４は、ＳＮＭＰ（Simple  Network  Management  Protocol）などのプロトコルや他の監視ツールを用いて、ＣＨ空間上のサーバの死活監視を実行する。また、クラスタ制御部５４は、ＣＨ空間上のサーバの生死によって、ルーティングテーブルや各先読み格納部の更新等を実行する。
【００５０】
種別判定部５５は、他のサーバまたはクライアント端末から受信した各種要求や応答の種別を判定する処理部である。例えば、種別判定部５５は、他のサーバまたはクライアント端末から受信した要求や応答などを示すメッセージのヘッダに含まれる通信種別を参照して、メッセージの種別を判定する。例えば、種別判定部５５は、受信したメッセージがメッセージキューのオープンを要求するメッセージである場合には、当該メッセージをオープン処理部５６に出力する。また、種別判定部５５は、受信したメッセージがデータの送信や受信を要求するメッセージである場合には、当該メッセージをメッセージ処理部５７に出力する。
【００５１】
オープン処理部５６は、クライアント端末からオープン要求されたメッセージキューを解放する各処理を実行する処理部である。一例を挙げると、オープン処理部５６は、担当判定処理と転送処理と応答処理とを実行する。担当判定処理は、オープン対象のメッセージキューの担当が自装置であるか否か、つまり、オープン処理の処理担当が自装置であるか否かを判定する処理である。例えば、オープン処理部５６は、オープン要求に含まれるキュー名をハッシュ値に変換し、変換したハッシュ値が自装置の担当するハッシュ値の範囲内か否かを判定する。
【００５２】
転送処理は、オープン処理の処理担当が自装置でない場合に、Chordの手法にしたがって、オープン要求を転送する処理である。例えば、オープン処理部５６は、記憶部５２に記憶されるルーティングテーブルにしたがって、ＣＨ空間の時計回りで自装置の次に位置するサーバにオープン要求を転送する。このとき、オープン処理部５６は、他のサーバではなくクライアント端末から直接オープン要求を受信した場合、オープン要求に宛先情報として自装置のＩＰアドレスを付加して転送する。
【００５３】
応答処理は、オープン処理の処理担当が自装置である場合に、自装置の宛先情報をクライアント端末に応答する処理である。例えば、オープン処理部５６は、オープン要求がクライアント端末から直接受信したものである場合、自装置のＩＰアドレスをクライアント端末に直接応答する。また、オープン処理部５６は、オープン要求が他のサーバから転送されてきたものである場合、オープン要求に付加されている転送元のサーバのＩＰアドレスに対して、自装置のＩＰアドレスを応答する。また、オープン処理部５６は、オープン要求を担当する他のサーバからＩＰアドレスを受信した場合には、受信したＩＰアドレスをクライアント端末に応答する。
【００５４】
メッセージ処理部５７は、データの受信要求や送信要求などのメッセージをクライアント端末から受信した場合に、受信したメッセージに関する各処理を実行する処理部である。一例を挙げると、メッセージ処理部５７は、識別子付与処理、宛先判定処理、応答実行処理を実行する。
【００５５】
識別子付与処理は、データの送信要求や受信要求に対して、一定の規則性を有する識別子を生成して付与する処理である。例えば、メッセージ処理部５７は、データの送信要求が受信された場合に、当該送信要求からキュー名を抽出する。そして、メッセージ処理部５７は、抽出したキュー名と属性「１」とに対応するカウンタ値をキューディクショナリデータ格納部５２ａから特定する。その後、メッセージ処理部５７は、特定したカウンタ値を１つインクリメントした値を識別子として、データの送信要求に付与する。
【００５６】
同様に、メッセージ処理部５７は、データの受信要求が受信された場合に、当該受信要求からキュー名を抽出する。そして、メッセージ処理部５７は、抽出したキュー名と属性「２」とに対応するカウンタ値をキューディクショナリデータ格納部５２ａから特定する。その後、メッセージ処理部５７は、特定したカウンタ値を１つインクリメントした値を識別子として、データの送信要求に付与する。
【００５７】
宛先判定処理は、データの送信要求または受信要求の処理担当が自装置であるか否かを判定する処理である。例えば、メッセージ処理部５７は、識別子付与処理または他のサーバによって送信要求または受信要求に付与された識別子にしたがって、自装置が処理担当であるか否かを判定する。具体的には、メッセージ処理部５７は、データの送信要求または受信要求に付与された識別子と当該要求に含まれるキュー名とを組み合わせた値をハッシュ値に変換し、自装置の担当するハッシュ値の範囲内である場合に、自装置が処理担当であると判定する。
【００５８】
また、メッセージ処理部５７は、受信された要求に付与された識別子と要求に含まれるキュー名とを組み合わせた値をハッシュに変換し、自装置の担当するハッシュ値の範囲内でない場合に、識別子が付与された送信要求をＣＨ空間上の次のサーバに転送する。そして、メッセージ処理部５７は、処理担当のサーバからＩＰアドレスを受信した場合に、受信したＩＰアドレスをクライアント端末に応答する。
【００５９】
メッセージ処理部５７は、「識別子とキュー名」との組み合わせが、各先読み格納部に格納されている場合には、次のサーバに転送することなく、各格納部から該当する宛先情報を取得して、クライアント端末１０に応答する。
【００６０】
先読み制御部５８は、送信用先読み格納部５２ｂと受信用先読み格納部５２ｃとを更新する処理部である。例えば、先読み制御部５８は、送信用先読み格納部５２ｂまたは受信用先読み格納部５２ｃに格納されるエントリの数が最大数よりも少なくなった場合に、先読み処理を開始して、新たなエントリを格納する。なお、先読み制御部５８は、メッセージ処理部５７によって送信用先読み格納部５２ｂまたは受信用先読み格納部５２ｃに格納されるエントリが読み出されると、当該エントリを削除する。
【００６１】
例えば、キューディクショナリデータ格納部５２ａに格納されるキューＡに対応するメッセージ識別子生成用カウンタの値が「１２」であり、送信用先読み格納部５２ｂに格納されるキューＡのカウンタが「１２」、「１３」、「１４」の３つであるとする。また、送信用先読み格納部５２ｂは、キュー名ごとに最大４つのエントリを格納できるものとする。この場合、先読み制御部５８は、「キュー名＋未格納のカウンタ値」すなわち「キューＡ＋１５」をハッシュ値「ＡＡＡ」に変換する。そして、先読み制御部５８は、Chordの手法にしたがって、ＣＨ空間を形成するサーバから、ハッシュ値「ＡＡＡ」を担当するサーバを探索する。その後、先読み制御部５８は、送信用先読み格納部５２ｂに格納されるキューＡのエントリとして、探索されたサーバのＩＰアドレスとカウンタ値「１５」とを対応付けて格納する。
【００６２】
例えば、キューディクショナリデータ格納部５２ａに格納されるキューＺに対応する処理済み管理用カウンタの値が「１５」であり、受信用先読み格納部５２ｃに格納されるキューＺのカウンタが「１６」、「１７」、「１８」の３つであるとする。また、受信用先読み格納部５２ｃは、キュー名ごとに最大４つのエントリを格納できるものとする。この場合、先読み制御部５８は、「キュー名＋未格納のカウンタ値」すなわち「キューＺ＋１９」をハッシュ値「ＺＺＺ」に変換する。そして、先読み制御部５８は、Chordの手法にしたがって、ＣＨ空間を形成するサーバから、ハッシュ値「ＺＺＺ」を担当するサーバを探索する。その後、先読み制御部５８は、受信用先読み格納部５２ｃに格納されるキューＺのエントリとして、探索されたサーバのＩＰアドレスとカウンタ値「１９」とを対応付けて格納する。
【００６３】
［処理の流れ］
次に、図８から図２７を用いて図１等に示したシステムにおける処理の流れを説明する。ここでは、各処理について全体的な流れ、メッセージ遷移、フローチャートを説明する。なお、システムでやり取りされるメッセージは、通信種別、キュー名ハッシュ値、転送元サーバ識別子、宛先情報、メッセージ識別子を含むヘッダ部と、メッセージ実データを含む実データ部とを有しているものとする。
【００６４】
［キューオープン処理］
図８から図１３を用いてキューオープン処理を説明する。キューオープンとは、メッセージ・キューを利用するための接続処理のことである。図８は、キューオープン処理の全体的な流れを説明する図である。図９は、キューオープン処理におけるメッセージの遷移を説明する図である。図１０から図１３は、キューオープン処理の流れを示すフローチャートである。なお、ここではクライアント端末１０がキューオープン処理を依頼する例について説明する。
【００６５】
（全体的な流れ、メッセージ遷移）
図８に示すように、クライアント端末１０は、参加ゲートウェイとなる任意のサーバＡ５０に接続し、メッセージキューのキュー名であるキューＡを指定してオープン依頼を実行する。具体的には、図９に示すように、クライアント端末１０は、通信種別に「接続依頼（初回）」を設定し、メッセージ実データに「キューＡ」を設定したメッセージをサーバＡ５０に送信する。なお、この接続先サーバは、利用者のポリシーによって決定することができる。
【００６６】
サーバＡ５０の種別判定部５５は、受信したメッセージの通信種別から依頼された処理をオープン処理と判定する。続いて、オープン処理部５６は、メッセージ実データに設定されるキュー名のキューＡをハッシュして「xxxxxxxx」を算出し、自装置が保持するルーティングテーブルに従ってＣＨ空間内を検索する。
【００６７】
オープン処理部５６は、自装置が指定されたメッセージキューの担当でなければ、自身の識別子をメッセージに付加して、ChordなどのアルゴリズムにしたがってメッセージをＣＨ空間内に転送する。
【００６８】
具体的には、図９に示すように、サーバＡのオープン処理部５６は、メッセージ実データに「キューＡ」が設定されたメッセージの通信種別を「接続依頼（初回）」から「接続依頼（転送）」に設定変更する。そして、オープン処理部５６は、当該メッセージのキュー名ハッシュ値に、算出したハッシュ値である「xxxxxxxx」を設定し、転送元サーバ識別子に「サーバＡ」を設定して、次のサーバに転送する。なお、サーバＡの識別子としては、ホスト名やＩＰアドレスを用いることができる。ここで、メッセージが何回か転送されて、メッセージキューの担当であるサーバＢ６０に到達したとする。
【００６９】
その後、サーバＢ６０の種別判定部６５は、受信したメッセージの通信種別から、依頼された処理をオープン処理と判定する。続いて、オープン処理部６６は、受信されたメッセージのキュー名ハッシュ値に設定される値「xxxxxxxx」に基づいて、指定されたメッセージキューの担当が自装置であると判定する。そして、オープン処理部６６は、受信したメッセージの宛先情報に自装置のＩＰアドレス等を設定して、メッセージの転送元サーバ識別子に設定される転送元サーバに転送する。
【００７０】
具体的には、図９に示すように、サーバＢ６０のオープン処理部６６は、サーバＡ５０から受信したメッセージの通信種別を「接続依頼（転送）」から「接続依頼（応答）」に設定変更したメッセージを生成する6。そして、オープン処理部６６は、当該メッセージの宛先情報にＩＰアドレス「xxx.xxx.xxx.xxx」を設定する。その後、オープン処理部６６は、当該メッセージの転送元サーバ識別子に設定された「サーバＡ」に対して、上述した情報を新たに設定したメッセージを転送する。
【００７１】
サーバＡ５０のオープン処理部５６は、サーバＢ６０から受信したメッセージをクライアント端末１０に応答する。具体的には、図９に示すように、サーバＡ５０のオープン処理部５６は、サーバＢ６０から受信したメッセージの通信種別を「接続依頼（応答）」から「接続（転送）」に設定変更して、クライアント端末１０に送信する。
【００７２】
クライアント端末１０は、サーバＡ５０から受信したメッセージに基づいて、指定メッセージキューを担当するサーバＢ６０との間でコネクションを確立し、キューオープン依頼を実行する。以降、クライアント端末１０は、キューＡとのやり取りはサーバＢ６０に直接通信して行う。
【００７３】
具体的には、図９に示すように、クライアント端末１０は、サーバＡ５０から受信したメッセージの通信種別を「接続（転送）」から「接続依頼（初回）」に設定変更する。そして、クライアント端末１０は、受信したメッセージの宛先情報に設定されるＩＰアドレス「xxx.xxx.xxx.xxx」に対して、設定変更したメッセージを送信する。
【００７４】
サーバＢ６０の種別判定部６５は、受信したメッセージの通信種別から、依頼された処理をオープン処理と判定する。続いて、オープン処理部６６は、受信されたメッセージのキュー名ハッシュ値に設定されて値「xxxxxxxx」に基づいて、指定されたメッセージキューの担当が自装置であると判定する。その後、オープン処理部６６は、キューディクショナリデータ格納部５２ａに、キューＡのデータが生成済みであるか否かを判定する。そして、オープン処理部６６は、キューディクショナリデータがなければメッセージ識別子生成用カウンタと処理済メッセージ管理用カウンタとを新たに生成する。一方、オープン処理部６６は、キューディクショナリデータがあるまたは生成された場合、メッセージを生成してクライアント端末１０に応答してコネクションを確立する。
【００７５】
具体的には、図９に示すように、サーバＢ６０のオープン処理部６６は、クライアント端末１０から受信したメッセージの通信種別を「接続（初回）」から「接続（完了）」に変更して、クライアント端末１０に応答する。以降、クライアント端末１０は、キューＡを用いてメッセージの送受信が可能となる。
【００７６】
（フローチャート）
続いて、図１０から図１３を用いて上記した処理のフローチャートを説明する。ここでは、クライアント端末１０がキューＡのオープンを依頼する例で説明する。図１０に示すように、クライアント端末１０は、任意のサーバＡ５０に接続する（Ｓ１０１）。そして、クライアント端末１０は、通信種別に「接続依頼（初回）」を設定し（Ｓ１０２）、メッセージ実データに「キューＡ」を設定したメッセージを生成して（Ｓ１０３）、サーバＡ５０に送信して接続依頼を実行する（Ｓ１０４）。
【００７７】
サーバＡ５０の種別判定部５５は、クライアント端末１０からメッセージを受信すると（Ｓ１０５）、メッセージの通信種別を参照して通信種別を判定する（Ｓ１０６）。そして、種別判定部５５が通信種別を「接続依頼（初回）」と判定すると、オープン処理部５６は、メッセージのメッセージ実データに設定されたキューＡをハッシュ値に変換し（Ｓ１０７）、自サーバが当該ハッシュ値の担当か否かを判定する（Ｓ１０８）。
【００７８】
続いて、サーバＡ５０のオープン処理部５６は、自サーバが担当であると判定した場合（Ｓ１０８肯定）、メッセージ実データに設定されたキューＡのディクショナリデータがキューディクショナリデータ格納部５２ａに存在するか否かを判定する（Ｓ１０９）。
【００７９】
そして、サーバＡ５０は、キューＡのディクショナリデータが存在しない場合（Ｓ１０９否定）、Ｓ１１０とＳ１１１を実行する。すなわち、オープン処理部５６は、キューＡのメッセージ識別子用カウンタと処理済メッセージ管理用カウンタとをキューディクショナリデータ格納部５２ａに新たに生成して初期化する。その後、先読み制御部５８は、先読み処理を開始する（Ｓ１１１）。なお、キューＡのディクショナリデータがキューディクショナリデータ格納部５２ａに存在する場合（Ｓ１０９肯定）、サーバＡ５０は、Ｓ１１０とＳ１１１を実行することなく、Ｓ１１２を実行する。
【００８０】
その後、サーバＡ５０のオープン処理部５６は、メッセージの宛先情報にサーバＡのＩＰアドレスを設定してクライアント接続情報を生成し（Ｓ１１２）、メッセージの通信種別を「接続（完了）」に設定する（Ｓ１１３）。そして、オープン処理部５６は、Ｓ１１２とＳ１１３で生成したメッセージをクライアント端末１０に応答する（Ｓ１１４）。その後は、後述する図１３の処理がクライアント端末１０で実行される。
【００８１】
一方、Ｓ１０８において、サーバＡ５０のオープン処理部５６は、自サーバがオープン処理の担当でないと判定した場合（Ｓ１０８否定）、Ｓ１１５とＳ１１６とを実行して転送対象のメッセージを生成する。すなわち、オープン処理部５６は、クライアント端末１０から受信したメッセージのキュー名ハッシュ値にＳ１０７で得られたハッシュ値を設定するとともに、転送元サーバ識別子にサーバＡを識別するホスト名等を設定する。さらに、オープン処理部５６は、通信種別に「接続依頼（転送）」を設定したメッセージを生成する。
【００８２】
その後、オープン処理部５６は、Chordの手法にしたがって、生成したメッセージすなわち接続依頼を次のサーバに転送する（Ｓ１１７）。この接続依頼を受信したサーバは、Ｓ１０６以降と同様の処理を実行する。
【００８３】
また、Ｓ１０６において、サーバＢ５０の種別判定部５５が通信種別を「接続依頼（転送）」と判定すると、オープン処理部５６は、図１１に示すように、受信したメッセージのキュー名ハッシュ値に設定されるハッシュ値を取得する（Ｓ２０１）。そして、オープン処理部５６は、取得したハッシュ値が自サーバの担当するハッシュ値か否かを判定する（Ｓ２０２）。
【００８４】
続いて、サーバＢ５０のオープン処理部５６は、自サーバが担当であると判定した場合（Ｓ２０２肯定）、受信したメッセージの宛先情報に自サーバのＩＰアドレスを設定し（Ｓ２０３）、通信種別を「接続依頼（応答）」に変更する（Ｓ２０４）。その後、オープン処理部５６は、受信したメッセージの転送元サーバ識別子に設定される識別子を取得し（Ｓ２０５）、取得した識別子に対応するサーバに、Ｓ２０３およびＳ２０４で生成したメッセージをChordの手法にしたがって転送する（Ｓ２０６）。この接続依頼を受信したサーバが、図１０のＳ１０６以降の処理を実行する。
【００８５】
一方、サーバＢ５０のオープン処理部５６は、自サーバが担当でないと判定した場合（Ｓ２０２否定）、受信したメッセージをChordの手法にしたがって、次のサーバに転送する（Ｓ２０７）。この接続依頼を受信したサーバが、図１０のＳ１０６以降の処理を実行する。
【００８６】
図１０のＳ１０６に戻って、サーバＡ５０の種別判定部５５が通信種別を「接続依頼（応答）」と判定すると、オープン処理部５６は、図１２に示すように、受信したメッセージの転送元サーバ識別子に設定される識別子を取得する（Ｓ３０１）。
【００８７】
続いて、サーバＡ５０のオープン処理部５６は、取得した識別子が自サーバの識別子であると判定した場合（Ｓ３０２肯定）、受信したメッセージの通信種別を「接続（転送）」に変更して（Ｓ３０３）、クライアント端末１０に応答する（Ｓ３０４）。その後は、後述する図１３の処理がクライアント端末１０で実行される。
【００８８】
一方、サーバＡ５０のオープン処理部５６は、取得した識別子が自サーバの識別子でないと判定した場合（Ｓ３０２否定）、Chordの手法にしたがって、次のサーバにメッセージを転送する（Ｓ３０５）。その後、この接続依頼を受信したサーバが、図１０のＳ１０６以降の処理を実行する。
【００８９】
また、図１０のＳ１１４または図１２のＳ３０４で送信されたメッセージを受信したクライアント端末１０は、図１３の処理を実行する。図１３に示すように、クライアント端末１０は、サーバＡ５０等からメッセージを受信し（Ｓ４０１）、受信したメッセージの通信種別を判定する（Ｓ４０２）。
【００９０】
そして、クライアント端末１０は、メッセージの通信種別に「接続（完了）」が設定されている場合には、処理を終了する。また、クライアント端末１０は、メッセージの通信種別に「接続（転送）」が設定されている場合には、メッセージの宛先情報に設定される情報を取得し（Ｓ４０３）、取得した情報を用いて、宛先となるサーバと接続する（Ｓ４０４）。続いて、クライアント端末１０は、受信されたメッセージの通信種別に「接続依頼（初回）」に設定し（Ｓ４０５）、接続したサーバに対して接続依頼を実行する（Ｓ４０６）。
【００９１】
なお、メッセージの通信種別が「接続（完了）」または「接続（転送）」以外である場合には、クライアント端末１０は、図１６または図２０に示した処理を実行する。また、サーバＡは、Ｓ１０６において、メッセージの通信種別が「接続依頼（初回）」、「接続依頼（転送）」、「接続依頼（応答）」以外であると判定した場合、図１６または図２０に示した処理を実行する。
【００９２】
［データ送信処理］
次に、図１４から図１７を用いて、クライアント端末１０がメッセージキューに対してデータを送信する処理を説明する。図１４は、メッセージキューに対するデータ送信処理の全体的な流れを説明する図である。図１５は、データ送信処理におけるメッセージの遷移を説明する図である。図１６から図１７は、データ送信処理の流れを示すフローチャートである。なお、ここではクライアント端末１０が、サーバＢ６０に対して、キューＡへのデータ送信を実行する例について説明する。
【００９３】
（全体的な流れ、メッセージ遷移）
図１４に示すように、クライアント端末１０は、サーバＢ６０に対して、キュー名を指定したメッセージ送信依頼を実行する。具体的には、図１５に示すように、クライアント端末１０は、通信種別に「メッセージ送信（初回）」を設定し、メッセージ実データに「メッセージデータ」を設定したメッセージをサーバＢ６０に送信する。なお、メッセージデータが送信対象データである。
【００９４】
続いて、サーバＢ６０のメッセージ処理部６７は、キューＡに対応するメッセージ識別子生成用カウンタを１つ増やし、その後のカウンタ値をキーとして送信用先読み格納部５２ｂを検索する。そして、メッセージ処理部６７は、カウンタ値に対応するＩＰアドレスが送信用先読み格納部５２ｂから見つからなかった場合には、「キュー名＋カウンタ」をキーとしてハッシュ値に変換する。続いて、メッセージ処理部６７は、Chordの手法にしたがってルーティングを開始して、当該ハッシュ値を担当するサーバを探索する。一方、メッセージ処理部６７は、カウンタ値に対応するＩＰアドレスが送信用先読み格納部５２ｂから見つかった場合には、該当するデータを送信用先読み格納部５２ｂから削除する。
【００９５】
そして、サーバＢ６０のメッセージ処理部６７は、データの格納先サーバの宛先情報をクライアント端末１０に応答する。具体的には、図１５に示すように、メッセージ処理部６７は、クライアント端末１０から受信したメッセージの通信種別を「メッセージ受信（転送）」に変更し、Chordの手法によって特定されたサーバＣ７０のＩＰアドレス「yyy.yyy.yyy.yyy」を宛先情報に設定する。さらに、メッセージ処理部６７は、当該メッセージのメッセージ識別子に、担当サーバの検索に用いた「キュー名＋カウンタ」を示す「キュー名＃０００１」を設定する。その後、メッセージ処理部６７は、このようにして生成したメッセージをクライアント端末１０に応答する。なお、サーバＢ６０自体が格納先サーバである場合には、メッセージ処理部６７は、データの格納結果を応答する。
【００９６】
このとき、メッセージ処理部６７は、受信待ちカウンタにキューＡのエントリがある場合には、すでにメッセージ受信依頼をして待ち状態になっているクライアント端末が存在すると判定する。このため、メッセージ処理部６７は、このタイミングで、該当クライアントに対して未処理メッセージの発生イベントを通知して、該当エントリの受信を完了させる。
【００９７】
そして、クライアント端末１０は、受信した宛先情報を元に、該当サーバＣ７０と通信を実行する。具体的には、図１５に示すように、クライアント端末１０は、サーバＢ６０から受信したメッセージの通信種別を「メッセージ送信（格納）」に変更したメッセージを、サーバＣ７０に送信する。
【００９８】
続いて、クライアント端末１０からメッセージを受信したサーバＣ７０は、キューＡに対応付けてメッセージデータを格納し、その結果をクライアント端末１０に応答する。具体的には、図１５に示すように、サーバＣ７０は、受信したメッセージの通信種別を「メッセージ（格納完了）」に変更するとともに、宛先情報とメッセージ実データとを初期化したメッセージをクライアント端末１０に送信する。
【００９９】
その後、クライアント端末１０は、メッセージ送信すなわちデータ格納が完了したことをサーバＢ６０に通知する。具体的には、図１５に示すように、クライアント端末１０は、サーバＣ７０から受信したメッセージの通信種別を「メッセージ送信（確定）」に変更して、サーバＢ６０に送信する。
【０１００】
このとき、サーバＢ６０は、メッセージの受信待ちがある場合、すなわち、受信待ちカウンタ５２ｅにキューＡに対応するエントリが存在する場合には、クライアント端末１０から受信したメッセージを更新して、受信待ちクライアント端末に通知する。具体的には、図１５に示すように、サーバＢ６０は、クライアント端末１０から受信したメッセージの通信種別を「メッセージ受信（滞留発生）」に変更し、宛先情報にサーバＣのＩＰアドレス「yyy.yyy.yyy.yyy」を設定したメッセージを受信待ちクライアント端末に通知する。
【０１０１】
（フローチャート）
続いて、図１６と図１７を用いて上記した処理のフローチャートを説明する。なお、ここでは、メッセージキューＡを指定して処理が実行されるものとする。図１６に示すように、クライアント端末１０は、通信種別に「メッセージ送信（初回）」を設定し（Ｓ５０１）、メッセージ実データに「メッセージデータ」を格納して（Ｓ５０２）、当該メッセージをサーバＢ６０に送信して通信を実行する（Ｓ５０３）。
【０１０２】
サーバＢ６０の種別判定部６５は、クライアント端末１０からメッセージを受信し（Ｓ５０４）、メッセージの通信種別を参照して通信種別を判定する（Ｓ５０５）。そして、種別判定部６５が通信種別を「メッセージ送信（初回）」と判定すると、メッセージ処理部６７は、キューＡに対応付けてキューディクショナリデータ格納部５２ａに格納されるメッセージ識別子用カウンタをインクリメントする（Ｓ５０６）。続いて、メッセージ処理部６７は、「キュー名＋カウンタ値」とするメッセージ識別子を生成して、クライアント端末１０から受信したメッセージのメッセージ識別子に設定する（Ｓ５０７）。その後、メッセージ処理部６７は、生成したメッセージ識別子に含まれるカウンタ値をキーとして送信用先読み格納部５２ｂを参照する（Ｓ５０８）。
【０１０３】
そして、サーバＢ６０のメッセージ処理部６７は、メッセージ識別子に対応した宛先情報が格納されている場合（Ｓ５０９肯定）、送信用先読み格納部５２ｂから該当する情報を削除して、参照ポインタを移動させる（Ｓ５１０）。一方、メッセージ処理部６７は、メッセージ識別子に対応した宛先情報が格納されていない場合（Ｓ５０９否定）、「キュー名＋カウンタ値」をハッシュ値に変換し、Chordの手法にしたがって、当該メッセージを格納する担当サーバを検索した後に（Ｓ５１１）、Ｓ５１２を実行する。
【０１０４】
続いて、サーバＢ６０のメッセージ処理部６７は、宛先が自サーバすなわちデータの格納先が自サーバである場合（Ｓ５１２肯定）、Ｓ５１３を実行する。すなわち、メッセージ処理部６７は、受信したメッセージのメッセージ実データに格納される「メッセージデータ」を、キュー名に対応付けてメッセージ格納部５２ｄに格納する。その後、メッセージ処理部６７は、受信したメッセージの通信種別を「メッセージ送信（完了）」に変更して（Ｓ５１４）、図１７の処理を実行する。
【０１０５】
一方、サーバＢ６０のメッセージ処理部６７は、宛先が自サーバすなわちデータの格納先が自サーバでない場合（Ｓ５１２否定）、Ｓ５１５を実行する。すなわち、メッセージ処理部６７は、受信したメッセージの宛先情報に、Chordの手法にしたがって特定したサーバＣ７０のＩＰアドレスを設定する。その後、メッセージ処理部６７は、当該メッセージの通信種別を「メッセージ送信（転送）」に変更して（Ｓ５１６）、図１７のＳ６０４以降処理を実行する。
【０１０６】
また、Ｓ５０５において、種別判定部６５が通信種別を「メッセージ送信（格納）」と判定すると、メッセージ処理部６７は、Ｓ５１７を実行する。すなわち、メッセージ処理部６７は、受信したメッセージのメッセージ実データに格納される「メッセージデータ」を、キュー名に対応付けてメッセージ格納部５２ｄに格納する。その後、メッセージ処理部６７は、受信したメッセージの通信種別を「メッセージ送信（格納完了）」に変更して（Ｓ５１８）、図１７のＳ６０４以降処理を実行する。
【０１０７】
また、Ｓ５０５において、種別判定部６５が通信種別を「メッセージ（確定）」であると判定すると、メッセージ処理部６７は、Ｓ５０６からＳ５１８を実行することなく、図１７の処理を実行する。また、Ｓ５０５において、通信種別が「メッセージ送信（格納）」、「メッセージ初回」、「メッセージ（確定）」のいずれでもないと判定されると、メッセージ処理部６７は、図１６または図２０を実行する。
【０１０８】
続いて、図１７に示すように、サーバＢ６０のメッセージ処理部６７は、キューＡに対応するエントリが受信待ちカウンタ５２ｅに格納されている場合（Ｓ６０１肯定）、Ｓ６０２を実行する。すなわち、メッセージ処理部６７は、受信待ちカウンタ５２ｅに格納される該当エントリのクライアント端末に、未処理メッセージの発生を通知する。具体的には、メッセージ処理部６７は、図１６で生成されたメッセージの通信種別を「メッセージ受信（滞留発生）」に変更したメッセージを該当クライアント端末に送信する。一方、メッセージ処理部６７は、キューＡに対応するエントリが受信待ちカウンタ５２ｅに格納されていない場合（Ｓ６０１否定）、Ｓ６０２を実行することなく、Ｓ６０３を実行する。
【０１０９】
続いて、サーバＢ６０のメッセージ処理部６７は、処理対象となっているメッセージの通信種別が「メッセージ送信（確定）」であるか否かを判定する（Ｓ６０３）。そして、メッセージ処理部６７は、通信種別が「メッセージ送信（確定）」である場合（Ｓ６０３肯定）、処理を終了する。
【０１１０】
一方、サーバＢ６０のメッセージ処理部６７は、通信種別が「メッセージ送信（確定）」でない場合（Ｓ６０３否定）、対象となっているメッセージすなわち図１６等で生成されたメッセージ識別子、ＩＰアドレスをクライアント端末１０に応答する（Ｓ６０４）。
【０１１１】
クライアント端末１０は、サーバＢ６０から応答を受信し（Ｓ６０５）、受信した応答であるメッセージの通信種別を判定する（Ｓ６０６）。そして、クライアント端末１０は、メッセージの通信種別が「メッセージ送信（完了）」である場合には、処理を終了する。
【０１１２】
一方、クライアント端末１０は、メッセージの通信種別が「メッセージ送信（転送）」である場合には、メッセージの宛先情報に設定されるＩＰアドレスを取得する（Ｓ６０７）。続いて、クライアント端末１０は、取得したＩＰアドレスに該当するサーバＣ６０に接続する（Ｓ６０８）。その後、クライアント端末１０は、受信したメッセージの通信種別に「メッセージ送信（格納）」を変更して（Ｓ６０９）、当該メッセージをサーバＣ６０に送信して通信を実行する（Ｓ６１０）。
【０１１３】
また、クライアント端末１０は、メッセージの通信種別が「メッセージ送信（格納完了）」である場合には、当該メッセージの通信種別を「メッセージ送信（確定）」に変更した後（Ｓ６１１）、キューディレクトリサーバであるサーバＢ６０に送信する（Ｓ６１２）。
【０１１４】
なお、クライアント端末１０は、メッセージの通信種別が「メッセージ送信（完了）」、「メッセージ送信（転送）」、「メッセージ送信（格納完了）」のいずれでもない場合には、図１６や図２０の処理を実行する。
【０１１５】
［データ受信処理］
次に、図１８から図２２を用いて、クライアント端末１０がメッセージキューからデータを受信する処理を説明する。図１８は、メッセージキューに対するデータ受信処理の全体的な流れを説明する図である。図１９は、データ受信処理におけるメッセージの遷移を説明する図である。図２０から図２２は、データ受信処理の流れを示すフローチャートである。なお、ここではクライアント端末１０が、キュー名がキューＡからデータを受信する例について説明する。
【０１１６】
（全体的な流れ、メッセージ遷移）
図１８に示すように、クライアント端末１０は、サーバＢ６０に対して、キュー名を指定したメッセージ受信依頼を実行する。具体的には、図１９に示すように、クライアント端末１０は、通信種別に「メッセージ受信（初回）」を設定したメッセージをサーバＢ６０に送信する。なお、メッセージデータが送信対象データである。
【０１１７】
続いて、サーバＢ６０のメッセージ処理部６７は、キューＡに対応するメッセージ識別子生成用カウンタの値と処理済メッセージ管理用カウンタの値とを比較する。同じだった場合、メッセージ処理部６７は、未処理メッセージが存在しないと判定し、クライアント情報としてキュー名とクライアント識別情報とを受信待ちカウンタ５２ｅに格納し、一旦応答をクライアント端末１０に応答する。このとき、クライアント端末１０は、サーバＢ６０から未処理メッセージ発生イベントが通知されるまで待機状態となる。なお、クライアント識別情報としては、ＩＰアドレス、プロセスＩＤなどを用いることができる。
【０１１８】
一方、メッセージ処理部６７は、メッセージ識別子生成用カウンタの値が処理済メッセージ管理用カウンタの値よりも大きい場合、処理済メッセージ管理用カウンタの値をインクリメントする。そして、メッセージ処理部６７は、カウンタの値をキーにして、受信用先読み格納部５２ｃを検索する。検索でヒットしなかった場合、メッセージ処理部６７は、宛先情報を取得するために、「キュー名＋カウンタ値」をハッシュ値に変換し、Chordの手法にしたがって探索する。ヒットした場合、メッセージ処理部６７は、該当エントリを受信用先読み格納部５２ｃから削除する。
【０１１９】
そして、サーバＢ６０のメッセージ処理部６７は、データの格納先サーバの宛先情報をクライアント端末１０に応答する。具体的には、図１９に示すように、メッセージ処理部６７は、クライアント端末１０から受信したメッセージの通信種別を「メッセージ受信（転送）」に変更し、Chordの手法によって特定されたサーバＣ７０のＩＰアドレス「yyy.yyy.yyy.yyy」を宛先情報に設定する。さらに、メッセージ処理部６７は、当該メッセージのメッセージ識別子に、担当サーバの検索に用いたキューである「キュー名＋カウンタ」を示す「キュー名＃０００１」を設定する。その後、メッセージ処理部６７は、このようにして生成したメッセージをクライアント端末１０に応答する。なお、サーバＢ６０自体が格納先サーバである場合には、メッセージ処理部６７は、データの格納結果を応答する。
【０１２０】
そして、クライアント端末１０は、受信した宛先情報を元に、該当サーバＣ７０と通信を実行する。具体的には、図１９に示すように、クライアント端末１０は、サーバＢ６０から受信したメッセージの通信種別を「メッセージ送信（獲得）」に変更したメッセージを、サーバＣ７０に送信する。
【０１２１】
続いて、クライアント端末１０からメッセージを受信したサーバＣ７０は、キューＡに対応付けてメッセージ格納部５２ｄに格納されるデータをクライアント端末１０に応答する。具体的には、図１９に示すように、サーバＣ７０は、受信したメッセージの通信種別を「メッセージ（獲得完了）」に変更して、メッセージ実データにメッセージ格納部５２ｄから取得した「メッセージデータ」を格納する。さらに、サーバＣ７０は、当該メッセージの宛先情報を初期化してクライアント端末１０に送信する。
【０１２２】
その後、クライアント端末１０は、メッセージ受信すなわちデータ獲得が完了したことをサーバＢ６０に通知する。具体的には、図１９に示すように、クライアント端末１０は、サーバＣ７０から受信したメッセージの通信種別を「メッセージ受信（確定）」に変更して、サーバＢ６０に送信する。
【０１２３】
このとき、サーバＢ６０は、メッセージの受信待ちがある場合、すなわち、受信待ちカウンタ５２ｅにキューＡに対応するエントリが存在する場合には、クライアント端末１０から受信したメッセージを更新して、受信待ちクライアント端末に通知する。具体的には、図１９に示すように、サーバＢ６０は、クライアント端末１０から受信したメッセージの通信種別を「メッセージ受信（滞留発生）」に変更し、宛先情報にサーバＣのＩＰアドレス「yyy.yyy.yyy.yyy」を設定したメッセージを受信待ちクライアント端末に通知する。
【０１２４】
（フローチャート）
続いて、図２０と図２１を用いて上記した処理のフローチャートを説明する。なお、ここでは、メッセージキューＡを指定して処理が実行されるものとする。図２０に示すように、クライアント端末１０は、通信種別に「メッセージ受信（初回）」を設定し（Ｓ７０１）、当該メッセージをサーバＢ６０に送信して通信を実行する（Ｓ７０２）。
【０１２５】
サーバＢ６０の種別判定部６５は、クライアント端末１０からメッセージを受信し（Ｓ７０３）、メッセージの通信種別を参照して通信種別を判定する（Ｓ７０４）。そして、種別判定部６５が通信種別を「メッセージ受信（初回）」と判定すると、メッセージ処理部６７は、キューＡに対応付けられたエントリが受信待ちカウンタ５２ｅに存在するか否かを判定する（Ｓ７０５）。
【０１２６】
そして、サーバＢ６０のメッセージ処理部６７は、受信待ちカウンタ５２ｅにエントリが存在しない場合（Ｓ７０５否定）、キューディクショナリデータ格納部５２ａを参照してＳ７０６を実行する。すなわち、メッセージ処理部６７は、キューＡに対応するメッセージ識別子生成用カウンタの値と処理済メッセージ管理用カウンタの値とが一致するか否かを判定する。
【０１２７】
サーバＢ６０のメッセージ処理部６７は、値が一致しない場合すなわちメッセージ識別子生成用カウンタの値の方が大きい場合（Ｓ７０６否定）、処理済メッセージ管理用カウンタをインクリメントする（Ｓ７０７）。その後、メッセージ処理部６７は、「キュー名＋カウンタ値」とするメッセージ識別子を生成して、クライアント端末１０から受信したメッセージのメッセージ識別子に設定する（Ｓ７０８）。続いて、メッセージ処理部６７は、受信用先読み格納部５２ｃからメッセージ識別子に対応するエントリを削除し、参照ポインタを移動させる（Ｓ７０９）。
【０１２８】
ここで、サーバＢ６０の先読み制御部６８は、メッセージの送受信とは非同期に先読み処理を実行して、受信用先読み格納部５２ｃにエントリを補充する（Ｓ７１０）。
【０１２９】
続いて、図２１に示すように、サーバＢ６０のメッセージ処理部６７は、受信用先読み格納部５２ｃから特定した宛先が自サーバすなわちデータの格納先が自サーバである場合（Ｓ７１１肯定）、Ｓ７１２を実行する。すなわち、メッセージ処理部６７は、キューＡに対応付けてメッセージ格納部５２ｄに格納されるデータを取得して、クライアント端末１０から受信したメッセージのメッセージ実データに格納する。その後、メッセージ処理部６７は、当該メッセージの通信種別に「メッセージ受信（完了）」を設定して（Ｓ７１３）、当該メッセージをクライアント端末１０に応答する（Ｓ７１４）。なお、Ｓ７１４の実行後、クライアント端末１０では図２２の処理が実行される。
【０１３０】
一方、サーバＢ６０のメッセージ処理部６７は、受信用先読み格納部５２ｃから特定した宛先が自サーバでない場合（Ｓ７１１否定）、「キュー名＋カウンタ値」をハッシュ値に変換し、Chordに手法に従ってデータ格納先となるサーバを探索してＳ７１５を実行する。すなわち、メッセージ処理部６７は、クライアント端末１０から受信したメッセージの宛先情報に、探索されたサーバＣ７０のＩＰアドレスを設定する。さらに、メッセージ処理部６７は、当該メッセージの通信種別に「メッセージ受信（転送）」を設定した後（Ｓ７１６）、当該メッセージをクライアント端末１０に応答する（Ｓ７１７）。
【０１３１】
また、図２０に戻って、Ｓ７０５において、受信待ちカウンタ５２ｅにエントリが存在すると判定した場合（Ｓ７０５肯定）、サーバＢ６０のメッセージ処理部６７は、Ｓ７１８を実行する。同様に、Ｓ７０６において、メッセージ識別子生成用カウンタの値と処理済メッセージ管理用カウンタの値とが一致すると判定した場合（Ｓ７０６肯定）、サーバＢ６０のメッセージ処理部６７は、Ｓ７１８を実行する。すなわち、メッセージ処理部６７は、受信待ちカウンタ５２ｅに、キュー名とクライアント端末の識別情報（ＩＰアドレス、プロセスＩＤなど）とを対応付けた新たなエントリを追加する。その後、メッセージ処理部６７は、クライアント端末１０から受信したメッセージの通信種別に「メッセージ受信（待機）」を設定して（Ｓ７１９）、当該メッセージをクライアント端末１０に応答する（Ｓ７２０）。その後、クライアント端末１０にて図２２の処理が実行される。
【０１３２】
また、Ｓ７０４において種別判定部６５が通信種別を「メッセージ受信（獲得）」と判定すると、サーバＢ６０のメッセージ処理部６７は、Ｓ７２１を実行する。すなわち、メッセージ処理部６７は、キューＡに対応付けてメッセージ格納部５２ｄに格納されるデータを取得して、クライアント端末１０から受信したメッセージのメッセージ実データに格納する。その後、メッセージ処理部６７は、当該メッセージの通信種別に「メッセージ受信（獲得完了）」を設定して（Ｓ７２２）、Ｓ７１７以降を実行する。
【０１３３】
また、Ｓ７０４において、サーバＢ６０のメッセージ処理部６７は、通信種別を「メッセージ受信（確定）」と判定した場合、図２２を実行する。また、Ｓ７０４において、メッセージ処理部６７は、通信種別を「メッセージ受信（確定）」、「メッセー受信（初回）」、「メッセージ受信（獲得）」以外と判定した場合、図１７または図２１を実行する。
【０１３４】
続いて、図２１に示すように、サーバＢ６０のメッセージ処理部６７は、キューＡに対応するエントリが受信待ちカウンタ５２ｅに格納されている場合（Ｓ８０１肯定）、Ｓ８０２を実行する。すなわち、メッセージ処理部６７は、受信待ちカウンタ５２ｅに格納される該当エントリのクライアント端末に未処理メッセージの発生を通知する。Ｓ８０２実行後、図２０のＳ７０７の処理が実行される。
【０１３５】
一方、メッセージ処理部６７は、キューＡに対応するエントリが受信待ちカウンタ５２ｅに格納されていない場合（Ｓ８０１否定）、処理を終了する。なお、メッセージ処理部６７は、図２１の処理を、図２０とは非同期に実行する。
【０１３６】
続いて、図２２に示すように、クライアント端末１０は、サーバＢ６０から受信したメッセージの通信種別に基づいて種別を判定する（Ｓ９０１とＳ９０２）。そして、クライアント端末１０は、通信種別が「メッセージ受信（完了）」である場合には、処理を終了する。
【０１３７】
一方、クライアント端末１０は、通信種別が「メッセージ受信（転送）」である場合、受信したメッセージの宛先情報からＩＰアドレスを取得し（Ｓ９０３）、取得したＩＰアドレスに該当するサーバＣ７０に接続する（Ｓ９０４）。その後、クライアント端末１０は、受信したメッセージの通信種別を「メッセージ受信（獲得）」に設定した後（Ｓ９０５）、当該メッセージをサーバＣ７０に送信して通信を実行する（Ｓ９０６）。すると、サーバＣ７０において図２０のＳ７０３以降の処理を実行される。
【０１３８】
また、クライアント端末１０は、通信種別が「メッセージ受信（待機）」である場合、サーバＢ６０から、通信種別が「メッセージ受信（完了）」または「メッセージ受信（転送）」であるメッセージの受信待ちとなる（Ｓ９０７）。
【０１３９】
また、クライアント端末１０は、通信種別が「メッセージ受信（獲得完了）」である場合、受信したメッセージの通信種別を「メッセージ受信（確定）」に設定した後（Ｓ９０８）、当該メッセージをサーバＣ７０に送信して通信を実行する（Ｓ９０９）。すると、サーバＣ７０において図２０のＳ７０３以降の処理を実行される。
【０１４０】
また、クライアント端末１０が通信種別を「メッセージ受信（転送）」、「メッセージ受信（待機）」、「メッセージ受信（獲得完了）」、「メッセージ受信（完了）」、以外と判定した場合、図１７または図２１の処理が実行される。
【０１４１】
［先読みデータ更新処理］
次に、図２３から図２５を用いて、サーバＢ６０が送信用先読み格納部６２ｂに格納されるキューＡの情報を更新する例について説明する。なお、各サーバは同一の処理を実行することができる。また、受信用先読み格納部６２ｃについても、後述する処理におけるメッセージ識別子生成用カウンタを処理済メッセージ管理用カウンタに読み替えた処理を実行することで、同様に処理することができる。
【０１４２】
（全体的な流れ、メッセージ遷移）
図２３は、送信用先読み格納部処理の全体的な流れを説明する図である。図２４は、送信用先読み格納部処理におけるメッセージの遷移を説明する図である。図２５は、送信用先読み格納部処理の流れを示すフローチャートである。
【０１４３】
図２３に示すように、サーバＢ６０は、メッセージ識別子生成用カウンタの値として「００２０」を保持する。また、サーバＢ６０は、送信用先読み格納部６２ｂに記憶される「カウンタ値、宛先情報」として「００２１、xxx.xxx.xxx.102」、「００２２、xxx.xxx.xxx.127」、「００２３、xxx.xxx.xxx.064」を保持する。
【０１４４】
すなわち、サーバＢ６０は、既に受信済みのデータ送信またはデータ受信処理を要求するメッセージには、カウンタ値「００２０」を用いてメッセージ識別子を生成済みである。また、サーバＢ６０は、これから受信すると予定されるメッセージのうち次に受信されるメッセージには、「００２０」を１増加させた「００２１」を用いてメッセージ識別子を生成し、そのメッセージの格納先が「xxx.xxx.xxx.102」であることを特定している。同様に、サーバＢ６０は、これから受信すると予定されるメッセージのうちさらにその後に受信されるメッセージには、「００２１」を１増加させた「００２２」を用いてメッセージ識別子を生成し、そのメッセージの格納先が「xxx.xxx.xxx.127」であることを特定している。同様に、サーバＢ６０は、これから受信すると予定されるメッセージのうちさらにその後に受信されるメッセージには、「００２２」を１増加させた「００２３」を用いてメッセージ識別子を生成し、そのメッセージの格納先が「xxx.xxx.xxx.064」であることを特定している。
【０１４５】
このような状態において、サーバＢ６０がカウンタ値「００２４」に対応する格納先サーバを先読みする例を説明する。具体的には、サーバＢ６０の先読み制御部６８は、送信用先読み格納部６２ｂに記憶される最大のカウンタ値を参照し、そのカウンタ値を１増加させたカウンタ値を生成する。続いて、先読み制御部６８は、「キュー名（キューＡ）＋カウンタ値（００２４）」をハッシュ値「aaaaaaaa」に変換し、Chordの手法にしたがって、ＣＨ空間内で宛先情報の先読み依頼を実行する。
【０１４６】
このとき、図２４に示すように、サーバＢ６０の先読み制御部６８は、上述したメッセージにおける通信種別を「先読み（要求）」に設定し、ハッシュ値「aaaaaaaa」をキュー名ハッシュ値に設定する。さらに、先読み制御部６８は、当該メッセージの転送元サーバ識別子に「サーバＢ」を設定して、当該メッセージをChordにしたがって次のサーバに転送する。
【０１４７】
上記メッセージを受信した各サーバは、メッセージのキュー名ハッシュ値に設定される「aaaaaaaa」が自サーバの担当する値か否かを判定する。そして、各サーバは、自サーバが担当サーバでないと判定した場合には、当該メッセージを次のサーバに転送する。ここでは、サーバＤが、担当サーバであると特定されたとする。
【０１４８】
サーバＤは、転送されてきたメッセージのキュー名ハッシュ値に設定される「aaaaaaaa」に基づいて自サーバが担当であると判定する。すると、図２４に示すように、サーバＤは、転送されてきたメッセージの転送元サーバ識別子が「サーバＢ」であることから、転送元がサーバＢ６０であると特定する。そして、サーバＤは、当該メッセージの通信種別を「先読み（応答）」に変更するとともに「宛先情報」に自サーバのＩＰアドレス「xxx.xxx.xxx.211」を設定した後、当該メッセージをサーバＢ６０に応答する。
【０１４９】
このメッセージを受信したサーバＢ６０は、メッセージの通信種別が「先読み（応答）」であることから、自サーバが送信した先読み要求の応答であることを認識する。そして、サーバＢ６０は、メッセージのキュー名ハッシュ値等から該当キューがキューＡでありカウンタ値が「００２４」であることを特定し、さらに宛先情報から「xxx.xxx.xxx.211」を抽出する。その後、図２３に示すように、サーバＢ６０は、キューＡの先読みデータとして、「００２４、xxx.xxx.xxx.211」を送信用先読み格納部６２ｂに格納する。
【０１５０】
（フローチャート）
続いて、図２５を用いて上記した処理のフローチャートを説明する。図２５に示すように、サーバＢ６０の先読み制御部６８は、送信用先読み格納部６２ｂに格納されているエントリ数「ｎ」が最大数「ｍ」よりも小さいか否かを判定する（Ｓ１００１）。なお、ｎとｍは自然数である。
【０１５１】
そして、サーバＢ６０の先読み制御部６８は、エントリ数「ｎ」と最大数「ｍ」とが同じ場合（Ｓ１００１否定）、処理を終了する。
【０１５２】
一方、サーバＢ６０の先読み制御部６８は、エントリ数「ｎ」が最大数「ｍ」よりも小さい場合（Ｓ１００１肯定）、キューディクショナリデータ格納部５２ａを参照し、キューＡに対応するメッセージ識別子生成用カウンタの値「ｐ」を取得する（Ｓ１００２）。
【０１５３】
続いて、サーバＢ６０の先読み制御部６８は、「キュー名＋ｐ＋ｎ＋１」のハッシュ値を算出し（Ｓ１００３）、算出したハッシュ値をキュー名ハッシュ値に設定したメッセージを生成する（Ｓ１００４）。さらに、先読み制御部６８は、当該メッセージの転送元サーバ識別子にサーバＢを設定し（Ｓ１００５）、通信種別に「先読み（要求）」を設定する（Ｓ１００６）。その後、先読み制御部６８は、Chordの手法にしたがって転送先のサーバを特定し（Ｓ１００７）、生成したメッセージを特定したサーバに転送する（Ｓ１００８）。
【０１５４】
サーバＢ６０からメッセージを受信したサーバの種別判定部は、受信したメッセージの通信種別に基づいて、種別を判定する（Ｓ１００９とＳ１０１０）。そして、サーバの種別判定部が通信種別を「先読み（要求）」と判定した場合、サーバの先読み制御部は、受信したメッセージのキュー名ハッシュ値を取得し（Ｓ１０１１）、自サーバが当該ハッシュ値の担当か否かを判定する（Ｓ１０１２）。続いて、サーバの先読み制御部は、自サーバが当該ハッシュ値の担当であると判定した場合（Ｓ１０１２肯定）、当該メッセージの宛先情報に自サーバのＩＰアドレスを設定し（Ｓ１０１３）、通信種別を「先読み（応答）に変更する（Ｓ１０１４）。その後、サーバの先読み制御部は、Chordの手法にしたがって特定される次のサーバに、当該メッセージを転送する（Ｓ１０１５）。このとき、サーバの先読み制御部は、転送対象のメッセージの転送元サーバ識別子によって発信元が特定できる場合には、転送元のサーバに直接送信してもよい。また、Ｓ１０１５実行後、このメッセージを受信したサーバが、Ｓ１００９以降を実行する。
【０１５５】
一方、サーバＢ６０からメッセージを受信したサーバの種別判定部が、通信種別を「先読み（応答）」と判定した場合、当該サーバの先読み制御部は、メッセージの宛先情報から発信元情報を取得する（Ｓ１０１６）。続いて、先読み制御部は、取得した発信元情報に基づいて、自サーバが発信元であるか否かを判定する（Ｓ１０１７）。サーバの先読み制御部は、自サーバが発信元であると判定した場合（Ｓ１０１７肯定）、送信用先読み格納部６２ｂに新たなエントリを格納する（Ｓ１０１８）。一方、サーバの先読み制御部は、自サーバが発信元でないと判定した場合（Ｓ１０１７否定）、Chordの手法にしたがって特定される次のサーバに、当該メッセージを転送する（Ｓ１０１９）。
【０１５６】
なお、Ｓ１０１０において、通信種別が「先読み（要求）」でも「先読み（応答）」でもないと判定された場合、図１６や図２０等が実行される。
【０１５７】
上述したように、実施例２に係るサーバは、メッセージに対し一意となる識別子を生成するためのカウンタと、処理済みのメッセージを管理するカウンタを保持し、ＦＩＦＯ制御と未処理メッセージの存在を受信クライアントに通知する処理部を有する。また、実施例２に係るサーバは、送信クライアントからの要求の有無に関わらず、次に発行されるメッセージ識別子に対応する格納先サーバを検索し、宛先情報を蓄積する処理部を有する。
【０１５８】
また、実施例２に係るサーバは、メッセージデータに「キュー名＋カウンタ」という識別子を持たせ、データ格納先のキーとする。つまり、実施例２に係るサーバは、メッセージの格納先を、キューディクショナリのカウンタを利用して予め知ることができる。実施例２に係るサーバは、これを利用し、将来のデータ格納サーバの宛先情報を予め収集しておき、クライアントからのデータ格納または参照要求に迅速に応答することできる。
【０１５９】
また、Chordなどの手法では、一般的に、担当サーバへの到達速度と宛先情報の保守コストはトレードオフの関係にある。具体的には、各サーバで保持する宛先情報が多いほど、担当サーバへの到達速度は速くなるが、膨大な宛先情報を管理するための管理コストが増大する。一方、各サーバで保持する宛先情報が少ないほど、担当サーバへの到達速度は遅くなるが、少ない宛先情報を管理すればよく管理コストを抑えることができる。
【０１６０】
これに対して、実施例２に係るサーバは、先読み処理を実行して、将来に受信されるメッセージの担当サーバを予め記憶しておくことができる。また、実施例２に係るサーバは、メモリ容量やコストを考慮して先読み処理を実行することができるので、管理コストを抑えることができる。この結果、実施例２に係るシステムでは、分散システムの規模が大きくなっても、言い換えるとサーバ数が増加しても、応答速度が大きく変わることなくメッセージの送受信を実行できる。
【０１６１】
また、実施例２に係るサーバで形成されるメッセージキューは、ＤＨＴの拡張性や耐障害性の特性を継承するので、利用者は複雑な設定をせずにメッセージキューの容量を拡張できる。同様に、ＤＨＴの分散性の特性を継承するので、メッセージがシステム内のサーバに一様に分散して格納され、Ｉ/Ｏ負荷も分散することができる。
【実施例３】
【０１６２】
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下に異なる実施例を説明する。
【０１６３】
（キューディクショナリデータの挙動（離脱））
図２６は、サーバＢがＣＨ空間から離脱する場合のキューディクショナリデータの挙動を説明する図である。図２６に示すように、サーバＢは、キューディクショナリデータ格納部５２ａに「キュー名、属性、カウンタ値」として「Ｑｕｅ１、１、１０００」と「Ｑｕｅ１、２、９５０」とを記憶する。つまり、サーバＢは、キュー名をキーとしたキーバリュー構造でキューディクショナリデータを保持するので、一般的なＣＨ空間のデータ複製論理で冗長化することができる。また、１サーバが保持する他のサーバのキューディクショナリデータの数、つまり、複製数についても一般的なＣＨ空間のデータ複製論理で冗長化する。
【０１６４】
例えば、ＣＨ空間の各サーバは、自サーバの前後に位置するサーバのキューディクショナリデータを保持する。そして、サーバＢがＣＨ空間から離脱した場合、サーバＢの後続に位置するサーバＦが、サーバＢが離脱したことを検出し、保持するサーバＢのキューディクショナリデータを現用系に昇格させる。なお、クライアント端末１０は、キューディクショナリが現用になったサーバに新たに接続することになるが、これも一般的なＣＨにおいてサーバ離脱後に「後継の」サーバを探索する方法に従う。そして、後継のサーバを見つけたら、該当サーバとの接続を確立する。
【０１６５】
（キューディクショナリデータの挙動（追加））
図２７は、サーバＸがＣＨ空間に参加する場合のキューディクショナリデータの挙動を説明する図である。ＣＨ空間に新たなサーバが追加された場合も、図２６と同様、一般的なＣＨ空間の複製論理にしたがって処理することができる。
【０１６６】
例えば、サーバＢは、ハッシュ値＝３３からハッシュ値＝４までを担当しており、Ｑｕｅ１とＱｕｅ２のキューディクショナリデータを保持する。例を挙げると、サーバＢは、ハッシュ値＝２とするＱｕｅ１のデータとして「Ｑｕｅ１、１、１０００」と「Ｑｕｅ１、２、９５０」とを保持する。また、サーバＢは、ハッシュ値＝４とするＱｕｅ２のデータとして「Ｑｕｅ２、１、２０」と「Ｑｕｅ２、２、２０」とを保持する。
【０１６７】
このような状態において、ハッシュ値＝２を担当するサーバＸがＣＨ空間に追加されたとする。この場合、サーバＢは、保持するハッシュ値＝２のデータ「Ｑｕｅ１、１、１０００」と「Ｑｕｅ１、２、９５０」とをサーバＸに送信する。このようにすることで、サーバＸおよびサーバＢは、自サーバが担当するキューのキューディクショナリデータを保持することができる。
【０１６８】
（キューディクショナリデータの挙動の影響範囲）
例えば、Chordの方式では、自サーバが死活監視可能なサーバは全体の一部である。トラフィックの増大を防ぐために、開示するサーバは、使用するルーティングアルゴリズムの監視範囲に従い、構成変更を検出しない範囲では対処しないように制御してもよい。例えば、監視域外のサーバ構成が変動していた場合、接続したサーバにデータが無い、もしくはサーバ自体が存在しない可能性がある。その場合は、開示するサーバは、接続したサーバまたはキューディレクトリのあるサーバから、メッセージ識別子をもとに改めて探索を行うなどの対応を行うようにしてもよい。また、開示するサーバは、サーバ構成の変動を検出した場合は、各先読み格納部を補正する。例えば、各先読み格納部のエントリを走査し、影響箇所を補正してもよいし、エントリを全て再構築してもよい。これはメッセージの送受信依頼とは非同期に行う。
【０１６９】
（メッセージ等の例）
実施例２等で図示したメッセージのフォーマット例はあくまで例示であり、これに限定されるものではない。また、各実施例を説明する際に使用したＩＰアドレス、ホスト名、キュー名などの情報は、あくまで例示であり、数値等に意味ははく、限定するものでもない。また、実施例２では、クライアント端末１０がサーバＡ５０にキューＡのオープンを要求し、担当するサーバＢ６０を介してサーバＣ７０にデータを格納する例等について説明したが、これらの例をあくまで例示であり、処理等を限定するものではない。
【０１７０】
（メッセージ識別子）
実施例２では、メッセージ識別子として、受信順に１ずつ増加するカウンタを利用する場合を説明したが、これに限定されるものではない。例えば、受信順に１ずつ減少するカウンタを用いることもでき、文字＋単純増加するカウンタなど一定の規則性を有するカウンタ値を用いることができる。
【０１７１】
（先読みデータ）
例えば、システム内のネットワークの帯域幅に余裕がある場合には、受信用と送信用の先読み格納部を統合して、１つの先読み格納部として共有することもできる。なお、ネットワークの帯域幅に余裕がない場合に、受信用と送信用と分けて保持することで、トラフィックを削減することもできる。また、先読み制御処理は、データの送信処理や処理とは非同期で実行してもよく、送信されたら実行するなど同期させて実行してもよい。
【０１７２】
（格納形式）
実施例では、記憶部５２が有する各格納部が、ＫＶＳ形式でデータを保存する例を説明したが、これに限定されるものではない。例えば、関係データベースなどの任意のデータ構造を用いることができる。
【０１７３】
（システム）
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともできる。あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１７４】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られない。つまり、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、オープン処理部５６とメッセージ処理部５７とを統合することもできる。
【０１７５】
さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。また、ＣＰＵなどのプロセッサが、図４等で示した処理部と同様ではなく、プロセッサそのものが各処理部並びに図で説明したフローと同様の処理を実行することもできる。
【０１７６】
（ハードウェア構成）
ところで、上記の実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータシステムで実行することによって実現することができる。そこで、以下では、上記の実施例と同様の機能を有するプログラムを実行するコンピュータシステムの一例を説明する。
【０１７７】
図２８は、データ制御プログラムを実行するコンピュータのハードウェア構成の例を示す図である。図２８に示すように、コンピュータ１００は、ＣＰＵ１０２、入力装置１０３、出力装置１０４、通信インタフェース１０５、媒体読取装置１０６、ＨＤＤ（Hard  Disk  Drive）１０７、ＲＡＭ（Random  Access  Memory）１０８を有する。また、図２８に示した各部は、バス１０１で相互に接続される。
【０１７８】
入力装置１０３は、マウスやキーボードであり、出力装置１０４は、ディスプレイなどであり、通信インタフェース１０５は、ＮＩＣ（Network  Interface  Card）などのインタフェースである。ＨＤＤ１０７は、データ制御プログラム１０７ａととともに、図４当に示した各情報を記憶する。記録媒体の例としてＨＤＤ１０７を例に挙げたが、ＲＯＭ（Read  Only  Memory）、ＲＡＭ、ＣＤ−ＲＯＭ等の他のコンピュータ読み取り可能な記録媒体に各種プログラムを格納しておき、コンピュータに読み取らせることとしてもよい。なお、記録媒体を遠隔地に配置し、コンピュータが、その記憶媒体にアクセスすることでプログラムを取得して利用してもよい。また、その際、取得したプログラムをそのコンピュータ自身の記録媒体に格納して用いてもよい。
【０１７９】
ＣＰＵ１０２は、データ制御プログラム１０７ａを読み出してＲＡＭ１０８に展開することで、図４等で説明した各機能を実行するデータ制御プロセス１０８ａを動作させる。すなわち、データ制御プロセス１０８ａは、図４に記載したクラスタ制御部５４、種別判定部５５、オープン処理部５６、メッセージ処理部５７を実行する。このようにコンピュータ１００は、プログラムを読み出して実行することでデータ制御方法を実行する情報処理装置として動作する。
【０１８０】
例えば、コンピュータ１００は、媒体読取装置１０６によって記録媒体からデータ制御プログラムを読み出し、読み出されたデータ制御プログラムを実行することで上記した実施例と同様の機能を実現することもできる。なお、この他の実施例でいうプログラムは、コンピュータ１００によって実行されることに限定されるものではない。例えば、他のコンピュータまたはサーバがプログラムを実行する場合や、これらが協働してプログラムを実行するような場合にも、本発明を同様に適用することができる。
【符号の説明】
【０１８１】
１０、２０、３０  クライアント端末
５０  サーバＡ
５１  通信インタフェース
５２  記憶部
５２ａ  キューディクショナリデータ格納部
５２ｂ  送信用先読み格納部
５２ｃ  受信用先読み格納部
５２ｄ  メッセージ格納部
５２ｅ  受信待ちカウンタ
５３  制御部
５４  クラスタ制御部
５５  種別判定部
５６  オープン処理部
５７  メッセージ処理部
５８  先読み制御部
６０  サーバＢ
７０  サーバＣ
【図１】
0005845877.tif 000002
【図２】
0005845877.tif 000003
【図３】
0005845877.tif 000004
【図４】
0005845877.tif 000005
【図５】
0005845877.tif 000006
【図６】
0005845877.tif 000007
【図７】
0005845877.tif 000008
【図８】
0005845877.tif 000009
【図９】
0005845877.tif 000010
【図１０】
0005845877.tif 000011
【図１１】
0005845877.tif 000012
【図１２】
0005845877.tif 000013
【図１３】
0005845877.tif 000014
【図１４】
0005845877.tif 000015
【図１５】
0005845877.tif 000016
【図１６】
0005845877.tif 000017
【図１７】
0005845877.tif 000018
【図１８】
0005845877.tif 000019
【図１９】
0005845877.tif 000020
【図２０】
0005845877.tif 000021
【図２１】
0005845877.tif 000022
【図２２】
0005845877.tif 000023
【図２３】
0005845877.tif 000024
【図２４】
0005845877.tif 000025
【図２５】
0005845877.tif 000026
【図２６】
0005845877.tif 000027
【図２７】
0005845877.tif 000028
【図２８】
0005845877.tif 000029