以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の情報処理システムの例を示す図である。
第1の実施の形態の情報処理システムは、中継プロセス10、装置21(第1の装置)、装置22(第2の装置)および装置23(第3の装置)を有する。装置21〜23は、情報処理装置やコンピュータと呼ばれるものであってもよい。装置21〜23は、ユーザが操作する端末装置(クライアントコンピュータなど)でもよいし、端末装置からアクセスされるサーバ装置(サーバコンピュータなど)でもよい。一例として、装置22が端末装置であり、装置21,23がサーバ装置である形態が考えられる。
装置21と装置22とは、中継プロセス10を介して通信可能である。また、装置23と装置22とは、中継プロセス10を介して通信可能である。中継プロセス10は、装置21,23と装置22との間でデータを転送する。中継プロセス10は、リバースプロキシであってもよい。例えば、中継プロセス10は、装置22から具体的な通信相手(装置21または装置23)を隠蔽する。中継プロセス10は、装置21に配置されてもよいし、装置23に配置されてもよいし、装置21〜23と異なる装置に配置されてもよい。
ここで、装置22の通信相手が最初は装置21であり、装置22の通信相手を途中で装置21から装置23に切り替える場合を考える。装置21から装置23への切り替えは、例えば、装置21の負荷が高い場合、中継プロセス10と装置21の間の通信路が輻輳している場合、装置21の保守作業を行う場合などに実行され得る。このとき、装置22と通信するアプリケーションプロセスを、装置21から装置23に移動してもよい。
装置22の通信相手が装置21であるとき、中継プロセス10は、装置21側にコネクション11を確立し、装置22側にコネクション12を確立する。コネクション11,12は、例えば、TCPコネクションである。中継プロセス10が装置21,22と異なる他の装置(装置23でもよい)に配置されている場合、例えば、当該他の装置と装置21との間にコネクション11が確立され、当該他の装置と装置22との間にコネクション12が確立される。中継プロセス10が装置21に配置されている場合、中継プロセス10の装置21側のコネクション11は、装置21に配置されたアプリケーションプロセスと中継プロセス10との間の同一装置内のコネクションを意味する。
中継プロセス10は、コネクション11とコネクション12とを対応付けた制御情報15を記憶する。制御情報15は、例えば、中継プロセス10が配置された装置が有する記憶装置に記憶される。記憶装置は、RAM(Random Access Memory)などの揮発性の記憶装置でもよいし、HDD(Hard Disk Drive)などの不揮発性の記憶装置でもよい。
中継プロセス10は、制御情報15に基づいて、コネクション11とコネクション12との間でデータを転送する。すなわち、中継プロセス10は、コネクション11から受信したデータをコネクション12に送信し、コネクション12から受信したデータをコネクション11に送信する。コネクション11,12上で送信されるデータには、コネクション11,12より上位の通信レイヤのメッセージが含まれる。例えば、コネクション11,12がTCPコネクションである場合、TCPより上位の通信プロトコルであるWebソケットのメッセージが、コネクション11,12上で送信され得る。
装置22の通信相手を装置21から装置23に切り替える場合、通信アドレス(例えば、IP(Internet Protocol)アドレスやTCPポート番号)が変わるため、コネクション11を装置23に引き継ぐことはできない。このとき、装置21が装置22に対して、コネクション11,12より上位の通信レイヤの切断指示メッセージ14を送信することがある。コネクション11,12がTCPコネクションである場合、切断指示メッセージ14は、TCPの制御パケットであるFINパケットとは異なる。切断指示メッセージ14の例として、Webソケットのクローズメッセージなどが挙げられる。
中継プロセス10は、コネクション11から切断指示メッセージ14を受信すると、切断指示メッセージ14を終端する。すなわち、中継プロセス10は、切断指示メッセージ14を、指定された宛先(装置22)に転送せずに破棄する。切断指示メッセージ14が装置22に転送されると、装置22は、上位の通信レイヤのサービスが終了または中断されたと認識することになり、コネクション12を切断してしまう。一方、切断指示メッセージ14が中継プロセス10でブロックされると、装置22は、上位の通信レイヤのサービスが継続していると認識し、コネクション12を切断しない。
ただし、中継プロセス10は、装置22の通信相手を切り替えようとしている場合のみ切断指示メッセージ14を終端し、それ以外の場合は切断指示メッセージ14を装置22に転送するようにしてもよい。通信相手を切り替えようとしているか否かは、このシステムを管理する管理サーバが中継プロセス10に通知してもよい。また、中継プロセス10は、切断指示メッセージ14を受信すると、制御情報15を更新して、切断指示メッセージ14を受信したことを制御情報15に反映させる。例えば、中継プロセス10は、切断指示メッセージ14を受信したことを示す情報を、コネクション11と対応付けて制御情報15に記録する。また、例えば、中継プロセス10は、コネクション11が不要になったことまたはコネクション11を切断したことを、制御情報15に記録する。
その後、中継プロセス10は、装置21から装置23への切り替えの通知を受け付ける。切り替えの通知は、例えば、このシステムを管理する管理サーバが中継プロセス10に通知する。切り替えの通知は、装置21から装置23へのアプリケーションプロセスの移動が完了したことを示す通知であってもよい。中継プロセス10は、切り替えの通知があり、かつ、制御情報15が切断指示メッセージ14を既に受信したことを示している場合、装置23側に確立されたコネクション13を使用可能にする。
コネクション13は、コネクション11,12と同じ種類のコネクションであり、例えば、TCPコネクションである。中継プロセス10が装置23と異なる他の装置(装置21でもよい)に配置されている場合、例えば、当該他の装置と装置23との間にコネクション13が確立される。中継プロセス10が装置23に配置されている場合、中継プロセス10の装置23側のコネクション13は、装置23に配置されたアプリケーションプロセスと中継プロセス10との間の同一装置内のコネクションを意味する。
中継プロセス10は、切り替えの通知を受け付けてからコネクション13を確立してもよいし、切り替えの通知を受け付ける前に予めコネクション13を確立しておいてもよい。前者の場合、コネクション13を使用可能にすることは、コネクション13を確立することを含んでもよい。後者の場合、コネクション13を使用可能にすることは、装置22にコネクション13を割り当てることを含んでもよい。また、コネクション13を使用可能にすることは、コネクション13に上位の通信レイヤのサービスを対応付ける(例えば、コネクション13上で上位の通信レイヤのハンドシェイクを行う)ことを含んでもよい。
中継プロセス10は、コネクション13を使用可能にすると、コネクション12とコネクション13とを対応付け、その対応関係を示すように制御情報15を更新する。例えば、コネクション11とコネクション12の対応関係に代えて、コネクション12とコネクション13の対応関係が制御情報15に登録される。以降、中継プロセス10は、制御情報15に基づいて、コネクション12とコネクション13との間でデータを転送する。すなわち、中継プロセス10は、コネクション12から受信したデータをコネクション13に送信し、コネクション13から受信したデータをコネクション12に送信する。
第1の実施の形態の情報処理システムによれば、装置22の通信相手を装置21から装置23に切り替えるとき、装置21から装置22に対して発行された上位の通信レイヤの切断指示メッセージ14が、中継プロセス10において終端される。これにより、上位の通信レイヤのサービスが継続していると装置22に認識させることができ、切断指示メッセージ14に反応して装置22がコネクション12を切断してしまうことを抑制できる。
そして、切り替え完了後は、コネクション12とコネクション13が対応付けられ、中継プロセス10によって装置22と装置23との間でデータが中継される。これにより、装置22は、切り替え前に確立したコネクション12を切り替え後も使用し続けることができ、新たにコネクションを確立し直さなくてよい。よって、装置22のユーザは、ログイン手続などの操作を行わずに切り替え後もサービスを継続して利用することができ、ユーザの利便性が低下しないようにすることができる。
[第2の実施の形態]
次に、第2の実施の形態を説明する。
図2は、第2の実施の形態の情報処理システムの例を示す図である。
第2の実施の形態の情報処理システムは、クラウド30、拠点40,50およびネットワーク60を含む。クラウド30および拠点40,50は、互いに離れた場所に設置されており、広域のネットワーク60を介して接続されている。
クラウド30は、複数の拠点から利用できる共有の情報処理施設であり、例えば、データセンタを用いて実現される。拠点40,50は、組織のメンバーが業務を行う施設であり、例えば、会社の従業員が業務を行うオフィスや工場である。
クラウド30は、Webサーバ100aおよび配備計画サーバ200を含む。拠点40は、端末装置41,42、DNS(Domain Name System)サーバ43およびWebサーバ100を含む。端末装置41,42、DNSサーバ43およびWebサーバ100は、拠点40内のローカルのネットワーク44に接続されている。ネットワーク44は、ネットワーク60に接続されている。拠点50は、端末装置51,52、DNSサーバ53およびWebサーバ100bを含む。端末装置51,52、DNSサーバ53およびWebサーバ100bは、拠点50内のローカルのネットワーク54に接続されている。ネットワーク54は、ネットワーク60に接続されている。
端末装置41,42,51,52は、ユーザが操作するクライアントコンピュータである。端末装置41,42,51,52は、Webブラウザなどのクライアントアプリケーションを実行し、Webサーバ100,100a,100bで実行されるサーバアプリケーションと通信する。DNSサーバ43,53は、ドメイン名とIPアドレスとの対応関係を管理するサーバコンピュータである。DNSサーバ43は、端末装置41,42からドメイン名を指定したアドレス解決要求を受信し、ドメイン名に対応するIPアドレスを回答する。同様に、DNSサーバ53は、端末装置51,52からドメイン名を指定したアドレス解決要求を受信し、ドメイン名に対応するIPアドレスを回答する。
Webサーバ100,100a,100bは、クライアントアプリケーションに対してサービスを提供するサーバアプリケーションを実行することができる。サーバアプリケーションは、URLによって識別される。第2の実施の形態では、サーバアプリケーションは、Webサーバ100,100a,100bの間で移動することができる。端末装置41,42,51,52がサーバアプリケーションの位置を認識しなくてよいように、Webサーバ100,100bは更にリバースプロキシを実行する。
サーバアプリケーションに対しては、当該サーバアプリケーションが配置されたWebサーバに依存する実URLとは別に、Webサーバに依存しない仮想URLが付与される。DNSサーバ43は、仮想URLに対してWebサーバ100のIPアドレスを対応付ける。これにより、端末装置41,42のユーザが仮想URLを指定すると、クライアントアプリケーションはWebサーバ100にアクセスすることになる。Webサーバ100のリバースプロキシは、仮想URLに対応するサーバアプリケーションがWebサーバ100に存在しない場合、適切なWebサーバにアクセスを転送する。
同様に、DNSサーバ53は、仮想URLに対してWebサーバ100bのIPアドレスを対応付ける。これにより、端末装置51,52のユーザが仮想URLを指定すると、クライアントアプリケーションはWebサーバ100bにアクセスすることになる。Webサーバ100bのリバースプロキシは、仮想URLに対応するサーバアプリケーションがWebサーバ100bに存在しない場合、適切なWebサーバにアクセスを転送する。これにより、端末装置41,42,51,52のクライアントアプリケーションは、サーバアプリケーションの位置を意識せずにサーバアプリケーションと通信できる。
配備計画サーバ200は、Webサーバ100,100a,100bへのサーバアプリケーションの配置を制御するサーバコンピュータである。サーバアプリケーションの配置は、クラウド30と拠点40,50との間の通信状況、Webサーバ100,100a,100bの負荷、Webサーバ100,100a,100bの保守スケジュールなどに応じて決定される。例えば、最初は、クラウド30内のWebサーバ100aにサーバアプリケーションが配置される。拠点40から当該サーバアプリケーションへのアクセスが多く、ネットワーク60の遅延が大きい場合、Webサーバ100aからWebサーバ100にサーバアプリケーションを移動することが考えられる。
なお、サーバアプリケーションの配置は、サーバアプリケーション毎、すなわち、仮想URL毎に変更することが可能である。また、図2では配備計画サーバ200をクラウド30に設置したが、拠点40または拠点50に設置することもできる。
図3は、Webサーバのハードウェア例を示すブロック図である。
Webサーバ100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107を有する。CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107は、バス108に接続されている。なお、端末装置41,42,51,52、DNSサーバ43,53、Webサーバ100a,100bおよび配備計画サーバ200も、Webサーバ100と同様のハードウェアを用いて実現することができる。
CPU101は、プログラムの命令を実行する演算回路を含むプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを備えてもよく、Webサーバ100は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。また、複数のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼んでもよい。
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、Webサーバ100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。プログラムには、セッション制御プログラムが含まれる。なお、Webサーバ100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部104は、CPU101からの命令に従って、Webサーバ100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなどを用いることができる。ただし、ディスプレイ111が、Webサーバ100の筐体と一体に形成されていてもよい。
入力信号処理部105は、Webサーバ100に接続された入力デバイス112から入力信号を取得し、CPU101に出力する。入力デバイス112としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、Webサーバ100に、複数の種類の入力デバイスが接続されていてもよい。ただし、入力デバイス112が、Webサーバ100の筐体と一体に形成されていてもよい。
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
通信インタフェース107は、ネットワーク44に接続され、ネットワーク44を介して他の情報処理装置と通信を行うインタフェースである。通信インタフェース107は、スイッチなどの通信装置とケーブルで接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
図4は、第2の実施の形態のサーバアプリケーションの配備例を示す図である。
Webサーバ100は、リバースプロキシ120および実行環境150を実行する。Webサーバ100aは、リバースプロキシ120aおよび実行環境150aを実行する。Webサーバ100bは、リバースプロキシ120bおよび実行環境150bを実行する。サーバアプリケーション140が、最初はWebサーバ100aで実行されており、その後にWebサーバ100に移動する場合を考える。なお、第2の実施の形態では、リバースプロキシ120,120bはサーバアプリケーション140と直接通信するため、Webサーバ100aはリバースプロキシ120aを実行しなくてもよい。
Webサーバ100のIPアドレスは「10.x.x.40」である。Webサーバ100aのIPアドレスは「10.x.x.30」である。Webサーバ100bのIPアドレスは「10.x.x.50」である。サーバアプリケーション140がWebサーバ100aに配置されている場合、サーバアプリケーション140には「ws://10.x.x.30:8880」を含む実URLが付与される。サーバアプリケーション140がWebサーバ100に配置されている場合、サーバアプリケーション140には「ws://10.x.x.40:8880」を含む実URLが付与される。
一方、リバースプロキシ120,120bには「ws://vurl:80」を含む仮想URLが付与される。実行環境150,150a,150bは、受信したアクセスをURLに応じて振り分ける。実行環境150は、「ws://vurl:80」を含むアクセスをリバースプロキシ120に転送する。サーバアプリケーション140がWebサーバ100に配置されている場合、実行環境150は、「ws://10.x.x.40:8880」を含むアクセスをサーバアプリケーション140に転送する。
サーバアプリケーション140がWebサーバ100aに配置されている場合、実行環境150aは、「ws://10.x.x.30:8880」を含むアクセスをサーバアプリケーション140に転送する。実行環境150bは、「ws://vurl:80」を含むアクセスをリバースプロキシ120bに転送する。
リバースプロキシ120,120bは、「ws://vurl:80」を含むアクセスを受信すると、その仮想URLをサーバアプリケーション140の実URLに変換してアクセスを転送する。サーバアプリケーション140がWebサーバ100aに配置されている場合、リバースプロキシ120,120aは、「ws://vurl:80」を「ws://10.x.x.30:8880」に変換してアクセスを転送する。一方、サーバアプリケーション140がWebサーバ100に配置されている場合、リバースプロキシ120,120aは、「ws://vurl:80」を「ws://10.x.x.40:8880」に変換してアクセスを転送する。これにより、仮想URLを指定したアクセスがサーバアプリケーション140に到達する。
また、実行環境150,150a,150bは、配備計画サーバ200からの指示に応じてサーバアプリケーション140を移動する。例えば、移動元のWebサーバの実行環境は、移動先のWebサーバの実行環境に対してサーバアプリケーション140のプログラムを送信する。また、第2の実施の形態では、サーバアプリケーション140の移動にあたって内部状態も引き継ぐようにする。このため、プログラムと併せて、サーバアプリケーション140の実行状況を示す一時データも送信する。移動元のWebサーバの実行環境は、サーバアプリケーション140を停止する。移動先のWebサーバの実行環境は、受信したプログラムとデータに基づいてサーバアプリケーション140を起動する。
ところで、端末装置41,42,51,52およびWebサーバ100,100a,100bは、ネットワーク層の通信プロトコルとしてIPを使用することができる。また、端末装置41,42,51,52およびWebサーバ100,100a,100bは、トランスポート層の通信プロトコルとしてTCPを使用することができる。また、端末装置41,42,51,52およびWebサーバ100,100a,100bは、更に上位の通信プロトコルとして、HTTPおよびWebソケットを使用することができる。端末装置41,42,51,52のクライアントアプリケーションとサーバアプリケーション140とは、HTTPおよびWebソケットを用いて通信する。
図5は、HTTPパケットとWebソケットパケットの例を示す図である。
(A)HTTPパケット61は、TCPコネクション上で送信される。HTTPパケット61は、IPヘッダ、TCPヘッダ、HTTPヘッダおよびHTTPペイロードを含む。IPヘッダは、宛先IPアドレスと送信元IPアドレスを含む。TCPヘッダは、宛先ポート番号と送信元ポート番号を含む。HTTPヘッダは、UpgradeおよびConnectionを含む。更に、HTTPリクエストのHTTPヘッダは、メソッドを含む。HTTPレスポンスのHTTPヘッダは、ステータス番号を含む。HTTPペイロードは、上り通信におけるPOSTデータや、下り通信におけるHTML(HyperText Markup Language)ファイルなどのデータを含む。
メソッドは、GETやPOSTなどの命令とURLとを含む。例えば、GETメソッドは、URLが示すサーバアプリケーションに対してコンテンツを要求するときに用いられる。POSTメソッドは、URLが示すサーバアプリケーションに対してデータをアップロードするときに用いられる。ステータス番号は、サーバアプリケーションの処理結果を示す。例えば、「200」は、HTTPリクエストが正常に処理されたことを示す。「101」は、通信プロトコルをHTTPから他のものに切り替えることを示す。
Upgradeの項目は、通信プロトコルを切り替える場合に切り替え後の通信プロトコルを示す。Connectionの項目は、そのHTTPメッセージの後にTCPコネクションをどのように取り扱うかを示す。例えば、「Close」は、TCPコネクションを切断することを示す。「Upgrade」は、TCPコネクションを維持し、そのTCPコネクション上で上位の通信プロトコルを変更することを示す。
(B)Webソケットパケット62は、TCPコネクション上で送信される。Webソケットパケット62は、IPヘッダ、TCPヘッダ、Webソケットヘッダ(WSヘッダ)およびWebソケットペイロード(WSペイロード)を含む。IPヘッダとTCPヘッダは、HTTPパケット61と同じである。WSヘッダは、HTTPヘッダよりもサイズが小さく軽量なヘッダであり、OpCodeを含む。WSペイロードは、クライアントアプリケーションとサーバアプリケーションの一方から他方に送信されるデータを含む。
OpCodeは、WSペイロードの形式や、送信元から宛先に対する命令を示す。OpCodeは、4ビットで表現することができる。例えば、「0(0x0)」は、WSペイロードが前のパケットの続きであることを示す。「1(0x1)」は、WSペイロードがテキストデータを含むことを示す。「2(0x2)」は、WSペイロードがバイナリデータを含むことを示す。「8(0x8)」は、Webソケットによる通信の終了(クローズ)を示す。「9(0x9)」は、疎通確認(ping)を示す。「10(0xA)」は、疎通応答(pingに対する応答)を示す。
HTTPでは、ひとまとまりのHTTPメッセージの送信が完了する毎に、クライアントアプリケーションとサーバアプリケーションとの間のTCPコネクションが切断される。例えば、クライアントアプリケーションが一のWebページを要求するHTTPリクエストを送信し、サーバアプリケーションが要求されたWebページに関するデータを含むHTTPレスポンスを返信すると、両者の間のTCPコネクションは切断される。別のWebページを要求する場合には、改めてTCPコネクションを確立することになる。
これに対し、Webソケットでは、クライアントアプリケーションがサーバアプリケーションの利用を開始してから終了するまでの間、原則として両者の間にTCPコネクションが維持される。サーバアプリケーションの利用を開始してから終了するまでの一連の通信をWebソケットセッション(WSセッション)と言うことがある。Webソケットは、クライアントアプリケーションとサーバアプリケーションの間で小さなデータが頻繁に送信される場合や、サーバアプリケーションからクライアントアプリケーションに対してデータがプッシュされる場合に利用されることがある。サーバアプリケーションの一例として、チャットアプリケーションが挙げられる。
クライアントアプリケーションおよびサーバアプリケーションそれぞれから見て、1つのWSセッションは1つのTCPコネクションと対応する。クライアントアプリケーションまたはサーバアプリケーションは、通信相手からOpCode=0x8を含むWebソケットメッセージ(クローズ通知)を受信すると、WSセッションが終了または中断されたと認識する。すると、クライアントアプリケーションまたはサーバアプリケーションは、そのWSセッションに対応するTCPコネクションを切断する。
クライアントアプリケーションがクローズ通知を受信した後、再びサーバアプリケーションのサービスを利用したい場合、改めてサーバアプリケーションとの間にTCPコネクションを確立することになる。クライアントアプリケーションは、TCPコネクション上でログインなどの手続を行うことが考えられる。このとき、前のWSセッションを再開できる(前の内部状態を引き継ぐことができる)場合もあるし、前のWSセッションは終了しており新たなWSセッションを開始することになる場合もある。
図6は、Webソケットによる第1の通信例を示すシーケンス図である。
ここでは、サーバアプリケーション140がWebサーバ100aに配置されており、端末装置41がWebサーバ100aとWebソケットによって通信する場合を考える。また、端末装置41とWebサーバ100aとが、リバースプロキシ120を経由せずに直接通信すると仮定する。例えば、端末装置41のユーザがサーバアプリケーション140の実URLを入力した場合に、図6のような通信が発生する。
端末装置41は、Webサーバ100aとの間でTCPの3ウェイハンドシェイク(TCPハンドシェイク)を実行することで、TCPコネクションを確立する(S110)。すなわち、端末装置41は、SYNパケット(SYN=1,ACK=0のパケット)をWebサーバ100aに送信する。Webサーバ100aは、SYN−ACKパケット(SYN=1,ACK=1のパケット)を端末装置41に送信する。端末装置41は、ACKパケット(SYN=0,ACK=1のパケット)をWebサーバ100aに送信する。SYNビットは接続要求を示し、ACKビットは接続要求に対する許可応答を示す。
端末装置41は、TCPコネクション上でWSハンドシェイク要求をWebサーバ100aに送信する(S111)。WSハンドシェイク要求は、HTTPヘッダのUpgradeを「websocket」に設定したHTTPリクエストである。Webサーバ100aは、WSハンドシェイク要求を受信すると、TCPコネクション上でWSハンドシェイク応答を端末装置41に送信する(S112)。WSハンドシェイク応答は、HTTPヘッダのステータス番号を「101」、Upgradeを「websocket」、Connectionを「Upgrade」に設定したHTTPレスポンスである。
なお、Webソケットハンドシェイク(WSハンドシェイク)は、TCPコネクション上でWebソケットの通信を可能にする(WSセッションを開始する)ための手続である。WSハンドシェイクは、Openingハンドシェイクと言うこともある。
これにより、以降は端末装置41とWebサーバ100aの間で、アプリケーション層の通信プロトコルとしてHTTPに代えてWebソケットが使用される。例えば、端末装置41は、TCPコネクション上で、WebソケットのデータをWebサーバ100aに送信する(S113)。Webサーバ100aは、端末装置41からのアクセスを待たずに端末装置41にデータを送信することもできる。
Webソケットの通信を終了する場合、Webサーバ100aは、TCPコネクション上でクローズ通知を端末装置41に送信する(S114)。クローズ通知は、前述の通り、WSヘッダのOpCodeを「0x8」に設定したWebソケットメッセージである。端末装置41は、Webサーバ100aからクローズ通知を受信すると、端末装置41とWebサーバ100aとの間のTCPコネクションを切断する(S115)。すなわち、端末装置41は、Webサーバ100aにFINパケットを送信する。Webサーバ100aは、端末装置41にFINパケットを返信する。
TCPコネクションは、ステップS110でTCPハンドシェイクが行われてから、ステップS115で切断されるまで維持されることになる。TCPコネクション上に形成されるWSセッションは、ステップS112でWSハンドシェイクが完了してからステップS114でクローズ通知が送信されるまで維持されることになる。
次に、端末装置41がサーバアプリケーション140との間にTCPコネクションを維持しているときに、サーバアプリケーション140を移動する場合の問題点を説明する。
図7は、Webソケットによる第2の通信例を示すシーケンス図である。
ここでは、サーバアプリケーション140は最初にWebサーバ100aに配置されており、その後にWebサーバ100に移動するものとする。また、図6と同様に、端末装置41とWebサーバ100,100aとが、リバースプロキシ120を経由せずに直接通信すると仮定する。
端末装置41は、Webサーバ100aとTCPハンドシェイクを行い、端末装置41とWebサーバ100aとの間にTCPコネクションを確立する(S120)。端末装置41は、HTTPによりWSハンドシェイク要求をWebサーバ100aに送信する(S121)。Webサーバ100aは、HTTPによりWSハンドシェイク応答を端末装置41に送信する(S122)。端末装置41は、WSセッションの中でWebソケットのデータをWebサーバ100aに送信する(S123)。
ここで、配備計画サーバ200がサーバアプリケーション140をWebサーバ100aからWebサーバ100に移動すると決定したとする。配備計画サーバ200がWebサーバ100aに移動を指示すると、上記のTCPコネクションを維持できないため、Webサーバ100aはクローズ通知を端末装置41に送信する(S124)。端末装置41は、クローズ通知を受信するとTCPコネクションを切断する(S125)。
クローズ通知を受信すると、端末装置41からは、サーバアプリケーション140側の都合によってサービスが突然利用できなくなった(例えば、サービスから強制的にログアウトさせられた)ように見える。端末装置41のクライアントアプリケーションは、例えば、サービスが利用不可になったことをユーザに通知する。サーバアプリケーション140のサービスを再び利用したい場合、端末装置41は、Webサーバ100にアクセスすることになる。このとき、端末装置41のユーザが、適切なURLを入力する、ユーザIDとパスワードを指定してログインするなどの操作を要する場合がある。
端末装置41は、Webサーバ100とTCPハンドシェイクを行い、端末装置41とWebサーバ100との間にTCPコネクションを確立する(S126)。端末装置41は、HTTPによりWSハンドシェイク要求をWebサーバ100に送信する(S127)。Webサーバ100は、HTTPによりWSハンドシェイク応答を端末装置41に送信する(S128)。端末装置41は、WSセッションの中でWebソケットのデータをWebサーバ100に送信する(S129)。
正常にWSセッションを終了する場合、Webサーバ100は、クローズ通知を端末装置41に送信する(S130)。端末装置41は、クローズ通知を受信するとTCPコネクションを切断する(S131)。ただし、端末装置41からWebサーバ100にクローズ通知を送信することも可能である。
ステップS120からステップS125まで1つのTCPコネクションが維持され、ステップS126からステップS131まで1つのTCPコネクションが維持されている。一方、ステップS125とステップS126の間はTCPコネクションが存在しない。
また、端末装置41から見て、ステップS122からステップS124までとステップS128からステップS130までは、WSセッションが維持されている。一方、端末装置41から見て、ステップS125とステップS126の間はWSセッションが利用不可である。なお、端末装置41からは、ステップS124でWSセッションが終了し、ステップS128で新たなWSセッションが開始されたように見えることがある。また、端末装置41からは、ステップS124でWSセッションが中断され、ステップS128で当該WSセッションが再開されたように見えることがある。
このように、Webソケット通信を行うサーバアプリケーション140を移動すると、端末装置41のユーザの利便性が低下するおそれがある。そこで、第2の実施の形態では、リバースプロキシ120を利用することで、端末装置41からTCPコネクションの切断を隠蔽し、移動中もWSセッションが継続しているように見せるようにする。
図8は、Webソケットによる第3の通信例を示すシーケンス図である。
ここでは、図7と同様に、サーバアプリケーション140が最初にWebサーバ100aに配置されており、その後にWebサーバ100に移動するものとする。ただし、端末装置41は、リバースプロキシ120経由でサーバアプリケーション140と通信する。
端末装置41は、リバースプロキシ120とTCPハンドシェイクを行い、端末装置41とリバースプロキシ120との間にTCPコネクションを確立する(S140)。端末装置41は、サーバアプリケーション140の仮想URLを指定したWSハンドシェイク要求をリバースプロキシ120に送信する(S141)。リバースプロキシ120は、仮想URLをサーバアプリケーション140の実URLに変換する。
リバースプロキシ120は、Webサーバ100aに配置されたサーバアプリケーション140とTCPハンドシェイクを行い、リバースプロキシ120とサーバアプリケーション140との間にTCPコネクションを確立する(S142)。リバースプロキシ120は、サーバアプリケーション140の実URLを指定したWSハンドシェイク要求をサーバアプリケーション140に送信する(S143)。
サーバアプリケーション140は、WSハンドシェイク応答をリバースプロキシ120に送信する。リバースプロキシ120は、WSハンドシェイク応答を端末装置41に転送する(S144)。端末装置41は、Webソケットのデータをリバースプロキシ120に送信する。リバースプロキシ120は、Webソケットのデータをサーバアプリケーション140に転送する(S145)。
ここで、配備計画サーバ200がサーバアプリケーション140をWebサーバ100aからWebサーバ100に移動すると決定したとする。配備計画サーバ200がサーバアプリケーション140に移動指示を送信すると、サーバアプリケーション140はクローズ通知をリバースプロキシ120に送信する(S146)。リバースプロキシ120は、受信したクローズ通知を終端する。すなわち、リバースプロキシ120は、クローズ通知を端末装置41に転送せずに破棄する。なお、後述するように、リバースプロキシ120は、配備計画サーバ200から移動開始通知を受信した場合のみクローズ通知を終端し、それ以外の場合は通常のWebソケットメッセージと同様に転送することになる。
リバースプロキシ120は、クローズ通知を受信すると、リバースプロキシ120とサーバアプリケーション140との間のTCPコネクションを切断する(S147)。一方、リバースプロキシ120は、端末装置41とリバースプロキシ120との間のTCPコネクションは切断しない。クローズ通知が端末装置41に転送されないため、端末装置41によっても当該TCPコネクションは切断されない。
端末装置41は、WSセッションが継続していると認識しているため、Webソケットのデータをリバースプロキシ120に送信する(S148)。リバースプロキシ120は、リバースプロキシ120とサーバアプリケーション140との間にTCPコネクションが存在しないため、受信したデータをバッファに保存しておく。
そして、リバースプロキシ120は、後述するように配備計画サーバ200から移動完了通知を受信すると、Webサーバ100に移動したサーバアプリケーション140とTCPハンドシェイクを行い、TCPコネクションを確立する(S149)。このTCPコネクションは、Webサーバ100の内部に形成されたコネクションである。リバースプロキシ120は、WSハンドシェイク要求をサーバアプリケーション140に送信する(S150)。サーバアプリケーション140は、WSハンドシェイク応答をリバースプロキシ120に送信する(S151)。リバースプロキシ120は、バッファに保存されたデータをサーバアプリケーション140に転送する(S152)。
なお、前述のように、サーバアプリケーション140をWebサーバ100aからWebサーバ100に移動するとき、WSセッションの状態を示す一時データ(セッションデータ)も移動する。このため、サーバアプリケーション140は、ステップS146のクローズ通知を送信する前の文脈(コンテキスト)を引き継ぐことができる。
正常にWSセッションを終了する場合、サーバアプリケーション140は、クローズ通知をリバースプロキシ120に送信する。リバースプロキシ120は、配備計画サーバ200から移動開始通知を受信していないため、通常のWebソケットメッセージと同様にクローズ通知を端末装置41に転送する(S153)。また、リバースプロキシ120は、リバースプロキシ120とサーバアプリケーション140との間のTCPコネクションを切断する。端末装置41は、クローズ通知を受信すると、端末装置41とリバースプロキシ120との間のTCPコネクションを切断する(S154)。
サーバアプリケーション140から見て、ステップS142からステップS147まで1つのTCPコネクションが維持され、ステップS149からステップS154まで1つのTCPコネクションが維持されている。サーバアプリケーション140から見て、ステップS147とステップS149の間はTCPコネクションが存在しない。
これに対し、端末装置41から見て、ステップS140からステップS154までTCPコネクションが切断されずに維持されている。また、端末装置41からは、ステップS144からステップS153までWSセッションが継続しているように見える。また、サーバアプリケーション140の移動の際にはセッションデータも移動する。よって、端末装置41は、サーバアプリケーション140の移動を意識せずに通信を継続できる。
図9は、第2の実施の形態の移動制御の通信例を示すシーケンス図である。
配備計画サーバ200は、サーバアプリケーション140をWebサーバ100aからWebサーバ100に移動することを決定する。すると、配備計画サーバ200は、Webサーバ100のリバースプロキシ120とWebサーバ100bのリバースプロキシ120bに、移動開始通知を送信する(S160)。移動開始通知は、移動するサーバアプリケーション140を特定できるように仮想URLを含む。リバースプロキシ120,120bは、移動開始通知に対する応答を配備計画サーバ200に送信する(S161)。
配備計画サーバ200は、サーバアプリケーション140に停止指示を送信する。サーバアプリケーション140は、Webソケットのために維持しているTCPコネクション毎にクローズ通知を送信する(S162)。例えば、サーバアプリケーション140は、リバースプロキシ120,120bに1または2以上のクローズ通知を送信する。このクローズ通知は、図8のステップS146のクローズ通知に対応する。
配備計画サーバ200は、Webサーバ100aの実行環境150aに移動指示を送信する。実行環境150aは、サーバアプリケーション140のプログラムとその内部状態を示すセッションデータをWebサーバ100に送信する(S163)。実行環境150aは、サーバアプリケーション140を停止させる。Webサーバ100の実行環境150は、プログラムとセッションデータによりサーバアプリケーション140を起動する。
配備計画サーバ200は、リバースプロキシ120,120bに移動完了通知を送信する(S164)。移動完了通知は、移動したサーバアプリケーション140を特定できるように仮想URLを含む。また、移動完了通知は、メッセージをサーバアプリケーション140に転送できるように移動後の実URL(移動前のものとは異なる)を含む。
図10は、配備計画サーバの状態遷移例を示す図である。
配備計画サーバ200は、最初は起動されていない停止状態71にある。配備計画サーバ200は、起動されると停止状態71から定常状態72に遷移する。定常状態72は、サーバアプリケーションの現在の配置を維持している状態である。配備計画サーバ200は、定常状態72において、Webサーバ100,100a,100bの負荷やサーバアプリケーションの通信の遅延時間などを示す負荷情報を収集する。
配備計画サーバ200は、負荷情報に基づいてサーバアプリケーションの移動を要すると判断すると、定常状態72から移動計画中状態73に遷移する。配備計画サーバ200は、移動計画中状態73において、移動するサーバアプリケーションと移動先のWebサーバを示す移動計画を決定する。移動計画が決定すると、配備計画サーバ200は、移動計画中状態73から移動開始通知状態74に遷移する。
配備計画サーバ200は、移動開始通知状態74において、各リバースプロキシに移動開始通知を送信し、移動開始通知に対する応答を待つ。全てのリバースプロキシから移動開始通知に対する応答を受信すると、配備計画サーバ200は、移動開始通知状態74から移動中状態75に遷移する。配備計画サーバ200は、移動中状態75において、移動するサーバアプリケーションに対して停止指示を送信する。また、配備計画サーバ200は、移動元のWebサーバに対して移動指示を送信する。
サーバアプリケーションの移動が完了すると、配備計画サーバ200は、移動中状態75から移動完了通知状態76に遷移する。配備計画サーバ200は、移動完了通知状態76において、各リバースプロキシに移動完了通知を送信する。そして、配備計画サーバ200は、移動完了通知状態76から定常状態72に遷移する。このようにして、配備計画サーバ200は、サーバアプリケーションの配置を継続的に見直し、Webサーバ100,100a,100bへのサーバアプリケーションの配置を最適化する。
次に、リバースプロキシ120,120bの機能について説明する。以下では、リバースプロキシ120,120bのうち代表してリバースプロキシ120を説明する。リバースプロキシ120bも、リバースプロキシ120と同様の機能を有する。
図11は、第2の実施の形態のリバースプロキシの機能例を示すブロック図である。
リバースプロキシ120は、制御情報記憶部121、データ記憶部122および状態制御部123を有する。また、リバースプロキシ120は、サーバ機能部131、ソケット検索部132,138、端末情報保存部133、データ保留部134、宛先解決部135、URL書換部136、クライアント機能部137およびクローズ無効化部139を有する。制御情報記憶部121およびデータ記憶部122は、例えば、RAM102またはHDD103に確保した記憶領域を用いて実装される。他のユニットは、例えば、CPU101が実行するプログラムモジュールを用いて実装される。
制御情報記憶部121は、HTTPメッセージやWebソケットメッセージの転送に用いられる各種の制御情報を記憶する。制御情報の詳細は後述する。データ記憶部122は、サーバアプリケーション140が移動中である場合に、端末装置41,42から受信したメッセージを一時的に格納するバッファである。状態制御部123は、配備計画サーバ200から、移動開始通知や移動完了通知などの各種の通知を受信する。状態制御部123は、受信した通知に応じて、制御情報記憶部121に記憶された制御情報を更新する。
サーバ機能部131は、端末装置41,42に対してサーバアプリケーションとして振る舞う。サーバ機能部131は、端末装置41,42からの要求に応じて端末装置41,42との間にTCPコネクションを確立する。サーバ機能部131は、TCPコネクション毎に、論理的な通信インタフェースであるソケットを生成する。サーバ機能部131は、ソケットの番号によってTCPコネクションを区別する。サーバ機能部131は、ソケットから(端末装置41,42から)メッセージを受信する。また、サーバ機能部131は、ソケットを指定して(端末装置41,42に対して)メッセージを送信する。
ソケット検索部132は、サーバ機能部131がメッセージを受信すると、制御情報記憶部121に記憶された制御情報を参照して、メッセージが受信されたソケットに対応するクライアント機能部137側のソケットを検索する。検索されるソケットは、リバースプロキシ120とサーバアプリケーション140との間のTCPコネクションに対応するソケットである。端末情報保存部133は、受信されたメッセージがHTTPメッセージである場合、HTTPヘッダを制御情報記憶部121に保存する。
データ保留部134は、制御情報記憶部121に記憶された制御情報を参照して、サーバアプリケーション140が移動中であるか判定する。サーバアプリケーション140が移動中である場合、データ保留部134は、受信されたメッセージをデータ記憶部122に保存する。サーバアプリケーション140の移動が完了すると、データ保留部134は、データ記憶部122に記憶されているメッセージを、サーバアプリケーション140に転送すべきメッセージとして取り出す。ただし、記憶されたメッセージがWebソケットメッセージである場合、データ保留部134は、それに先立ってサーバアプリケーション140に送信すべきHTTPメッセージとして、WSハンドシェイク要求を生成する。WSハンドシェイク要求には、リバースプロキシ120が端末装置41,42であるかのように振る舞うため、端末情報保存部133が保存したHTTPヘッダが付加される。
宛先解決部135は、転送すべきメッセージがHTTPメッセージである場合、制御情報記憶部121に記憶された制御情報を参照して、HTTPメッセージに含まれる仮想URLに対応する実URLを検索する。また、宛先解決部135は、転送すべきメッセージがWebソケットメッセージである場合、制御情報記憶部121に記憶された制御情報を参照して、サーバアプリケーション140との通信に用いられるクライアント機能部137側のソケットを検索する。URL書換部136は、HTTPメッセージに含まれる仮想URLを、宛先解決部135が検索した実URLに書き換える。
クライアント機能部137は、サーバアプリケーション140に対してクライアントアプリケーションとして振る舞う。クライアント機能部137は、サーバアプリケーション140との間にTCPコネクションを確立する。クライアント機能部137は、クライアント機能部137は、TCPコネクション毎に、論理的な通信インタフェースであるソケットを生成する。クライアント機能部137は、ソケットを指定して(サーバアプリケーション140に対して)メッセージを送信する。また、クライアント機能部137は、ソケットから(サーバアプリケーション140から)メッセージを受信する。
なお、リバースプロキシ120は、サーバ機能部131側が使用するソケットの番号の範囲と、クライアント機能部137が使用するソケットの番号の範囲とを予め決めておく。リバースプロキシ120は、メッセージが受信されたソケットの番号から、そのメッセージがサーバ機能部131によって処理されるべきものか、クライアント機能部137によって処理されるべきものか区別することができる。
ソケット検索部138は、クライアント機能部137がメッセージを受信すると、制御情報記憶部121に記憶された制御情報を参照して、メッセージが受信されたソケットに対応するサーバ機能部131側のソケットを検索する。
クローズ無効化部139は、制御情報記憶部121に記憶された制御情報を参照して、受信されたメッセージがWebソケットメッセージであり、かつ、サーバアプリケーション140が移動中であるか判定する。すなわち、クローズ無効化部139は、サーバアプリケーション140の移動時のクローズ通知を受信したか判定する。上記条件に該当する場合、クローズ無効化部139は、受信されたクローズ通知を終端する。すなわち、クローズ無効化部139は、クローズ通知をサーバ機能部131に出力せずに破棄する。なお、クローズ通知が受信された場合、クライアント機能部137は、サーバアプリケーション140との間のTCPコネクションを切断してソケットを削除する。
配備計画サーバ200は、制御情報記憶部221、移動制御部231、移動開始通知部232および移動完了通知部233を有する。制御情報記憶部221は、例えば、RAMまたはHDDに確保した記憶領域を用いて実装される。移動制御部231、移動開始通知部232および移動完了通知部233は、例えば、CPUが実行するプログラムモジュールを用いて実装される。
制御情報記憶部221は、サーバアプリケーション140の移動の制御に用いられる各種の制御情報を記憶する。制御情報の詳細は後述する。移動制御部231は、Webサーバ100,100a,100bの負荷やサーバアプリケーション140の通信遅延を監視する。移動制御部231は、負荷や通信遅延が所定条件を満たすと、サーバアプリケーション140を移動すること、および、移動先のWebサーバを決定する。
移動開始通知部232は、サーバアプリケーション140の移動を開始する前に、リバースプロキシ120,120bに対して移動開始通知を送信する。移動完了通知部233は、サーバアプリケーション140の移動が完了すると、リバースプロキシ120,120bに対して移動完了通知を送信する。
図12は、リバースプロキシが有する制御テーブルの例を示す図である。
端末情報テーブル124、ソケット対応テーブル125、移動管理テーブル126およびURL対応テーブル127が、制御情報記憶部121に記憶されている。
端末情報テーブル124は、端末側ソケットとHTTPヘッダの項目を有する。端末側ソケットの項目には、サーバ機能部131側のソケットの番号が登録される。HTTPヘッダの項目には、端末側ソケットの項目が示すソケットから受信されたHTTPメッセージに含まれるHTTPヘッダが登録される。1つのソケットから複数のHTTPメッセージが受信された場合には、HTTPヘッダの項目には、最新のHTTPメッセージに含まれるHTTPヘッダのみ登録されていればよい。
ソケット対応テーブル125は、端末側ソケット、Upgrade状態、サーバ側ソケットおよびポインタの項目を有する。端末側ソケットの項目には、サーバ機能部131側のソケットの番号が登録される。Upgrade状態の項目には、端末側ソケットの項目が示すソケット上の通信プロトコルが、HTTPからWebソケットにアップグレードされたか否かを示すフラグが登録される。Upgrade状態の初期値はFalseである。Upgrade状態がFalseであることは、通信プロトコルがHTTPであることを示す。Upgrade状態がTrueであることは、通信プロトコルがWebソケットであることを示す。
サーバ側ソケットの項目には、クライアント機能部137側のソケットの番号が登録される。サーバ機能部131側の1つのソケットに対して、クライアント機能部137側の1つのソケットが対応付けられる。すなわち、リバースプロキシ120の端末装置41,42側の1つのTCPコネクションに対して、リバースプロキシ120のサーバアプリケーション140側の1つのTCPコネクションが対応付けられる。ポインタの項目には、移動管理テーブル126の1つのレコードを指す識別情報が登録される。識別情報として、後述する移動管理テーブル126のインデックスが用いられる。
移動管理テーブル126は、インデックス、仮想URLおよび移動状態の項目を有する。インデックスは、移動管理テーブル126のレコードを識別する番号である。仮想URLの項目には、サーバアプリケーション140に付与された仮想URLが登録される。仮想URLは、例えば、配備計画サーバ200により決定される。移動状態の項目には、サーバアプリケーション140が移動中か否かを示すフラグが登録される。移動状態の初期値はFalseである。移動状態がFalseであることは、サーバアプリケーション140が移動中でないことを示す。移動状態がTrueであることは、サーバアプリケーション140が移動中であることを示す。
URL対応テーブル127は、仮想URLおよび実URLの項目を有する。仮想URLの項目には、サーバアプリケーション140に付与された仮想URLが登録される。実URLの項目には、サーバアプリケーション140に付与された実URLが登録される。実URLは、サーバアプリケーション140が配置されるWebサーバに依存する。
図13は、配備計画サーバが有する制御テーブルの例を示す図である。
プロトコルテーブル222、配備管理テーブル223およびプロキシ管理テーブル224が、制御情報記憶部221に記憶されている。
プロトコルテーブル222は、アプリケーションIDおよびプロトコルの項目を有する。アプリケーションIDの項目には、サーバアプリケーション140を識別する識別情報が登録される。アプリケーションIDは、仮想URLまたは実URLに含まれるパス名であってもよい。プロトコルの項目には、サーバアプリケーション140が使用し得るアプリケーション層の通信プロトコルの名称が登録される。サーバアプリケーション140がWebソケットを使用し得る場合、プロトコルの項目にWebソケットが登録される。
配備管理テーブル223は、アプリケーションID、仮想URLおよびサーバIDの項目を有する。アプリケーションIDの項目には、サーバアプリケーション140を識別する識別情報が登録される。仮想URLの項目には、サーバアプリケーション140に付与された仮想URLが登録される。サーバIDの項目には、サーバアプリケーション140が配置されたWebサーバを識別する識別情報が登録される。サーバIDは、Webサーバのホスト名またはIPアドレスであってもよい。
プロキシ管理テーブル224は、サーバIDおよびプロキシURLの項目を有する。サーバIDの項目には、リバースプロキシ120,120a,120bそれぞれについて、当該リバースプロキシが配置されたWebサーバを識別する識別情報が登録される。サーバIDは、Webサーバのホスト名またはIPアドレスであってもよい。プロキシURLの項目には、リバースプロキシ120,120a,120bそれぞれについて、当該リバースプロキシに付与された実URLが登録される。なお、第2の実施の形態では、リバースプロキシ120,120bはサーバアプリケーション140と直接通信するため、各リバースプロキシの実URLはリバースプロキシ120,120bに通知されない。
次に、リバースプロキシ120の処理手順について説明する。リバースプロキシ120bも、リバースプロキシ120と同様の処理を実行し得る。
図14は、上り通信転送の手順例を示すフローチャートである。
(S210)サーバ機能部131は、メッセージを受信する。ソケット検索部132は、ソケット対応テーブル125から、メッセージが受信されたソケットの番号(受信ソケット番号)を端末側ソケットとして含むレコードを検索する。
(S211)ソケット検索部132は、ステップS210において該当するレコードが検索されたか判断する。該当するレコードが検索された場合はステップS212に処理が進み、検索されなかった場合はステップS213に処理が進む。
(S212)ソケット検索部132は、検索されたレコードに含まれるUpgrade状態がTrueであるか判断する。Upgrade状態がTrueである場合はステップS219に処理が進み、Falseである場合はステップS213に処理が進む。
(S213)端末情報保存部133は、受信されたメッセージがHTTPメッセージであると判断する。端末情報保存部133は、受信されたHTTPメッセージに含まれるHTTPヘッダを、受信ソケット番号と対応付けて端末情報テーブル124に登録する。
(S214)データ保留部134は、受信されたHTTPメッセージによって指定されたURL(仮想URL)を抽出する。データ保留部134は、移動管理テーブル126から、抽出した仮想URLを含むレコードを検索する。
(S215)データ保留部134は、ステップS214で検索されたレコードに含まれる移動状態がTrueであるか判断する。移動状態がTrueである場合はステップS216に処理が進み、Falseである場合はステップS217に処理が進む。
(S216)データ保留部134は、受信されたHTTPメッセージをデータ記憶部122に格納して転送を保留する。データ保留部134は、ステップS214で検索されたレコードの移動状態を監視し、移動状態がTrueからFalseに変わるのを待つ。
(S217)宛先解決部135は、HTTPメッセージによって指定された仮想URLを抽出する。宛先解決部135は、URL対応テーブル127から、抽出した仮想URLに対応する実URLを検索する。URL書換部136は、HTTPメッセージに含まれる仮想URLを、検索された実URLに置換する。
(S218)クライアント機能部137は、ソケット対応テーブル125から、受信ソケット番号を端末側ソケットとして含むレコードを検索する。クライアント機能部137は、検索されたレコードに、サーバ側ソケットが登録済みであるか判断する。サーバ側ソケットが登録済みである場合はステップS225に処理が進み、サーバ側ソケットがまだ登録されていない場合はステップS223に処理が進む。
(S219)データ保留部134は、受信されたメッセージがWebソケットメッセージであると判断する。データ保留部134は、ステップS210で検索されたレコードに含まれるポインタを辿り、ポインタが指すレコードを移動管理テーブル126から取得する。データ保留部134は、取得したレコードに含まれる移動状態を確認する。
(S220)データ保留部134は、ステップS219で確認した移動状態がTrueであるか判断する。移動状態がTrueである場合はステップS222に処理が進み、Falseである場合はステップS221に処理が進む。
(S221)宛先解決部135は、ソケット対応テーブル125から、受信ソケット番号を端末側ソケットとして含むレコードを検索する。宛先解決部135は、検索されたレコードにサーバ側ソケットとして含まれるソケット番号(サーバ側ソケット番号)を取得する。そして、ステップS225に処理が進む。
(S222)データ保留部134は、受信されたWebソケットメッセージをデータ記憶部122に格納して転送を保留する。データ保留部134は、ステップS219の移動状態を監視し、移動状態がTrueからFalseに変わるのを待つ。
(S223)クライアント機能部137は、メッセージの転送先のサーバアプリケーションとの間にTCPコネクションを確立し、サーバ側ソケットを生成する。TCPコネクションは、TCPの3ウェイハンドシェイクによって確立される。すなわち、クライアント機能部137は、SYNパケットを送信し、SYN−ACKパケットを受信し、ACKパケットを送信する。SYNパケットの宛先IPアドレスには、実URLに含まれるホスト名からDNSによって変換されるIPアドレス、または、実URLに含まれるIPアドレスが用いられる。SYNパケットの宛先ポート番号には、実URLに含まれるポート番号(省略されている場合は80番)が用いられる。
(S224)クライアント機能部137は、ステップS223で生成したサーバ側ソケットの番号を、受信ソケット番号と対応付けてソケット対応テーブル125に登録する。また、クライアント機能部137は、登録したサーバ側ソケット番号に対応するポインタが空であるか(このレコードが今回新規に追加されたものか)判断する。ポインタが空である場合、クライアント機能部137は、ステップS214で検索された移動管理テーブル126のレコードに含まれるインデックスを、登録したサーバ側ソケット番号に対応するポインタとしてソケット対応テーブル125に登録する。
(S225)クライアント機能部137は、ステップS218で検索されたソケット、ステップS223で生成したソケット、または、ステップS221で検索されたソケットを用いて、メッセージを送信する。なお、後述するように、送信するメッセージには、サーバ機能部131が受信したメッセージの他、データ保留部134が生成したWSハンドシェイク要求が含まれることがある。
図15は、下り通信転送の手順例を示すフローチャートである。
(S230)クライアント機能部137は、メッセージを受信する。ソケット検索部138は、ソケット対応テーブル125から、メッセージが受信されたソケットの番号(受信ソケット番号)をサーバ側ソケットとして含むレコードを検索する。
(S231)クローズ無効化部139は、検索されたレコードに含まれるUpgrade状態がTrueであるか判断する。Upgrade状態がTrueである場合はステップS234に処理が進み、Falseである場合はステップS232に処理が進む。
(S232)サーバ機能部131は、受信されたメッセージがHTTPメッセージであると判断する。サーバ機能部131は、受信されたHTTPメッセージに含まれるHTTPヘッダからUpgradeの値を抽出し、Upgradeが「websocket」であるか判断する。Upgradeが「websocket」である場合はステップS233に処理が進み、それ以外の場合はステップS236に処理が進む。
(S233)サーバ機能部131は、ステップS230で検索されたレコードのUpgrade状態をTrueに更新する。そして、ステップS236に処理が進む。
(S234)クローズ無効化部139は、受信されたメッセージがWebソケットメッセージであると判断する。クローズ無効化部139は、ステップS230で検索されたレコードのポインタを辿り、ポインタが指すレコードを移動管理テーブル126から取得する。クローズ無効化部139は、取得したレコードに含まれる移動状態を確認する。
(S235)クローズ無効化部139は、ステップS234で確認した移動状態がTrueであるか判断する。移動状態がTrueである場合はステップS237に処理が進み、Falseである場合はステップS236に処理が進む。
(S236)サーバ機能部131は、ステップS230で検索されたレコードが示す端末側ソケットを用いてメッセージを転送する。そして、下り通信転送が終了する。
(S237)クローズ無効化部139は、受信されたWebソケットメッセージ(クローズ通知)を終端する。すなわち、クローズ無効化部139は、クローズ通知をサーバ機能部131に出力せずに破棄する。
(S238)サーバ機能部131は、ステップS230で検索されたレコードのサーバ側ソケット番号をソケット対応テーブル125から削除する。
(S239)クライアント機能部137は、Webソケットメッセージを受信したソケットに対応するTCPコネクションを切断する。すなわち、クライアント機能部137は、当該ソケットを指定してFINパケットを送信し、応答としてFINパケットを受信する。クライアント機能部137は、当該ソケットを削除する。
図16は、プロキシ状態制御の手順例を示すフローチャートである。
(S240)状態制御部123は、配備計画サーバ200から通知を受信する。
(S241)状態制御部123は、ステップS240で受信した通知が移動開始通知であるか判断する。受信した通知が移動開始通知である場合はステップS242に処理が進み、それ以外の場合はステップS246に処理が進む。
(S242)状態制御部123は、受信した移動開始通知に含まれている仮想URL(指定された仮想URL)を抽出する。状態制御部123は、移動管理テーブル126から、抽出した仮想URLを含むレコードを検索する。
(S243)状態制御部123は、ステップS242で検索されたレコードに含まれる移動状態をTrueに更新する。
(S244)状態制御部123は、URL対応テーブル127から、ステップS242で抽出した仮想URLを含むレコードを検索する。
(S245)状態制御部123は、ステップS244で検索されたレコードに含まれる実URLを削除する。そして、プロキシ状態制御が終了する。
(S246)状態制御部123は、ステップS240で受信した通知が移動完了通知であるか判断する。受信した通知が移動完了通知である場合はステップS247に処理が進み、それ以外の場合はプロキシ状態制御が終了する。
(S247)状態制御部123は、受信した移動完了通知に含まれている仮想URL(指定された仮想URL)を抽出する。状態制御部123は、URL対応テーブル127から、抽出した仮想URLを含むレコードを検索する。
(S248)状態制御部123は、受信した移動完了通知に含まれている実URL(指定された実URL)を抽出する。状態制御部123は、ステップS247で検索されたレコードに、抽出した実URLを登録する。
(S249)データ保留部134は、WSハンドシェイク要求としてのHTTPメッセージを生成する。このとき、生成するHTTPメッセージのHTTPヘッダには、端末情報テーブル124に登録されたHTTPヘッダを使用する。
(S250)状態制御部123は、移動管理テーブル126から、ステップS247で抽出した仮想URLを含むレコードを検索する。
(S251)状態制御部123は、ステップS250で検索されたレコードに含まれる移動状態をFalseに更新する。
次に、図14〜16に示した処理を、図8のシーケンスに沿って説明する。
端末装置41は、サーバアプリケーション140の仮想URL「ws://vurl:80/app1」が入力されると、「vurl」をDNSサーバ43に問い合わせ、これに対応するIPアドレス「10.x.x.40」を取得する。その結果、サーバ機能部131は、端末装置41からの要求に応じてTCPコネクションを確立し、socket1を生成する。そして、サーバ機能部131は、socket1から仮想URL「ws://vurl:80/app1」を指定したWSハンドシェイク要求を受信する。
ソケット検索部132は、ソケット対応テーブル125からsocket1を含むレコードを検索する。ここでは、socket1から受信する最初のメッセージであるため、該当するレコードは検索されない。端末情報保存部133は、受信されたWSハンドシェイク要求のHTTPヘッダを、socket1と対応付けて端末情報テーブル124に登録する。データ保留部134は、移動管理テーブル126から、指定された仮想URLを含むレコードを検索し、移動状態がFalseであることを確認する。
宛先解決部135は、URL対応テーブル127から、指定された仮想URLを含むレコードを検索し、当該仮想URLに対応する実URL「ws://10.x.x.30:8880/app1」を取得する。URL書換部136は、WSハンドシェイク要求に含まれる仮想URLを実URLに書き換える。
クライアント機能部137は、socket1を含むレコードがソケット対応テーブル125に存在しないため、実URLが示すサーバアプリケーション140とTCPコネクションを確立し、socket10を生成する。クライアント機能部137は、ソケット対応テーブル125に、socket1とsocket10とを対応付けたレコードを追加する。Upgrade状態はFalseに設定しておく。また、クライアント機能部137は、仮想URLを含む移動管理テーブル126のレコードのインデックス「#1」を、socket1,socket10と対応付けてポインタとして登録する。
クライアント機能部137は、socket10からWSハンドシェイク要求を送信する。その後、クライアント機能部137は、socket10から、Upgrade=websocketに設定されたWSハンドシェイク応答を受信する。
ソケット検索部138は、ソケット対応テーブル125からsocket10を含むレコードを検索する。クローズ無効化部139は、socket10に対応するUpgrade状態がFalseであることを確認する。サーバ機能部131は、受信されたWSハンドシェイク応答のHTTPヘッダにUpgrade=websocketが含まれることを確認する。すると、サーバ機能部131は、socket10に対応するUpgrade状態をTrueに更新する。そして、サーバ機能部131は、socket10と対応付けられたsocket1からWSハンドシェイク応答を送信する。
サーバ機能部131は、socket1からWebソケットメッセージを受信する。ソケット検索部132は、ソケット対応テーブル125からsocket1を含むレコードを検索し、Upgrade状態がTrueであることを確認する。データ保留部134は、socket1に対応するポインタから移動管理テーブル126のインデックス「#1」のレコードにアクセスし、移動状態がFalseであることを確認する。
宛先解決部135は、ソケット対応テーブル125からsocket1と対応付けられたsocket10を取得する。クライアント機能部137は、socket10からWebソケットメッセージを送信する。その後、クライアント機能部137は、socket10からWebソケットメッセージを受信する。
ソケット検索部138は、ソケット対応テーブル125からsocket10を含むレコードを検索する。クローズ無効化部139は、socket10に対応するUpgrade状態がTrueであることを確認する。すると、クローズ無効化部139は、socket10に対応するポインタから移動管理テーブル126のインデックス「#1」のレコードにアクセスし、移動状態がFalseであることを確認する。この場合、クローズ無効化部139は、クローズ通知の終端は不要であると判断する。サーバ機能部131は、socket10と対応付けられたsocket1からWSソケットメッセージを送信する。
サーバアプリケーション140の移動が決定されると、移動開始通知部232は、仮想URL「ws://vurl:80/app1」を指定した移動開始通知をリバースプロキシ120に送信する。状態制御部123は、移動管理テーブル126から当該仮想URLを含むレコードを検索し、当該仮想URLに対応する移動状態をTrueに更新する。また、状態制御部123は、URL対応テーブル127から当該仮想URLを含むレコードを検索し、当該仮想URLに対応する実URLを削除する(NULLに更新する)。
配備計画サーバ200は、Webサーバ100a上のサーバアプリケーション140に停止指示を送信する。すると、サーバアプリケーション140は、Webソケットのクローズ通知を各TCPコネクション上で送信する。クライアント機能部137は、socket10からクローズ通知を受信する。
ソケット検索部138は、ソケット対応テーブル125からsocket10を含むレコードを検索する。クローズ無効化部139は、socket10に対応するUpgrade状態がTrueであることを確認する。すると、クローズ無効化部139は、socket10に対応するポインタから移動管理テーブル126のインデックス「#1」のレコードにアクセスし、移動状態がTrueであることを確認する。すると、クローズ無効化部139は、クローズ通知を破棄してサーバ機能部131に出力しない。
サーバ機能部131は、ソケット対応テーブル125からsocket10を削除する。クライアント機能部137は、サーバアプリケーション140との間のTCPコネクションを切断し、socket10を削除する。
端末装置41とリバースプロキシ120との間のTCPコネクションは切断されていないため、サーバ機能部131は、socket1からWebソケットメッセージを受信する。ソケット検索部132は、ソケット対応テーブル125からsocket1を含むレコードを検索し、Upgrade状態がTrueであることを確認する。データ保留部134は、socket1に対応するポインタから移動管理テーブル126のインデックス「#1」のレコードにアクセスし、移動状態がTrueであることを確認する。すると、データ保留部134は、データ記憶部122にWebソケットメッセージを保存する。
サーバアプリケーション140がWebサーバ100aからWebサーバ100に移動すると、移動完了通知部233は、リバースプロキシ120に移動完了通知を送信する。移動完了通知には、仮想URL「ws://vurl:80/app1」と実URL「ws://10.x.x.40:8880/app1」とが含まれる。
状態制御部123は、URL対応テーブル127から当該仮想URLを含むレコードを検索し、当該仮想URLと対応付けて通知された実URLを登録する。また、状態制御部123は、移動管理テーブル126から当該仮想URLを含むレコードを検索し、当該仮想URLに対応する移動状態をFalseに更新する。
データ保留部134は、移動状態がTrueからFalseに変化すると、データ記憶部122に記憶されたWebソケットメッセージを転送するため、WSハンドシェイク要求を生成する。このとき、データ保留部134は、WSハンドシェイク要求のHTTPヘッダに、端末情報テーブル124に登録されたHTTPヘッダを使用する。データ保留部134は、WSハンドシェイク要求に続いて、データ記憶部122に記憶されたWebソケットメッセージを出力する。なお、データ保留部134が移動管理テーブル126に登録された移動状態を監視する代わりに、移動状態がFalseに変わったことを状態制御部123がデータ保留部134に通知するようにしてもよい。
クライアント機能部137は、socket1に対応するサーバ側ソケットがソケット対応テーブル125に登録されていないため、実URLが示すサーバアプリケーション140とTCPコネクションを確立し、socket11を生成する。クライアント機能部137は、ソケット対応テーブル125に、socket1と対応付けてsocket11を登録する。クライアント機能部137は、データ保留部134が生成したWSハンドシェイク要求をsocket11から送信し、WSハンドシェイク応答をsocket11から受信する。その後、クライアント機能部137は、データ記憶部122から取り出されたWebソケットメッセージをsocket11から送信する。
第2の実施の形態の情報処理システムによれば、サーバアプリケーション140が移動するとき、サーバアプリケーション140が発行したクローズ通知がリバースプロキシ120,120bによって終端される。これにより、端末装置41,42,51,52に対してWSセッションが継続していると認識させることができ、クローズ通知に反応して端末装置41,42,51,52がTCPコネクションを切断してしまうのを抑制できる。
そして、移動完了後は、リバースプロキシ120,120bによって、端末装置41,42,51,52側のTCPコネクションとサーバアプリケーション140側のTCPコネクションとが対応付けられ、両者の間でWebソケットメッセージが転送される。これにより、端末装置41,42,51,52は、サーバアプリケーション140が移動する前に確立したTCPコネクションを移動後も使用し続けることができ、TCPコネクションを確立し直さなくてよい。よって、端末装置41,42,51,52のユーザは、ログイン手続などの操作を行わずに移動後もサーバアプリケーション140のサービスを継続して利用することができ、ユーザの利便性が低下しないようにすることができる。
また、サーバアプリケーション140の移動時にはWSセッションのデータも移動するため、サーバアプリケーション140は移動前の通信のコンテキストを引き継ぐことができ、WSセッションを継続することができる。また、リバースプロキシ120,120bは、サーバアプリケーション140が移動中であるときはクローズ通知を終端する一方、サーバアプリケーション140が移動中でないときはクローズ通知を終端せずに転送する。これにより、通常時のWebソケット通信を正常に行うことができる。
[第3の実施の形態]
次に、第3の実施の形態を説明する。第2の実施の形態との違いを中心に説明し、第2の実施の形態と同様の事項については説明を省略することがある。
第2の実施の形態では、サーバアプリケーションを移動した後に、遠隔のWebサーバの間でTCPコネクションを確立した。これに対し、第3の実施の形態では、サーバアプリケーションを移動する前に、予め遠隔のWebサーバの間でTCPコネクションを確立しておく。事前のTCPコネクションは、異なるWebサーバ上のリバースプロキシの間で確立しておく。これにより、サーバアプリケーション140のサービスが実質的に中断される時間を短縮することができる。
図17は、第3の実施の形態のサーバアプリケーションの配備例を示す図である。
第3の実施の形態の情報処理システムは、第2の実施の形態のWebサーバ100,100a,100bに代えて、Webサーバ100c,100d,100eを含む。Webサーバ100cは、拠点40に設置されている。Webサーバ100dは、クラウド30に設置されている。Webサーバ100eは、拠点50に設置されている。
Webサーバ100cは、リバースプロキシ120cおよび実行環境150cを実行する。Webサーバ100dは、リバースプロキシ120dおよび実行環境150dを実行する。Webサーバ100eは、リバースプロキシ120eおよび実行環境150eを実行する。サーバアプリケーション140が、最初はWebサーバ100dで実行されており、その後にWebサーバ100eに移動する場合を考える。
Webサーバ100cのIPアドレスは「10.x.x.40」である。Webサーバ100dのIPアドレスは「10.x.x.30」である。Webサーバ100eのIPアドレスは「10.x.x.50」である。サーバアプリケーション140がWebサーバ100dに配置されている場合、サーバアプリケーション140には「ws://10.x.x.30:8880」を含む実URLが付与される。サーバアプリケーション140がWebサーバ100eに配置されている場合、サーバアプリケーション140には「ws://10.x.x.50:8880」を含む実URLが付与される。
リバースプロキシ120c,120eには「ws://vurl:80」を含む仮想URLが付与される。また、リバースプロキシ120cには、仮想URLとは別に、「ws://10.x.x.40:80」を含む実URLが付与されている。リバースプロキシ120eには、仮想URLとは別に、「ws://10.x.x.50:80」を含む実URLが付与されている。リバースプロキシ120dには、「ws://10.x.x.30:80」を含む実URLが付与されている。第3の実施の形態では、リバースプロキシ120c,120eは、他のWebサーバに配置されたサーバアプリケーションとは直接通信せず、他のリバースプロキシを経由して通信する。リバースプロキシ120c,120d,120eの実URLは、リバースプロキシ間の通信に用いられる。
サーバアプリケーション140がWebサーバ100dに配置されている場合、リバースプロキシ120cは、仮想URLを含むアクセスを受信すると、仮想URLをリバースプロキシ120dの実URLに変換し、アクセスをリバースプロキシ120dに転送する。リバースプロキシ120dは、リバースプロキシ120dの実URLをサーバアプリケーション140の実URLに変換し、アクセスをサーバアプリケーション140に転送する。また、サーバアプリケーション140がWebサーバ100eに配置されている場合、リバースプロキシ120cは、仮想URLをリバースプロキシ120eの実URLに変換し、アクセスをリバースプロキシ120eに転送する。リバースプロキシ120eは、リバースプロキシ120eの実URLをサーバアプリケーション140の実URLに変換し、アクセスをサーバアプリケーション140に転送する。
図18は、Webソケットによる第4の通信例を示すシーケンス図である。
端末装置41は、リバースプロキシ120cとTCPハンドシェイクを行い、端末装置41とリバースプロキシ120cとの間にTCPコネクションを確立する(S170)。端末装置41は、サーバアプリケーション140の仮想URLを指定したWSハンドシェイク要求をリバースプロキシ120cに送信する(S171)。リバースプロキシ120cは、仮想URLをリバースプロキシ120dの実URLに変換する。
リバースプロキシ120cは、リバースプロキシ120dとTCPハンドシェイクを行い、リバースプロキシ120cとリバースプロキシ120dとの間にTCPコネクションを確立する。リバースプロキシ120dは、サーバアプリケーション140とTCPハンドシェイクを行い、リバースプロキシ120dとサーバアプリケーション140との間にTCPコネクションを確立する(S172)。
リバースプロキシ120cは、WSハンドシェイク要求をリバースプロキシ120dに転送する。リバースプロキシ120dは、リバースプロキシ120dの実URLをサーバアプリケーション140の実URLに変換し、WSハンドシェイク要求をサーバアプリケーション140に転送する(S173)。サーバアプリケーション140は、WSハンドシェイク応答をリバースプロキシ120dに送信する。リバースプロキシ120dは、WSハンドシェイク応答をリバースプロキシ120cに転送する。リバースプロキシ120cは、WSハンドシェイク応答を端末装置41に転送する(S174)。
端末装置41は、Webソケットメッセージをリバースプロキシ120cに送信する。リバースプロキシ120cは、Webソケットメッセージをリバースプロキシ120dに転送する。リバースプロキシ120dは、Webソケットメッセージをサーバアプリケーション140に転送する(S175)。
ここで、配備計画サーバ200a(後述する)が、サーバアプリケーション140をWebサーバ100dからWebサーバ100eに移動すると決定したとする。配備計画サーバ200aがリバースプロキシ120cに移動準備通知を送信すると、リバースプロキシ120cは事前に、移動先のWebサーバ100eのリバースプロキシ120eとTCPハンドシェイクを行い、TCPコネクションを確立しておく(S176)。
その後、配備計画サーバ200aがサーバアプリケーション140に移動指示を送信すると、サーバアプリケーション140はクローズ通知をリバースプロキシ120dに送信する。リバースプロキシ120dは、クローズ通知をリバースプロキシ120cに転送する。リバースプロキシ120cは、受信したクローズ通知を終端する(S177)。
リバースプロキシ120cは、クローズ通知を受信すると、リバースプロキシ120cとリバースプロキシ120dとの間のTCPコネクションを切断する。また、リバースプロキシ120dは、クローズ通知を受信すると、リバースプロキシ120dとサーバアプリケーション140との間のTCPコネクションを切断する(S178)。
図19は、Webソケットによる第4の通信例を示すシーケンス図(続き)である。
端末装置41は、WSセッションが継続していると認識しているため、Webソケットメッセージをリバースプロキシ120cに送信する(S179)。リバースプロキシ120cは、リバースプロキシ120cとリバースプロキシ120eとの間にTCPコネクションが存在しないため、受信したWebソケットメッセージをバッファに保存しておく。
そして、リバースプロキシ120cは、配備計画サーバ200aから移動完了通知を受信すると、WSハンドシェイク要求を生成してリバースプロキシ120eに送信する(S180)。このWSハンドシェイク要求の送信には、上記ステップS176で事前に確立したTCPコネクションが用いられる。よって、移動完了通知を受けてからWebサーバ100cとWebサーバ100eとの間でTCPハンドシェイクを行わなくてよい。
リバースプロキシ120eは、サーバアプリケーション140とTCPハンドシェイクを行い、リバースプロキシ120eとサーバアプリケーション140との間にTCPコネクションを確立する(S181)。このTCPコネクションは、Webサーバ100eの内部に形成されるコネクションである。よって、ステップS181のTCPハンドシェイクのコストは、ステップS176のTCPハンドシェイクのコストより十分に小さい。
リバースプロキシ120eは、リバースプロキシ120cから受信したWSハンドシェイク要求をサーバアプリケーション140に転送する(S182)。サーバアプリケーション140は、WSハンドシェイク応答をリバースプロキシ120eに送信する。リバースプロキシ120eは、WSハンドシェイク応答をリバースプロキシ120cに転送する(S183)。リバースプロキシ120cは、バッファに保存されたWebソケットメッセージをリバースプロキシ120eに転送する。リバースプロキシ120eは、Webソケットメッセージをサーバアプリケーション140に転送する(S184)。
正常にWSセッションを終了する場合、サーバアプリケーション140は、クローズ通知をリバースプロキシ120eに送信する。リバースプロキシ120eは、クローズ通知をリバースプロキシ120cに転送する。リバースプロキシ120cは、クローズ通知を端末装置41に転送する(S185)。端末装置41は、端末装置41とリバースプロキシ120cとの間のTCPコネクションを切断する。リバースプロキシ120cは、リバースプロキシ120cとリバースプロキシ120eとの間のTCPコネクションを切断する。リバースプロキシ120eは、リバースプロキシ120eとサーバアプリケーション140との間のTCPコネクションを切断する(S186)。
サーバアプリケーション140から見て、ステップS172からステップS178まで1つのTCPコネクションが維持され、ステップS181からステップS186まで1つのTCPコネクションが維持されている。サーバアプリケーション140から見て、ステップS178とステップS181の間はTCPコネクションが存在しない。
これに対し、端末装置41から見て、ステップS170からステップS186までTCPコネクションが切断されずに維持されている。また、端末装置41からは、ステップS174からステップS185までWSセッションが継続しているように見える。また、サーバアプリケーション140の移動の際にはセッションデータも移動する。よって、端末装置41は、サーバアプリケーション140の移動を意識せずに通信を継続できる。
図20は、第3の実施の形態の移動制御の通信例を示すシーケンス図である。
配備計画サーバ200aは、サーバアプリケーション140をWebサーバ100dからWebサーバ100eに移動することを決定する。すると、配備計画サーバ200aは、Webサーバ100cのリバースプロキシ120cとWebサーバ100eのリバースプロキシ120eに、移動準備通知を送信する(S190)。移動準備通知は、サーバアプリケーション140を識別する仮想URLと、移動先のWebサーバ100eに配置されたリバースプロキシ120eの実URLとを含む。
リバースプロキシ120cは、サーバアプリケーション140に関して確立されているTCPコネクション1つにつき、新たなTCPコネクション1つをリバースプロキシ120eと確立する。異なるWebサーバ間のTCPハンドシェイクが終わると、リバースプロキシ120c,120eは、配備計画サーバ200aに応答を送信する(S191)。
移動準備通知に対する応答を全てのリバースプロキシから受信すると、配備計画サーバ200aは、リバースプロキシ120c,120eに移動開始通知を送信する(S192)。移動開始通知は、仮想URLを含む。リバースプロキシ120c,120eは、配備計画サーバ200aに応答を送信する(S193)。
配備計画サーバ200aは、サーバアプリケーション140に停止指示を送信する。サーバアプリケーション140は、Webソケットのために維持しているTCPコネクション毎にクローズ通知を送信する(S194)。例えば、サーバアプリケーション140は、リバースプロキシ120c,120eに1または2以上のクローズ通知を送信する。このクローズ通知は、図18のステップS177のクローズ通知に対応する。
配備計画サーバ200aは、Webサーバ100dの実行環境150dに移動指示を送信する。実行環境150dは、サーバアプリケーション140のプログラムとセッションデータをWebサーバ100eに送信する(S195)。実行環境150dは、サーバアプリケーション140を停止させる。Webサーバ100eの実行環境150eは、プログラムとセッションデータによりサーバアプリケーション140を起動する。
配備計画サーバ200aは、リバースプロキシ120c,120eに移動完了通知を送信する(S196)。移動完了通知は、仮想URLと、移動先のWebサーバ100eに配置されたリバースプロキシ120eの実URLとを含む(S196)。
図21は、第3の実施の形態のリバースプロキシの機能例を示すブロック図である。
リバースプロキシ120cは、制御情報記憶部121、データ記憶部122、状態制御部123およびコネクションプール部128を有する。また、リバースプロキシ120cは、サーバ機能部131、ソケット検索部132、端末情報保存部133、データ保留部134、宛先解決部135、URL書換部136、クライアント機能部137c、ソケット検索部138およびクローズ無効化部139を有する。リバースプロキシ120d,120eも、リバースプロキシ120cと同様のモジュールにより実装できる。
制御情報記憶部121は、第2の実施の形態と同様に、端末情報テーブル124、ソケット対応テーブル125、移動管理テーブル126およびURL対応テーブル127を有する。ただし、ソケット対応テーブル125のサーバ側ソケットの項目には、他のリバースプロキシとの間に確立したTCPコネクションに対応するソケットの番号が登録されることがある。また、URL対応テーブル127の実URLの項目には、他のリバースプロキシの実URLが登録されることがある。
コネクションプール部128は、配備計画サーバ200aから移動準備通知を受信すると、移動管理テーブル126から、指定された仮想URLを含むレコードを検索し、検索されたレコードのインデックスを取得する。コネクションプール部128は、ソケット対応テーブル125から、取得したインデックスを含むレコードを検索し、検索されたレコードをカウントする。すなわち、コネクションプール部128は、指定された仮想URLに関して、現在存在するTCPコネクションをカウントする。そして、コネクションプール部128は、移動準備通知に含まれる実URLが示すリバースプロキシとの間に、カウントした数のTCPコネクションを確立してプールしておく。
クライアント機能部137cは、サーバアプリケーション140が移動した直後に他のリバースプロキシと通信するときは、新たなTCPコネクションを確立する代わりにプールされているTCPコネクションを選択して使用する。クライアント機能部137cは、選択したTCPコネクションに対応するソケットの番号を、サーバ機能部131側のソケットと対応付けてソケット対応テーブル125に登録する。
配備計画サーバ200aは、制御情報記憶部221、移動制御部231、移動開始通知部232、移動完了通知部233aおよび移動準備通知部234を有する。
移動完了通知部233aは、サーバアプリケーション140の移動が完了すると、リバースプロキシ120c,120eに対して移動完了通知を送信する。移動完了通知は、サーバアプリケーション140を識別する仮想URLと、移動先のWebサーバのリバースプロキシに付与された実URLとが含まれる。
移動準備通知部234は、サーバアプリケーション140の移動が決定されると、移動開始通知に先立って、リバースプロキシ120c,120eに対して移動準備通知を送信する。移動準備通知は、サーバアプリケーション140を識別する仮想URLと、移動先のWebサーバのリバースプロキシに付与された実URLとが含まれる。
なお、サーバアプリケーション140の移動前に新たなTCPコネクションを確立すると、一時的に、古いTCPコネクションと新たなTCPコネクションとが併存し、第2の実施の形態の方法の2倍のTCPコネクションを維持することになる。よって、Webサーバ100c,100eの負荷が過大になるおそれがある。そこで、Webサーバ100c,100eの負荷を監視し、負荷に応じて、サーバアプリケーション140の移動前に新たなTCPコネクションを確立するか、サーバアプリケーション140の移動後に新たなTCPコネクションを確立するかを選択するようにしてもよい。
例えば、配備計画サーバ200aは、Webサーバ100c,100eのメモリ使用量を監視する。Webサーバ100c,100eの空きメモリ量が閾値以上ある場合、配備計画サーバ200aは、Webサーバ100c,100eに移動準備通知を送信する。これにより、サーバアプリケーション140の移動前に新たなTCPコネクションが確立される。一方、Webサーバ100c,100eの空きメモリ量が閾値未満である場合、配備計画サーバ200aは、Webサーバ100c,100eに移動準備通知を送信しない。これにより、サーバアプリケーション140の移動後に新たなTCPコネクションが確立される。ただし、配備計画サーバ200aは、Webサーバ100c,100eのCPU使用率を監視し、CPU使用率が閾値以下の場合は移動準備通知を送信し、CPU使用率が閾値を超える場合は移動準備通知を送信しないようにしてもよい。また、判断基準として、CPU使用率とメモリ使用量の両方を用いてもよい。
第3の実施の形態の情報処理システムによれば、第2の実施の形態の情報処理システムと同様の効果が得られる。更に、第3の実施の形態の情報処理システムによれば、サーバアプリケーション140がクローズ通知を送信してから再びサーバアプリケーション140にWebソケットメッセージを転送可能になるまでの時間を短縮できる。よって、端末装置41,42,51,52から見て実質的にサーバアプリケーション140のサービスが中断されている時間を短縮でき、ユーザの利便性を向上させることができる。
なお、前述のように、第1の実施の形態の情報処理は、コンピュータにプログラムを実行させることで実現できる。第2の実施の形態の情報処理は、Webサーバ100,100a,100bおよび配備計画サーバ200にプログラムを実行させることで実現できる。第3の実施の形態の情報処理は、Webサーバ100c,100d,100eおよび配備計画サーバ200aにプログラムを実行させることで実現できる。
プログラムは、コンピュータ読み取り可能な記録媒体(例えば、記録媒体113)に記録しておくことができる。記録媒体として、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、FDおよびHDDが含まれる。光ディスクには、CD、CD−R(Recordable)/RW(Rewritable)、DVDおよびDVD−R/RWが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体から他の記録媒体(例えば、HDD103)にプログラムをコピーして実行してもよい。