CORBAワークユニットにおけるクライアント-サーバ間の通信処理では、コネクションを接続し、通信を行っています。
以降では、コネクションの概念と留意事項について説明します。
コネクションはクライアントプロセス単位に接続されます。また同一プロセスでも複数のサーバと接続する場合、さらにサーバごとのコネクションが必要となります。
以下ではそれぞれの形態において接続するコネクションの接続について説明します。
ネーミングサービスとサーバアプリケーションが同一サーバである場合
以下はネーミングサービスとサーバアプリケーションが同一サーバ上(同一ホスト名)に存在する場合に、クライアントから接続する場合に必要なコネクションについて説明します。
なお、同一サーバでも、ホスト名が複数ある場合、別サーバとして扱われます。
以下のケースでは、クライアントプロセスが2多重存在し、それぞれ同一のサーバ上に存在するネーミングサービスとサーバアプリケーションに接続しています。この場合、クライアント多重度分(2多重)のコネクション数(2つ)が必要になります。
クライアントプロセス1からネーミングサービスに接続。このとき、サーバマシン(ポート番号;8002)に対してコネクションを接続。
クライアントプロセス1からサーバアプリケーションにリクエスト送信。このとき、既に1)で同一サーバ(同一ホスト名)に対するコネクションが接続されているため、該当のコネクションを使用し、リクエストを送信する。
クライアントプロセス2からネーミングサービスに接続。このとき、同一プロセスからサーバマシン(ポート番号;8002)に対してコネクションを接続していないため、サーバマシン(ポート番号:8002)に対してコネクションを接続。
クライアントプロセス2からサーバアプリケーションにリクエスト送信。このとき、既に3)で同一サーバ(同一ホスト名)に対するコネクションが接続されているため、該当のコネクションを使用し、リクエストを送信する。
ネーミングサービスとサーバアプリケーションが別サーバである場合
以下はネーミングサービスとサーバアプリケーションが別サーバ(別ホスト名)に存在する場合に、クライアントから接続する場合に必要なコネクションについて説明します。
以下のケースでは、クライアントプロセスが1多重存在し、それぞれ別サーバ上に存在するネーミングサービスとサーバアプリケーションに接続しています。この場合、1つのクライアントプロセスから接続しているサーバ数分(2サーバ)のコネクション数(2つ)が必要になります。
クライアントプロセスからネーミングサービスに接続。このとき、ネーミングサービスが存在するネーミングサーバ (ポート番号;8002)に対してコネクションを接続。
クライアントプロセスからサーバアプリケーションにリクエスト送信。このとき、サーバアプリケーションが存在するサーバ(ポート番号:8002)に対してコネクションを接続。
SSL暗号化通信を行う場合
以下はネーミングサービスとサーバアプリケーションが同一サーバ(同一ホスト名)に存在し、クライアントとサーバ間でSSL暗号化通信を行う場合に必要なコネクションについて説明します。
なお、本ケースはネーミングサービスに対する接続はSSL暗号化無し、サーバアプリケーションへのリクエストについては、SSL暗号化を行う場合について説明しています。
以下のケースでは、クライアントプロセスからネーミングサービスとの接続処理において、サーバのポート番号8002に対して1つのコネクションを接続します。その後、クライアントプロセスからサーバアプリケーションに対して、SSL暗号化通信用のポート番号4433に対して1つのコネクションを接続します。このため、SSL暗号化通信を行う場合、1つのクライアントプロセスに対して2つのコネクションが必要になります。
クライアントプロセスからSSL暗号化なしでネーミングサービスに接続。このとき、ネーミングサービスが存在するネーミングサーバ のポート番号:8002に対してコネクションを接続。
クライアントプロセスからサーバアプリケーションにSSL暗号化したリクエストを送信。このとき、サーバアプリケーションが存在するサーバのポート番号:4433に対してコネクションを接続。
以降では、コネクション接続における注意事項について説明します。
クラスタ環境における注意事項
クライアントからクラスタ構成のサーバにコネクションを接続中に、サーバがダウンし待機の別サーバに運用が引き継がれた状態で、クライアントからサーバ側にリクエストを送信した場合、無応答となる場合があります。
これは、サーバダウンによるコネクション切断がTCP/IP層からクライアントに通知されない場合があるためです。
クライアントからサーバにコネクションを接続
サーバがダウン発生。
待機の別サーバにフェールオーバし、運用を引き継ぐ
クライアントからリクエスト送信するが、コネクション接続先がないため、無応答となる。
上記のような問題を解決するため、クライアント無通信監視(period_client_idle_con_timeout)を設定することをお勧めします。クライアント無通信監視とは、一定時間リクエストの送信がない場合、クライアント側からコネクションを切断する機能です。
なお、クライアント無通信監視によりコネクションが切断される前に、次のリクエストが送信された場合は、同様にリクエストが無応答となる場合があります。この場合は、リクエスト送信から返信までの時間監視 (period_receive_timeout)を設定することで、無応答の回避を行うことができます。
クライアントからサーバにコネクションを接続
サーバがダウン発生。
待機の別サーバにフェールオーバし、運用を引き継ぐ
クライアント無通信監視により、一定時間クライアントから同一コネクションに対しリクエストの送信がなかった場合、コネクションの切断が行われる。
クライアントからリクエスト送信するが、コネクションが存在しないため、コネクションを接続しリクエストを送信する。
負荷分散装置およびファイアウォールを使用した環境での注意事項
クライアントとサーバとの間に、負荷分散装置やファイアウォールが存在する場合の注意事項について以下で説明します。
負荷分散装置やファイアウォールでは、通信が発生してない状態に対する無通信タイムアウト機能が存在する場合があります。
このタイムアウトはクライアントおよびサーバ側に通知されません。このため、コネクションが残存した状態となり、クライアントからリクエスト送信した場合、負荷分散装置またはファイアウォールからエラーで復帰する場合があります。
このような問題を解決するため、クライアント無通信監視(period_client_idle_con_timeout)およびサーバ無通信監視(period_idle_con_timeout)を設定することをお勧めします。
クライアント無通信監視とは、一定時間リクエストの送信がない場合、クライアント側からコネクションを切断する機能です。サーバ無通信監視とは、一定時間クライアントからのリクエストの送信がない場合、サーバ側からコネクションを切断する機能です。
この監視時間を負荷分散装置やファイアウォールのタイムアウト値よりも小さい値にすることで、左記に監視時間を負荷分散装置やファイアウォールでタイムアウトを検出する前に、クライアントおよびサーバからコネクションの切断を行うことができます。
また、この場合、クライアント無通信監視(period_client_idle_con_timeout)がサーバ無通信監視(period_idle_con_timeout)よりも小さな値としてください。
クライアント無通信監視値 < サーバ無通信監視値 <負荷分散装置やファイアウォールの無通信監視値