以下,本実施の形態について,図を用いて説明する。
〔実施の形態1〕
図1は,本実施の形態1によるコンピュータノード間でメッセージ通信を行うシステムの構成例を示す図である。
図1に示すシステムにおいて,送信ノード100,受信ノード200は,コンピュータノードである。以下では,コンピュータノードを,単にノードとも呼ぶ。図1に示すシステムの例では,2つのノードのみが示されているが,システムにはさらに多数のノードが存在してもよい。図1に示す送信ノード100と受信ノード200との間では,キュー領域300を介した非同期のメッセージ通信が行われる。各ノードやキュー領域300は,例えばIP(Internet Protocol )ネットワークなどのネットワーク(図示省略)に接続されている。
送信ノード100は,メッセージの送信側となるノードである。受信ノード200は,メッセージの受信側となるノードである。なお,本実施の形態に示す例において,送信ノード100と受信ノード200は,便宜的に表したものであり,常にメッセージを送信する送信ノード100と,常にメッセージを受信する受信ノード200が存在していることを表したものではない。すなわち,システムが有する各ノードは,メッセージの送信側となる場合には送信ノード100となり,メッセージの受信側となる場合には受信ノード200となる。
本実施の形態では,送信ノード100と受信ノード200は,それぞれ,物理的なコンピュータマシンで実現されてもよいし,仮想的なコンピュータマシンで実現されてもよい。以下では,物理的なコンピュータマシンを物理マシン,仮想的なコンピュータマシンを仮想マシンと呼ぶ。なお,本実施の形態の技術は,受信ノード200がリソース量が動的に変化する仮想マシンで実現される場合に,より高い効果が得られる。ただし,受信ノード200が物理マシンである場合でも,例えば障害の発生によりリソース量が減少してしまうというケースも考えられるので,限定的ではあるが,本実施の形態の技術による効果は得られる。
図1に示す例では,受信ノード200は,仮想マシンで実現されている。物理マシン10は,受信ノード200を含む仮想マシンを実現する物理的なコンピュータマシンである。図1に示す物理マシン10上では,受信ノード200以外にも,複数の仮想マシン30が動作している。受信ノード200を含む各仮想マシン30は,物理マシン10のリソースを利用して動作する。ホストOS(Operating System)/ハイパーバイザ20は,物理マシン10のリソース管理や,受信ノード200を含む各仮想マシン30の管理・制御を行う。ゲストOS201は,仮想マシンである受信ノード200のOSである。同様に,ゲストOS31は,仮想マシン30のOSである。
図1に示す例では,ホストOS/ハイパーバイザ20によって,物理マシン10上で動作する受信ノード200を含む各仮想マシン30へのリソースの割り当てが,受信ノード200を含む各仮想マシン30の稼働状況に応じて動的に変更されるものとする。すなわち,受信ノード200が使用するリソースの量は,時間的に変動する。
なお,クラウドコンピューティングなどの技術では,1つの物理マシンを複数のテナントで利用するマルチテナント環境が導入される場合がある。マルチテナント環境では,例えば,図1に示す物理マシン10上で動作する受信ノード200と他の仮想マシン30とが,それぞれ異なるテナントが利用するマシンとなる場合がある。このような環境では,他のテナントの仮想マシン30との兼ね合いもあり,受信ノード200は,望む量のリソースを常時得られるわけではない。
キュー領域300は,送信ノードと受信ノードとの間での非同期のメッセージ通信を実現するために,メッセージを一時的に記憶するメッセージ記憶部の一例である。本実施の形態の例では,キュー領域300は,原則としてFIFO(First In First Out)でメッセージを出し入れするメッセージキューであるものとする。メッセージごとに優先度を設定して,キュー領域300への登録順が遅いが優先度が高いメッセージがある場合に,そのメッセージを先にキュー領域300から取り出すように,システムを設計してもよい。なお,送信ノード100と受信ノード200との間での非同期のメッセージ通信を実現するためのメッセージ記憶部が,必ずしもキューである必要はない。
また,キュー領域300の設計において,宛先となるアプリケーションプロセスごとにメッセージを管理するキューを用意してもよいし,異なる複数のアプリケーションプロセスに対するメッセージを一元的に管理するキューを用意してもよい。本実施の形態の例におけるキュー領域300では,異なる複数のアプリケーションプロセスに対するメッセージが一元的に管理されているものとする。
本実施の形態のキュー領域300を実現する方法としては,様々な方法が考えられる。例えば,専用に用意されたノードで,キュー領域300を実現する方法が考えられる。また,システムが有する各ノードが共通にアクセス可能なストレージで,キュー領域300を実現することも可能である。
送信ノード100は,送信アプリ110,キューマネージャ120を備える。受信ノード200は,受信アプリ210,キューマネージャ220,受信制御部230,アプリ状況テーブル記憶部240を備える。
送信ノード100の送信アプリ110は,受信ノード200の受信アプリ210に対する処理要求のメッセージを送信する側のアプリケーションプロセスである。送信ノード100が送信するメッセージは,送信アプリ110により発行されるメッセージとなる。
これに対して,受信ノード200の受信アプリ210は,送信ノード100の送信アプリ110からのメッセージを受信する側のアプリケーションプロセスである。受信アプリ210は,受け付けたメッセージの内容に応じた処理を実行する。受信ノード200が受信するメッセージは,受信アプリ210が受け付けるメッセージとなる。
受信ノード200では,複数の受信アプリ210が動作可能である。図1に示す例では,受信ノード200で,3つの受信アプリ210a〜cが動作している。なお,受信ノード200では,動的に必要な受信アプリ210が新規に起動され,不要な受信アプリ210が削除されることにより,リソース活用の効率化が図られている。
なお,本実施の形態では,複数の受信ノード200での分散処理が行われているものとする。例えば,図1に示す受信ノード200で動作する受信アプリ210aと同じアプリケーションのプロセスが,図示省略された他の受信ノード200でも動作しており,処理を実行可能な受信ノード200がキュー領域300からメッセージを取得して,処理を実行するものとする。
キューマネージャ120(または220)は,各ノードに実装される,キュー領域300に対するメッセージの送受信を制御する機構である。ノードが送信ノード100となる場合には,キューマネージャ120は,キュー領域300にメッセージを送信して登録するメッセージ登録部となる。ノードが受信ノード200となる場合には,キューマネージャ220は,キュー領域300からメッセージを取得して受信するメッセージ取得部となる。キューマネージャ120(または220)は,例えば,クラスライブラリとして実装される。
受信制御部230は,受信ノード200において,キュー領域300からメッセージを受信するタイミングを制御する。より具体的には,受信制御部230は,受信ノード200の空きリソース量を取得する。また,受信制御部230は,後述のアプリ状況テーブル記憶部240から,処理の実行状態が待機状態である受信アプリ210について,該受信アプリ210が1処理を実行する上で必要なリソース量を取得する。受信制御部230は,空きリソース量が必要なリソース量以上である場合に,該待機状態である受信アプリ210に対するメッセージを取得すると判断する。逆に,受信制御部230は,空きリソース量が必要なリソース量に満たない場合に,該待機状態である受信アプリ210に対するメッセージを取得しないと判断する。受信制御部230は,キューマネージャ220に,取得すると判断した受信アプリ210に対するメッセージの取得を依頼する。このとき,キューマネージャ220は,メッセージ取得部として動作し,受信制御部230から依頼された受信アプリ210に対するメッセージを,キュー領域300から取得する。
なお,受信制御部230は,受信ノード200の空きリソース量を,例えば,該受信ノード200のOSから取得する。図1に示すように,受信ノード200が仮想マシンである場合には,仮想マシンである該受信ノード200のゲストOS201,または仮想マシンである該受信ノード200を管理するホストOS/ハイパーバイザ20から取得する。受信制御部230が,受信ノード200の空きリソース量をゲストOS201から取得するのか,ホストOS/ハイパーバイザ20から取得するのかは,受信ノード200の環境に応じた任意の設計が可能である。
ゲストOS201は,物理マシン10のリソース状況を把握していないので,受信ノード200に割り当てられる空きリソース量を,必ずしも正確に判断できるわけではない。例えば,上述のクラウドコンピューティングにおけるマルチテナント環境などでは,他のテナントの仮想マシン30と競合するため,ゲストOS201が要求するだけのリソース量が得られない場合もある。
これに対して,物理マシン10のリソース管理を行うホストOS/ハイパーバイザ20は,物理マシン10のリソース状況を把握しているので,受信ノード200に割り当てられる空きリソース量を,正確に判断することができる。ホストOS/ハイパーバイザ20から受信ノード200の空きリソース量の情報を得ることができる場合には,受信制御部230は,正確な受信ノード200の空きリソース量を取得可能となる。
しかし,上述のクラウドコンピューティングにおけるマルチテナント環境などでは,ホストOS/ハイパーバイザ20が,必ずしも自テナントのものとはならない。このような環境では,受信制御部230は,ホストOS/ハイパーバイザ20から,受信ノード200の空きリソース量の情報を得ることができない場合もある。このようなケースでも,受信制御部230は,ゲストOS201からは,受信ノード200の空きリソース量の情報を取得できる。
アプリ状況テーブル記憶部240は,受信ノード200で動作する受信アプリ210を管理するアプリ状況テーブルを記憶する記憶部である。アプリ状況テーブル記憶部240は,アプリケーションプロセスの管理情報を記憶する管理情報記憶部の一例である。
図2は,本実施の形態1によるアプリ状況テーブルの例を示す図である。
図2に示すアプリ状況テーブル245は,図1に示す受信ノード200のアプリ状況テーブル記憶部240に記憶されるアプリ状況テーブルの一例である。図2に示すアプリ状況テーブル245は,受信ノード200で動作する受信アプリ210のそれぞれに対応するレコードごとに,アプリID,必要リソース,アプリ状態の情報を持つ。
図2に示すアプリ状況テーブル245において,アプリIDは,該当レコードの受信アプリ210のアプリケーションを識別する識別情報である。図2に示すアプリ状況テーブル245において,例えば,“app#01”は,受信アプリ210aのアプリケーションの識別情報であり,“app#02”は,受信アプリ210bのアプリケーションの識別情報であり,“app#03”は,受信アプリ210cのアプリケーションの識別情報であるものとする。
本実施の形態では,送信ノード100の送信アプリ110は,処理を依頼する相手先のアプリIDを指定して,メッセージを送る。受信ノード200では,処理を実行可能であると判断した受信アプリ210がある場合に,該当受信アプリ210に対応するメッセージをアプリIDで識別して,キュー領域300から取得する。例えば,複数の受信ノード200で分散処理が行われる場合,受信ノード200が異なっても,同じアプリケーションの受信アプリ210には,同じアプリIDが与えられるものとする。すなわち,送信ノード100から送信されてキュー領域300に格納されたメッセージは,該メッセージの宛先となるアプリIDの受信アプリ210が動作する受信ノード200であれば,どの受信ノード200が受信してもよい。
図2に示すアプリ状況テーブル245において,必要リソースは,該当レコードの受信アプリ210が1処理を行うのに必要なリソースの情報である。図2に示すアプリ状況テーブル245の例では,各受信アプリ210に必要なリソースの情報として,CPU(Central Processing Unit )コア数,メモリ量,ネットワーク帯域量,ハードディスク容量の情報が記録されている。
図2に示すアプリ状況テーブル245において,アプリ状態は,該当レコードの受信アプリ210による処理の実行状態を示す。図2に示すアプリ状況テーブル245の例において,アプリ状態の“待機”は,該当受信アプリ210が,処理要求のメッセージを待っている待機状態を示す。また,アプリ状態の“稼働”は,該当受信アプリ210が,処理要求のメッセージを受け付けて,該メッセージの内容に応じた処理を実行している稼働状態を示す。
本実施の形態1では,各受信アプリ210が,アプリ状況テーブル245に対して,自身の情報を記録・更新するものとする。例えば,受信アプリ210は,起動時に,アプリ状況テーブル245に自身の情報を記録するレコードを生成し,該レコードに自身のアプリIDと必要リソースとを登録する。このとき,受信アプリ210は,アプリ状況テーブル245において,自身のアプリ状態を“待機”に設定する。受け付けたメッセージの内容に応じた処理を実行する際には,受信アプリ210は,アプリ状況テーブル245において,自身のアプリ状態を“稼働”に更新する。受け付けたメッセージの内容に応じた処理を終了する際には,受信アプリ210は,アプリ状況テーブル245において,自身のアプリ状態を“待機”に更新する。
受信アプリ210が起動時にアプリ状況テーブル245に登録するアプリIDや必要リソースなどの情報は,例えば受信アプリ210のアプリケーションプログラムに組み込まれていてもよいし,アプリケーションプログラムとは別に用意されたプロパティ情報に設定されていてもよい。
図3は,本実施の形態によるプロパティ情報の例を示す図である。
図3に示すプロパティ情報205は,受信アプリ210のアプリIDや必要リソースなどの情報が設定されたプロパティ情報の一例である。例えば,図3(A)は,図1に示す受信アプリ210aについてのプロパティ情報205aである。また,図3(B)は,図1に示す受信アプリ210bについてのプロパティ情報205bである。また,図3(C)は,図1に示す受信アプリ210cについてのプロパティ情報205cである。
図3に示すプロパティ情報205は,例えばそれぞれが1つのファイルとして,図1では図示省略された記憶部に記憶されている。本実施の形態1において,各受信アプリ210は,例えば,起動時に自身のプロパティ情報205のファイルにアクセスし,自身のアプリID,必要リソース等の情報を取得する。
図4は,本実施の形態によるノードを実現するコンピュータのハードウェア構成例を示す図である。
図1に示す本実施の形態の送信ノード100や受信ノード200を実現する物理的なコンピュータ1は,例えば,CPU2,主記憶となるメモリ3,記憶装置4,通信装置5,媒体読取・書込装置6,入力装置7,出力装置8等を備える。記憶装置4は,例えばHDD(Hard Disk Drive )等の外部記憶装置や,補助記憶装置などである。媒体読取・書込装置6は,例えばCD−R(Compact Disc Recordable )ドライブやDVD−R(Digital Versatile Disc Recordable )ドライブなどである。入力装置7は,例えばキーボード・マウスなどである。出力装置8は,例えばディスプレイ等の表示装置などである。
図1に示す送信ノード100や受信ノード200およびそれらのノードが備える各機能部は,コンピュータ1が備えるCPU2,メモリ3等のハードウェアと,ソフトウェアプログラムとによって実現することが可能である。コンピュータ1が実行可能なプログラムは,記憶装置4に記憶され,その実行時にメモリ3に読み出され,CPU2により実行される。
コンピュータ1は,可搬型記録媒体から直接プログラムを読み取り,そのプログラムに従った処理を実行することもできる。また,コンピュータ1は,サーバコンピュータからプログラムが転送されるごとに,逐次,受け取ったプログラムに従った処理を実行することもできる。さらに,このプログラムは,コンピュータ1で読み取り可能な記録媒体に記録しておくことができる。
以下,図5〜図9に示すフローチャートを用いて,本実施の形態1の送信ノード100および受信ノード200によるメッセージ通信に関する処理の流れの例を説明する。
図5は,本実施の形態1における送信ノードの送信アプリによる処理のフローチャートである。
送信ノード100において,送信アプリ110は,受信アプリ210に対して処理要求を行うメッセージに,メタ情報を付与する(ステップS10)。ここでメッセージに付与するメタ情報としては,宛先の受信アプリ210のアプリID,優先度,自送信アプリ110のIDなどの例が挙げられる。本実施の形態1の例では,メッセージに宛先のアプリIDを付与するものとする。例えば,図1に示す受信アプリ210aを宛先とする場合,送信アプリ110は,宛先のアプリIDとして“app#01”を付与する。送信アプリ110は,キューマネージャ120に対して,メッセージの送信を依頼する(ステップS11)。
図6は,本実施の形態1における送信ノードのキューマネージャによる処理のフローチャートである。
送信ノード100において,キューマネージャ120は,送信アプリ110からメタ情報が付与されたメッセージの送信依頼を受け付けると(ステップS20),送信アプリ110から受け付けたメタ情報が付与されたメッセージに,さらにタイムスタンプを付与する(ステップS21)。キューマネージャ120は,タイムスタンプとメタ情報とが付与されたメッセージを,キュー領域300に登録する(ステップS22)。本実施の形態1の例では,タイムスタンプと宛先のアプリIDとが付与されたメッセージが,キュー領域300に格納される。なお,キュー領域300へのメッセージの登録は,エンキューとも呼ばれる。
図7は,本実施の形態1における受信ノードの受信アプリによる処理のフローチャートである。
受信ノード200において,受信アプリ210は,起動の際に,アプリ状況テーブル245に,自身のレコードを追加する(ステップS30)。受信アプリ210は,アプリ状況テーブル245における自身のレコードに,自身のアプリIDと,自身が1処理を実行するのに必要なリソース量を登録する(ステップS31)。例えば,図1に示す受信アプリ210aが起動する際に,受信アプリ210aは,図3(A)に示すプロパティ情報205aのファイルから自身のアプリIDと必要リソースの情報を取得し,その情報をアプリ状況テーブル245における自身のレコードに記録する。受信アプリ210は,アプリ状況テーブル245における自身のレコードのアプリ状態を,待機状態を示す“待機”に設定する(ステップS32)。
受信アプリ210は,送信アプリ110からのメッセージを受け付けると(ステップS33のYES),アプリ状況テーブル245における自身のレコードのアプリ状態を,稼働状態を示す“稼働”に更新する(ステップS34)。受信アプリ210は,受け付けたメッセージの内容に従って処理を実行する(ステップS35)。
受信アプリ210は,メッセージに応じた処理が終了すると,アプリ状況テーブル245における自身のレコードのアプリ状態を,待機状態を示す“待機”に更新する(ステップS34)。受信アプリ210は,ステップS33の処理に戻って,次のメッセージを待つ。
なお,図7のフローチャートには示されていないが,受信アプリ210は,受信ノード200から削除される際に,アプリ状況テーブル245における自身のレコードを削除する。
図8は,本実施の形態1における受信ノードの受信制御部による処理のフローチャートである。
受信ノード200において,受信制御部230は,定期的にアプリ状況テーブル245を参照し,アプリ状態が“待機”状態である受信アプリ210の存在をチェックする(ステップS40)。
“待機”状態である受信アプリ210がある場合には(ステップS40のYES),受信制御部230は,“待機”状態である受信アプリ210を順に1つ選択する(ステップS41)。“待機”状態である受信アプリ210が複数存在する場合には,受信制御部230は,例えば優先度を用いた特定の優先制御や,ラウンドロビンを用いた制御などにより,順に処理対象の受信アプリ210を選択する。“待機”状態である受信アプリ210が1つしかない場合には,受信制御部230は,その受信アプリ210を選択する。
受信制御部230は,アプリ状況テーブル245から,該当受信アプリ210の必要リソースの情報を取得する(ステップS42)。また,受信制御部230は,ゲストOS201またはホストOS/ハイパーバイザ20から,自受信ノード200の空きリソースの情報を取得する(ステップS43)。なお,受信ノード200の空きリソースの情報をゲストOS201から取得するか,ホストOS/ハイパーバイザ20から取得するかは,設計による。
受信制御部230は,該当受信アプリ210の必要リソース以上の受信ノード200の空きリソースがあるかを判定する(ステップS44)。必要リソース以上の空きリソースがなければ(ステップS44のNO),受信制御部230は,該当受信アプリ210に対するメッセージを取得しないと判断し,ステップS48の処理に進む。例えば,受信制御部230は,CPUコア数,メモリ量,ネットワーク帯域量,ハードディスク容量の各項目について比較を行う場合に,空きリソースの方が必要リソースよりも値が小さい項目が1つでもあれば,必要リソース以上の空きリソースがないと判定する。
必要リソース以上の空きリソースがあれば(ステップS44のYES),受信制御部230は,該当受信アプリ210に対するメッセージを取得すると判断する。例えば,受信制御部230は,CPUコア数,メモリ量,ネットワーク帯域量,ハードディスク容量の各項目について比較を行う場合に,すべての項目で空きリソースの方が必要リソースよりも値が大きければ,必要リソース以上の空きリソースがあると判定する。
このとき,受信制御部230は,該当受信アプリ210のアプリIDを指定して,キューマネージャ220に,該当受信アプリ210に対するメッセージの受信を依頼する(ステップS45)。受信制御部230は,キューマネージャ220から該当受信アプリ210に対するメッセージを取得すると(ステップS46),取得したメッセージを該当受信アプリ210に渡す(ステップS47)。該当受信アプリ210では,受信制御部230から渡されたメッセージの内容に従った処理が実行される。
受信制御部230は,すべての“待機”状態の受信アプリ210について処理が終了したかを判定する(ステップS48)。まだすべての“待機”状態の受信アプリ210について処理が終了していなければ(ステップS48のNO),受信制御部230は,ステップS41の処理に戻って,次の“待機”状態の受信アプリ210の処理に移る。すべての“待機”状態の受信アプリ210について処理が終了していれば(ステップS48のYES),受信制御部230は,ステップS40の処理に戻って,次のアプリ状況テーブル245のチェックタイミングを待つ。
図9は,本実施の形態1における受信ノードのキューマネージャによる処理のフローチャートである。
受信ノード200において,キューマネージャ220は,受信制御部230からメッセージの受信依頼を受け付けると(ステップS50),指定されたアプリIDを検索キーに,キュー領域300のメッセージを検索する(ステップS51)。例えば,キューマネージャ220は,キュー領域300からメッセージをFIFOで取り出せるように,付与されたタイムスタンプが古い順に,付与された宛先のアプリIDが検索キーのアプリIDと一致するメッセージを検索する。なお,メッセージに優先度の情報が付されている場合に,優先度が高いメッセージを優先的に検索するなどの設計は,任意である。指定されたアプリIDを宛先としたメッセージがキュー領域300になければ(ステップS52のNO),キューマネージャ220は,ステップS51の処理に戻り,次の検索のタイミングを待つ。
指定されたアプリIDを宛先としたメッセージがキュー領域300にあれば(ステップS52のYES),キューマネージャ220は,他の受信ノード200とメッセージの取り出し処理が輻輳しないように,対象のメッセージをレコードロックして(ステップS53),排他制御する。キューマネージャ220は,キュー領域300から,対象のメッセージを取り出す(ステップS54)。なお,キュー領域300からのメッセージの取り出しは,デキューとも呼ばれる。キューマネージャ220は,取り出したメッセージを,受信制御部230に応答する(ステップS55)。キューマネージャ220は,取り出したメッセージを,キュー領域300から削除する(ステップS56)。
ここまで説明したように,本実施の形態1の受信ノード200における受信制御部230は,待機状態の受信アプリ210があっても,自受信ノード200のリソースに十分な空きがなければ,該当受信アプリ210に対するメッセージを取得しないように制御を行う。受信制御部230は,その時点で,待機状態の受信アプリ210が1処理を実行するのに必要な空きリソースがあると判断できる場合にのみ,メッセージを取得する制御を行う。
すなわち,本実施の形態1による受信ノード200は,リソース量が動的に変化する場合でも,その時その時で,十分に処理実行可能なメッセージのみをキュー領域300から取得して処理を行う。そのため,受信ノード200において,待機状態の受信アプリ210があるゆえにキュー領域からメッセージを取得してしまい,リソース量が変化したためにリソース不足によって適切に処理が実行できなくなってしまう,といった状況を回避できる。
これにより,例えば,リソース量が動的に変化する複数の受信ノード200によって分散処理が行われるようなシステムにおいて,その時点で真に処理実行可能な受信ノード200のみが,キュー領域300からメッセージを取得して処理を行うので,円滑なシステムの運用が可能となる。
〔実施の形態2〕
図10は,本実施の形態2によるコンピュータノード間でメッセージ通信を行うシステムの構成例を示す図である。
図10に示す本実施の形態2によるシステムの構成では,受信ノード200’の構成が,図1に示す受信ノード200の構成に,アプリ稼働管理部250が加えられたものとなっている。その他の構成については,図1に示す実施の形態1によるシステムの構成と同様である。以下では,本実施の形態2について,上述の実施の形態1と異なる部分を中心に説明を行い,上述の実施の形態1と同様の部分については説明を省略する。
上述の実施の形態1では,各受信アプリ210が,自身のプロパティ情報や自身の処理の実行状態を,アプリ状況テーブル記憶部240のアプリ状況テーブル245に記録していた。本実施の形態2では,アプリ稼働管理部250が,各受信アプリ210のプロパティ情報や処理の実行状態を,アプリ状況テーブル記憶部240のアプリ状況テーブル245に記録する。
なお,本実施の形態2では,受信ノード200’で動作する各受信アプリ210は,自身のプロパティ情報や自身の処理の実行状態をアプリ状況テーブル245に記録する処理を行わない。
図11は,本実施の形態2における受信ノードの受信アプリによる処理のフローチャートである。
受信ノード200’において,受信アプリ210は,起動後,送信アプリ110からのメッセージの受け付けを待つ(ステップS60)。受信アプリ210は,送信アプリ110からのメッセージを受け付けると(ステップS60のYES),受信アプリ210は,受け付けたメッセージの内容に従って処理を実行する(ステップS61)。受信アプリ210は,メッセージに応じた処理が終了すると,ステップS60の処理に戻って,次のメッセージの受け付けを待つ。
このように,本実施の形態2の受信ノード200’で動作する各受信アプリ210は,本実施の形態によるメッセージ通信の技術の導入に関係なく,既存の受信アプリと同様の処理を行う。
受信ノード200’が備えるアプリ稼働管理部250は,受信ノード200’で動作する各受信アプリ210の動作を監視する機能部である。受信ノード200’の起動時において,アプリ稼働管理部250は,各受信アプリ210より先に起動される。
図12は,本実施の形態2における受信ノードのアプリ稼働管理部による処理のフローチャートである。
受信ノード200’において,アプリ稼働管理部250は,受信アプリ210の起動を検知すると(ステップS70のYES),アプリ状況テーブル245に,該受信アプリ210の情報を記録するレコードを生成する(ステップS71)。アプリ稼働管理部250は,例えば図3に示すプロパティ情報205のファイルから,起動された受信アプリ210のアプリIDと必要リソースとを読み出す(ステップS72)。アプリ稼働管理部250は,読み出したアプリIDと必要リソースとを,アプリ状況テーブル245の該当レコードに登録する(ステップS73)。アプリ稼働管理部250は,アプリ状況テーブル245において,起動された受信アプリ210のアプリ状態を“待機”に設定する(ステップS74)。
アプリ稼働管理部250は,受信アプリ210の削除を検知すると(ステップS75のYES),アプリ状況テーブル245から,削除された受信アプリ210のレコードを削除する(ステップS76)。
アプリ稼働管理部250は,受信アプリ210がメッセージを受け付けたことを検知すると(ステップS77のYES),アプリ状況テーブル245において,該当受信アプリ210のアプリ状態を“稼働”に更新する(ステップS78)。
アプリ稼働管理部250は,受信アプリ210がメッセージに応じた処理を終了したことを検知すると(ステップS79のYES),アプリ状況テーブル245において,該当受信アプリ210のアプリ状態を“待機”に更新する(ステップS80)。
ここまで説明したように,本実施の形態2の受信ノード200’におけるアプリ稼働管理部250は,受信ノード200’で動作する各受信アプリ210の処理の実行状態を,まとめて管理する。これにより,本実施の形態によるメッセージ通信の技術の導入にあたって,既存の受信アプリのプログラムを書き換えずに使用可能となる。
〔実施の形態3〕
図13は,本実施の形態3によるコンピュータノード間でメッセージ通信を行うシステムの構成例を示す図である。
図13に示す本実施の形態3によるシステムの構成では,受信ノード200”の構成が,図1に示す受信ノード200の構成から,アプリ状況テーブル記憶部240が削除されたものとなっている。代わりに,アプリ状況テーブル記憶部400が,受信ノード200”の外部に設けられている。その他の構成については,図1に示す実施の形態1によるシステムの構成と同様である。以下では,本実施の形態3について,上述の実施の形態1と異なる部分を中心に説明を行い,上述の実施の形態1と同様の部分については説明を省略する。
アプリ状況テーブル記憶部400は,複数の受信ノード200”で動作する受信アプリ210を一括で管理するアプリ状況テーブルを記憶する記憶部である。本実施の形態3のアプリ状況テーブル記憶部400を実現する方法としては,キュー領域300と同様に,様々な方法が考えられる。例えば,システムが備えるいずれかのノードで,アプリ状況テーブル記憶部400を実現する方法が考えられる。また,システムが有する各ノードが共通にアクセス可能なストレージで,アプリ状況テーブル記憶部400を実現することも可能である。
アプリ状況テーブル記憶部400に記憶されるアプリ状況テーブルの構成としては,例えば,図2に示すアプリ状況テーブル245に,受信ノード200”を識別するノードIDを加えたものとなる。アプリ状況テーブル記憶部400では,例えば,受信ノード200”ごとに,アプリ状況テーブルが管理される。
受信ノード200”において,受信アプリ210は,自身のプロパティ情報や処理の実行状態をアプリ状況テーブルに記録する際に,自受信ノード200”のノードIDでアプリ状況テーブル記憶部400にアクセスし,情報の記録・更新を行う。また,受信制御部230は,自受信ノード200”の受信アプリ210の情報を取得する際に,自受信ノード200”のノードIDでアプリ状況テーブル記憶部400にアクセスし,情報の取得を行う。
なお,アプリ状況テーブルの情報を受信ノード200”内部と,外部のアプリ状況テーブル記憶部400とに分けて管理する実施も可能である。例えば,アプリ状況テーブルの情報のうち,各受信アプリ210の必要リソースの情報を受信ノード200”内部で管理し,各受信アプリ210の処理の実行状態のみを外部のアプリ状況テーブル記憶部400で管理するようにしてもよい。
本実施の形態3において,送信ノード100の送信アプリ110は,アプリ状況テーブル記憶部400のアプリ状況テーブルを参照し,システム内に待機状態の受信アプリ210が存在するかを確認する。送信アプリ110は,システム内に待機状態の受信アプリ210が存在する場合に,キューマネージャ120にメッセージの送信を依頼する。
図14は,本実施の形態3における送信ノードの送信アプリによる処理のフローチャートである。
送信ノード100において,送信アプリ110は,受信アプリ210に対して処理要求のメッセージを送る際に,該当受信アプリ210のアプリIDでアプリ状況テーブル記憶部400のアプリ状況テーブルを参照する(ステップS90)。
送信アプリ110は,システム内のいずれかの受信ノード200”に,該当受信アプリ210が存在するかを判定する(ステップS91)。システム内のいずれの受信ノード200”にも該当受信アプリ210が存在しない場合には(ステップS91のNO),送信アプリ110は,ステップS90の処理に戻って,次のタイミングを待つ。例えば,アプリ状況テーブル記憶部400のアプリ状況テーブルに,該当受信アプリ210のアプリIDのレコードがない場合には,該当受信アプリ210は存在しないと判定される。受信ノード200”において,受信アプリ210が動的に起動・削除される環境では,目的とする受信アプリ210がシステム内のいずれの受信ノード200”にも存在しないことがあり得る。
システム内のいずれかの受信ノード200”に該当受信アプリ210が存在する場合には(ステップS91のYES),送信アプリ110は,待機状態の該当受信アプリ210が存在するかを判定する(ステップS92)。待機状態の該当受信アプリ210が存在しない場合には(ステップS91のNO),送信アプリ110は,ステップS90の処理に戻って,次のタイミングを待つ。
待機状態の該当受信アプリ210が存在する場合には(ステップS92のYES),送信アプリ110は,受信アプリ210に対して処理要求を行うメッセージに,メタ情報を付与する(ステップS93)。送信アプリ110は,キューマネージャ120に対して,メッセージの送信を依頼する(ステップS94)。
ここまで説明したように,本実施の形態3の送信ノード100における送信アプリ110は,アプリ状況テーブル記憶部400のアプリ状況テーブルで,目的とする待機状態の受信アプリ210があるかを確認する。送信アプリ110は,目的とする待機状態の受信アプリ210がある場合にのみ,キューマネージャ120にメッセージの送信を依頼する。
すなわち,送信ノード100は,受信ノード200”がすぐには受信できないメッセージを,キュー領域300に送信しないようになる。これにより,すぐに処理されないメッセージがキュー領域300に滞留することでキュー領域300が枯渇することを防止できる。
〔実施例〕
図15は,本実施例によるメッセージ通信を行うシステムを示す図である。
図15に示すシステムにおいて,送信ノード500は,例えば図1に示す送信ノード100に相当する。受信ノード600,受信ノード700は,例えば図1に示す受信ノード200に相当する。受信ノード600,受信ノード700は,動的にリソース量が変化する仮想マシンであるものとする。キュー領域800は,例えば図1に示すキュー領域300に相当する。
受信ノード600で動作する受信アプリ610aと,受信ノード700で動作する受信アプリ710aは,それぞれが異なる受信ノードで動作する,同じアプリケーション(アプリID:“app#a”)のプロセスであるものとする。また,受信ノード600で動作する受信アプリ610bと,受信ノード700で動作する受信アプリ710bは,それぞれが異なる受信ノードで動作する,同じアプリケーション(アプリID:“app#b”)のプロセスであるものとする。
ここで,送信ノード500は,メッセージMa1 ,メッセージMa2 ,メッセージMbの順でメッセージを発行する。メッセージMa1 とメッセージMa2 の宛先のアプリIDは,“app#a”であり,メッセージMbの宛先のアプリIDは,“app#b”であるものとする。図15に示すように,キュー領域800には,メッセージMa1 ,メッセージMa2 ,メッセージMbの順でメッセージが格納される。
この時点で,受信ノード600の受信アプリ610a,610b,および受信ノード700の受信アプリ710a,710bは,すべて待機状態であるものとする。このタイミングで,受信ノード600は,定期的な受信チェックを行い,受信アプリ610aが待機状態であることを確認し,また受信アプリ610aが処理を実行するのに十分な空きリソース量があることを確認する。受信ノード600は,受信アプリ610aのアプリID“app#a”でキュー領域800を検索し,メッセージMa1 を取得する。受信アプリ610aは,メッセージMa1 の内容に応じた処理の実行を開始する。
次のタイミングで,受信ノード700は,定期的な受信チェックを行い,受信アプリ710aが待機状態であることを確認し,また受信アプリ710aが処理を実行するのに十分な空きリソース量があることを確認する。受信ノード700は,受信アプリ710aのアプリID“app#a”でキュー領域800を検索し,メッセージMa2 を取得する。受信アプリ710aは,メッセージMa2 の内容に応じた処理の実行を開始する。
次のタイミングで,受信ノード600は,定期的な受信チェックを行い,受信アプリ610bが待機状態であることを確認する。ここで,ノードのリソース量が時間変化しないという前提であれば,通常,ノードのリソース量に応じたアプリケーションプロセスの実装が行われるので,アプリケーションプロセスの待機状態が確認できれば,メッセージを受信しても問題はない。従来であれば,この時点で,キュー領域800から,受信アプリ610bに対応するメッセージMbが取得されていた。
しかし,受信ノード600は割り当てられるリソース量が時間変化するので,ある時点で空きリソース量が十分であることが確認されて受信アプリ610bが起動されたとしても,別の時点では受信アプリ610bが処理を実行するのに十分な空きリソース量がないというケースが発生し得る。このタイミングでは,受信ノード600に割り当てされるリソース量が減っていて,受信アプリ610bが処理を実行するのに十分な空きリソース量がないものとする。このとき,受信ノード600は,受信アプリ610bに対するメッセージの受信を行わないと判断する。すなわち,受信ノード600は,キュー領域800にあるアプリID“app#b”のメッセージMbの取り出しを行わない。
次のタイミングで,受信ノード700は,定期的な受信チェックを行い,受信アプリ710bが待機状態であることを確認する。また,受信ノード700は,この時点での自身の空きリソース量が,受信アプリ710bが処理を実行するのに十分な量であることを確認する。受信ノード700は,受信アプリ710bのアプリID“app#b”でキュー領域800を検索し,メッセージMbを取得する。受信アプリ710bは,メッセージMbの内容に応じた処理の実行を開始する。
本実施例に示すように,ある時点において,十分なリソースがある受信ノード700が存在するのに,リソース量が足りない受信ノード600がメッセージMbを取得して処理が滞ってしまうといった問題の発生を防ぐことが可能となる。このように,上述の本実施の形態によるメッセージ通信の技術を用いれば,受信ノード600,700に割り当てられるリソース量が時間変動していても,その時点で処理を実行可能な受信ノード600,700のみがメッセージを取得するので,円滑なシステムの運用が可能となる。
以上,本実施の形態について説明したが,本発明はその主旨の範囲において種々の変形が可能であることは当然である。