5.6.1 リクエスト送受信時の通信タイムアウト
ここでは,Webサーバ連携機能を使用する場合のリクエスト送受信時の通信タイムアウト設定について説明します。リクエスト送受信時の,通信タイムアウトの設定場所を次の図に示します。
Webサーバ連携機能を使用する場合,図中の○印の場所に通信タイムアウトを設定します。通信タイムアウトを設定する場所について説明します。なお,図中の項番は次の説明の項番と対応しています。
-
Webサーバでのリクエスト受信時(クライアント−Webサーバ)
クライアントからのリクエストを,Webサーバで受信するときに,通信タイムアウトを設定します。通信タイムアウトは,Webサーバで設定します。
Webサーバでのリクエスト受信時に通信タイムアウトを設定することによって検知できる障害については,「5.6.1(1) Webサーバでのリクエスト受信時」を参照してください。
-
リダイレクタでのリクエスト送信時(リダイレクタ−Webコンテナ)
リダイレクタからWebコンテナにリクエストを送信するときに,通信タイムアウトを設定します。通信タイムアウトは,リダイレクタで設定します。
リダイレクタでのリクエスト送信時に通信タイムアウトを設定することによって検知できる障害については,「5.6.1(2) リダイレクタでのリクエスト送信時」を参照してください。
-
Webコンテナでのリクエスト受信時(リダイレクタ−Webコンテナ)
リダイレクタからのリクエストを,Webコンテナで受信するときに,通信タイムアウトを設定します。通信タイムアウトは,Webコンテナで設定します。
Webコンテナでのリクエスト受信時に通信タイムアウトを設定することによって検知できる障害については,「5.6.1(3) Webコンテナでのリクエスト受信時」を参照してください。
(1) Webサーバでのリクエスト受信時
Webサーバでは,クライアントから転送されたリクエストの受信処理に,タイムアウト時間を設定できます。設定した通信タイムアウトによって,クライアント側で障害が発生したことを検知できます。検知できる障害を次に示します。
- 検知できる障害
-
-
クライアントが稼働するホストがダウンした
-
クライアント−Webサーバ間でネットワーク障害が発生した
-
クライアントアプリケーションで障害が発生した
-
(2) リダイレクタでのリクエスト送信時
リダイレクタでは,Webコンテナへのリクエスト送信処理にタイムアウト時間を設定できます。設定したタイムアウト時間を超えてタイムアウトが発生した場合にはHTTP Serverのエラーログにメッセージが出力されます。
(a) 設定できる通信タイムアウトと検知できる障害
リダイレクタでのリクエスト送信処理では,次に示す二つの時間にタイムアウトが設定できます。
-
Webコンテナにリクエストを送信するための,コネクションを確立する時間
-
Webコンテナにリクエストを送信する時間
設定した通信タイムアウトによって,Webコンテナ側またはネットワーク上で障害が発生したことを検知できます。検知できる障害を次に示します。
- 検知できる障害
-
-
Webコンテナが稼働するホストがダウンした
-
リダイレクタ−Webコンテナ間でネットワーク障害が発生した
-
(b) リクエスト送信処理のリトライ
リダイレクタからのリクエスト送信処理が一時的にできなくなった場合,リクエスト送信処理のリトライができます。一時的にリクエスト送信ができない場合とは次のような場合です。
-
ネットワークの一時的な障害が発生した場合
-
コネクション確立時に,Webコンテナにリクエストが集中している状態で,確立要求が一時的にリスンキューからあふれた場合
-
Webコンテナの起動完了を待っている場合
リトライできる処理は,コネクションの確立処理,およびリクエストヘッダの送信処理となります。リトライ処理の流れを次の図に示します。
リトライは,図中のAまたはBでタイムアウトが発生した場合に実施されます。図中CまたはDの部分で処理に失敗し,タイムアウトが発生した場合,リトライは実施されません。コネクションはクローズされ,クライアントにエラーが返ります。なお,図中CまたはDの部分で処理の失敗とは,Webサーバからのリクエストボディの受信に失敗した場合,またはWebコンテナへのリクエストボディの送信に失敗した場合を指します。
- ポイント
-
図中のCまたはDの処理では,Webコンテナ側ですでにリクエストに対する処理が開始されている可能性があります。Webサーバからのリクエストボディの受信に失敗した場合,およびWebコンテナへのリクエストボディの送信に失敗した場合は,リトライを実施すると二重送信となるおそれがあるため,リトライはされません。
次に,図中Aおよび図中Bで処理に失敗した場合のリトライについて説明します。
-
図中Aの部分で処理に失敗した場合のリトライ
リダイレクタからWebコンテナにコネクションの確立要求を出したあと,Webコンテナが稼働するホストの電源が切断されたり,ネットワーク障害が発生したりした場合,次のように動作します。
-
設定したタイムアウトの時間が経過すると,コネクション確立でタイムアウトが発生したことを示すメッセージが出力されます。
-
指定した回数だけコネクションの確立をリトライします。
なお,リトライ回数分実施してもコネクションの確立ができなかった場合,リクエスト送信に失敗したことを示すメッセージが出力され,クライアントにエラー(ステータスコード500)が返されます。
-
-
図中Bの部分で処理に失敗した場合のリトライ
コネクションの確立が成功したあと,またはWebコンテナにリクエストヘッダの送信をしたあと,Webコンテナが稼働するホストの電源が切断されたり,ネットワーク障害が発生したりした場合,次のように動作します。
-
設定したタイムアウトの時間が経過すると,リクエスト送信でタイムアウトが発生したことを示すメッセージが出力されます。
-
リクエストヘッダの送信処理に使用されたコネクションをクローズします。
-
指定した回数だけリクエストヘッダの送信をリトライします。
なお,このとき,コネクションキャッシュにコネクションがあるかどうかで動作が異なります。
・コネクションキャッシュにコネクションがある場合
コネクションキャッシュ中のコネクションを使用して,リクエストヘッダの送信処理からリトライします。
・コネクションキャッシュにコネクションがない場合
再度,コネクションの確立を実施してから,リクエストヘッダの送信処理をリトライします。
なお,リトライ回数分実施してもリクエストヘッダの送信ができなかった場合,リクエスト送信に失敗したことを示すメッセージが出力され,クライアントにステータスコード500が返されます。
-
-
ロードバランサを使用してリクエストの振り分けをしている場合のリトライ動作
ロードバランサを使用したリクエストの振り分けをしている場合のリトライ動作について,次の図で説明します。
なお,この図では,リクエストは,Webコンテナ1,Webコンテナ2の順で振り分けられ,リトライ回数は3回が設定されていることとします。
図5‒18 ロードバランサを使用してリクエストの振り分けをしている場合のリトライ動作 図のリトライ動作について説明します。
-
Webコンテナ1へのリクエスト送信
リクエストはWebコンテナ1に送信されます。Webコンテナ1へのコネクションの確立またはリクエストヘッダの送信処理に失敗すると,リトライをします。リトライは3回まで実施されます。
-
Webコンテナ2へのリクエスト送信
Webコンテナ1でのリトライに3回失敗すると,リクエストはWebコンテナ2に転送されます。リクエストが転送されると,リトライは再度1からカウントされるため,Webコンテナ2に対しても,最大で3回リトライが実行されます。
-
クライアントへのエラー通知
Webコンテナ2に対しても,コネクションの確立またはリクエストヘッダの送信処理が3回失敗すると,クライアントにエラー(ステータスコード500)が返ります。
- 参考
-
リクエストの転送は,設定されているWebコンテナの数だけ実施されます。
-
(3) Webコンテナでのリクエスト受信時
Webコンテナでは,リダイレクタから転送されたリクエストの受信処理に,タイムアウト時間を設定できます。設定した通信タイムアウトによって,リダイレクタ側で障害が発生したことを検知できます。検知できる障害を次に示します。
- 検知できる障害
-
-
Webサーバが稼働するホストがダウンした
-
Webサーバ−Webコンテナ間のネットワーク障害が発生した
-
クライアント−Webサーバ間での処理が終わる前に,Webコンテナ側でタイムアウトが発生した
これは,Webコンテナが要求したデータサイズ分の読み込みを,クライアント−Webサーバ間で行っているときに,クライアント−Webサーバ間の通信速度が十分ではないなどの理由によって,データの読み込みが終了する前に,Webコンテナで設定した通信タイムアウトが発生したことを意味します。
-
通信タイムアウトが発生する条件と発生後の動作について次の表に示します。
通信タイムアウトが発生する条件 |
発生後の動作 |
---|---|
リクエスト受信時に次の条件をすべて満たしている場合
|
|
サーブレット(JSP)内でのAPI※使用時に,次の条件をすべて満たしている場合
|
|
サーブレット(JSP)内でjavax.servlet.ServletInputStreamクラスまたはjavax.servlet.ServletRequestクラスのgetReaderメソッドによって得られたjava.io.BufferedReaderクラスを使用してPOSTデータを読み込んだ際に,次の条件をすべて満たしている場合
|
|