9.3.1 通信を監視するタイマの設定
TCPプロトコルを使用するEADSクライアント・EADSサーバ間の通信では,次に示す時間を監視することによって,通信障害を検知しています。
-
ソケットによる接続開始から接続完了までの時間
-
データの書き込み開始から書き込み完了までの時間
-
データの読み込み開始から読み込み完了までの時間
データの読み込みについては,1つの電文を受信する際に複数回発生することがあります。
- 考え方
-
監視時間を短くすることで通信障害を検知するスピードを早めたり,長くすることで頻繁にタイムアウトが発生するのを防いだりします。
- 〈この項の構成〉
(1) EADSクライアント・EADSサーバ間での通信タイムアウトの設定
EADSクライアント・EADSサーバ間の通信では,次の図に示す通信タイムアウトが設定できます。
通信タイムアウトの設定で使用するパラメタを次の表に示します。表の項番は,図9-2の(1)〜(8)に対応しています。
項番 |
設定するタイムアウト |
定義ファイル |
パラメタ名 |
---|---|---|---|
1 |
EADSサーバへの接続 |
クライアント定義ファイル |
|
2 |
EADSサーバへのデータ送信 |
||
3 |
EADSサーバからのデータ受信 |
||
4 |
EADSクライアントからのデータ受信 |
サーバ定義ファイル |
|
5 |
EADSクライアントへのデータ送信 |
||
6 |
通信のない常設コネクションの切断 |
||
7 |
イベントリスナ用のコネクションの再接続 |
クライアント定義ファイル |
|
8 |
サーバ定義ファイル |
EADSクライアント・EADSサーバ間の通信で,タイムアウトが設定できる個所を次の図に示します。
各タイムアウト(図中の(1)〜(8))に設定する値の考え方については,次の個所で説明します。
また,ポイントとなる項目(★1〜★7)については,「9.3.1(5) タイムアウトに設定する値を考慮する際のポイント」で説明します。
(2) 通信タイムアウトに設定する値の考え方
通信タイムアウト(図9-3の(1)〜(5))は,設定したタイムアウト時間内に処理が完了することを期待するものではなく,次のような状態を検知するための機能です。
-
通信路の物理的な切断
-
通信先の障害などによる,通信先との通信路の切断
そのため,期待する時間内に応答がない場合でも,通信タイムアウトの機能で通信を切断することは推奨しません。
EADSサーバの処理は,EADSクライアントとの通信路の状態とは関係なく進みます。EADSクライアントへの応答時に通信路の切断を検知しても,データのロールバックは行いません。そのため,通信タイムアウトの機能で通信を切断してしまうと,EADSクライアントでは,データ操作の結果がわからなくなります。
処理の遅延やネットワークの遅延ではなく,通信先の障害や通信路の切断などを正しく検知できるように,通信タイムアウトの時間をチューニングすることを推奨します。
(3) リクエスト処理用の常設コネクション切断までのタイムアウト値の設定
リクエスト処理用の常設コネクション切断までのタイムアウト値の設定(図9-3の(6))は,AP(ユーザプログラム)が動作するOS,またはホストがダウンした場合に,EADSサーバが気づくことができないときに,OSに設定されたTCPのkeep-aliveのアイドル時間までコネクション,およびスレッドが占有されることを防ぐためのものです。
むだな通信の切断やエラーを回避するために,タイムアウト値には大きめの値を設定することを推奨します。ただし,ほかの機能に影響を与えないように,次の点も考慮してください。
-
EADSクライアント側のコネクション数との関係
EADSクライアントはAPから一定の期間EADSサーバへの操作がないときでもリクエスト処理用の常設コネクションを保持します。リクエスト処理用の常設コネクションはクラスタ構成情報の確認処理のために定期的に使用されます。1つのEADSサーバに対するリクエスト処理用の常設コネクション数は最大で,クライアント定義のeads.client.connectionPool.poolsizeパラメタで指定した数となります。また,各EADSサーバに対してクライアント定義のeads.client.clusterInfo.update.intervalパラメタに指定した間隔で常設コネクションを使用します。
クラスタ構成情報の確認は1スレッドで実行しているため,OSが正常に動作していないホストのアドレスに対して,クラスタ構成情報の確認処理を行うと,最大でクライアント定義のeads.client.connection.send.timeoutパラメタに設定した時間の待ちが発生し,その間,ほかのEADSサーバに対するクラスタ構成情報の確認処理で通信が滞ります。
上記の場合で,かつEADSクライアントからのリクエストがないときに,リクエスト処理用の常設コネクションの切断を防ぐために,サーバ定義のeads.server.connection.keepAlive.timeoutパラメタの値には,次の関係を保つことができる,十分な時間を設定する必要があります。
サーバ定義のeads.server.connection.keepAlive.timeoutパラメタの指定値
>(クライアント定義のeads.client.connection.send.timeoutパラメタの指定値×〔許容するEADSサーバの障害数〕
+クライアント定義のeads.client.clusterInfo.update.intervalパラメタの指定値)
×クライアント定義のeads.client.connectionPool.poolsizeパラメタの指定値
なお,EADSサーバプロセスがダウンしてもOSに問題がない場合,上記のeads.client.connection.send.timeoutパラメタに指定した分の待ち時間は発生しません。そのため,許容するEADSサーバの障害数は,プロセス障害ではなく,ホスト障害などの許容範囲を考慮してください。
-
EADSサーバ側の接続最大数との関係
サーバ定義のeads.server.maxConnectionsパラメタを指定すると,EADSクライアントからの接続数が制限され,設定した値を超えた接続はエラーとなります。
必要最小限の値をこのパラメタに設定している場合,ホストやOSの異常によってEADSサーバ側のネットワークで検知できないネットワーク切断が発生すると,サーバ定義のeads.server.connection.keepAlive.timeoutパラメタに設定した時間までEADSサーバの接続が保持されます。この結果,EADSクライアント側で障害回復後の再接続ができなくなるおそれがあります。この問題を解決するためには,次の式を満たすように,パラメタを設定する必要があります。
サーバ定義のeads.server.connection.keepAlive.timeoutパラメタの指定値
<〔障害発生からEADSクライアントが再接続までに必要とする時間〕
ただし,障害の内容によって対応に掛かる時間が大きく変わるため,メモリに余裕がある場合は,再接続に使用する数をeads.server.maxConnectionsパラメタにあらかじめ加算し,eads.server.connection.keepAlive.timeoutパラメタには3600秒など余裕を持った値を設定することを推奨します。
(4) イベントリスナ用のコネクションの再接続のタイムアウト値の設定
イベントリスナ用のコネクションの再接続のタイムアウト(図9-4の(7)および(8))は,次の目的のために設定します。
-
EADSサーバが動作するOS,またはホストがダウンした場合,EADSクライアントがコネクションの再接続を繰り返すときに,CPUやネットワークの帯域などのリソースが占有されることを防ぐ。
-
AP(ユーザプログラム)が動作するOS,またはホストがダウンした場合,EADSサーバが気づくことができないときに,イベントの再送用のメモリが占有されることを防ぐ。
むだな通信の切断やエラーを回避するために,タイムアウト値には大きめの値を設定することを推奨します。ただし,ほかの機能に影響を与えないように,次の点も考慮してください。
-
EADSクライアント側の再接続間隔との関係
EADSクライアントはイベントリスナ用のコネクションを保持します。1つのEADSサーバに対するイベントリスナ用の常設コネクション数は1です。
コネクションが切断された場合,1回目の再接続では,即時に再接続することで,一時的なネットワーク障害が発生してもイベントの通知が遅延しないようにします。2回目以降の再接続では,クライアント定義のeads.client.eventListener.reconnect.intervalパラメタに指定した間隔で,各EADSサーバに対してコネクションを再接続します。
ただし,1回目の再接続でも,接続先EADSサーバの最大同時接続数を超えて接続しようとした場合は,即時に再接続しません。この場合は,クライアント定義のeads.client.eventListener.reconnect.intervalパラメタに指定した間隔で,コネクションを再接続します。
なお,コネクションの再接続は1スレッドで実行されますが,複数のEADSサーバとの通信は並列に処理されます。このため,OSが正常に動作していないホストのアドレスに対して再接続しても,その間,ほかのEADSサーバからの再接続やイベントの通知が滞ることはありません。
-
EADSサーバ側の再接続間隔との関係
イベントリスナ用のコネクションが切断された場合,EADSサーバは,EADSクライアントからの再接続待ちとなります。
サーバ定義のeads.server.eventListener.notify.retry.timeoutパラメタには,EADSクライアントに再送するデータを破棄するまでの待ち時間を指定します。再接続する前にメモリを解放すると,そのEADSサーバからのイベントの通知が欠落するおそれがあります。そのため,サーバ定義のeads.server.eventListener.notify.retry.timeoutパラメタの値には,次の関係を保つことができる,十分な時間を設定する必要があります。
サーバ定義のeads.server.eventListener.notify.retry.timeoutパラメタの指定値
>クライアント定義のeads.client.connection.send.timeoutパラメタの指定値
+クライアント定義のeads.client.eventListener.reconnect.intervalパラメタの指定値
なお,コネクションの再接続待ちは1スレッドで実行されますが,複数のEADSクライアントとの通信は並列に処理されます。このため,OSが正常に動作していないホストのアドレスに対して再接続しても,その間,ほかのEADSクライアントへの再接続やイベントの通知が滞ることはありません。
-
EADSサーバ側の接続最大数との関係
サーバ定義のeads.server.maxConnectionsパラメタを指定すると,EADSクライアントからの接続数が制限され,設定した値を超えた接続はエラーとなります。
必要最小限の値をこのパラメタに設定している場合,ホストやOSの異常によってEADSサーバ側のネットワークで検知できないネットワーク切断が発生すると,サーバ定義のeads.server.connection.keepAlive.timeoutパラメタに設定した時間までEADSサーバの接続が保持されます。この結果,EADSクライアント側で障害回復後の再接続ができなくなるおそれがあります。この問題を解決するため,メモリに余裕がある場合は,再接続に使用するコネクション数をeads.server.maxConnectionsパラメタにあらかじめ加算することを推奨します。
(5) タイムアウトに設定する値を考慮する際のポイント
タイムアウトに設定する値を考慮する際に,ポイントとなる項目について説明します。なお,このポイントは図9-3および図9-4の★1〜★7に対応しています。
- ポイント1(★1)
-
EADSクライアントからの通信は,通常,常設コネクションを使用します。そのため,初回接続時や,クライアントライブラリを使用するスレッドが増加した場合にだけ接続処理が発生します。接続タイムアウトには送信タイムアウトと同じ値(クライアント定義のeads.client.connection.send.timeoutパラメタの値)が使用されます。
- ポイント2(★2)
-
データ送信処理は送信側の送信バッファにデータを格納した時点で送信完了と見なされます。そのため,送信バッファに収まるサイズの送信処理では,受信側プロセスや通信路の状態に関係なく,データの送信処理が成功します(通信路に問題がある場合は,次の受信処理でエラーになります)。
送信バッファより大きいサイズのデータを送信する場合,FullGCなど受信側プロセスの問題で送信エラーが発生することがあります。送信バッファのサイズを超えるような大きなデータを送信する場合は,受信側プロセスのFullGCなどに掛かる時間を考慮する必要があります。
- ポイント3(★3)
-
送信処理,受信処理は,内部では複数回に分けて実行されます。その際,それぞれの処理でタイムアウト値が適用されます。そのため,タイムアウト値は応答が戻るまでの時間を保証するものではありません。
- ポイント4(★4)
-
EADSクライアントは,EADSクライアント側の送信処理が終わった時点から次の読み込み処理に移ります。このとき,送信したデータをEADSサーバが受信しているかどうかは考慮されません。
また,EADSクライアントの受信タイムアウトに含まれる時間には,EADSサーバ上のデータ操作やユーザファンクションの実行時間が含まれます。処理に時間が掛かるユーザファンクションが存在する場合,ユーザファンクションの処理時間に合わせてクライアント定義を設定すると,通常の通信には適さない値となるおそれがあります。そのような場合には,クライアント定義でタイムアウト値を設定するのではなく,タイムアウトつきのAPIの使用を推奨します。
- ポイント5(★5)
-
EADSクライアントへのレスポンス送信を終えたEADSサーバは,次のリクエスト待ちとなります。この受信処理には,通常の通信タイムアウト(サーバ定義のeads.server.connection.timeoutパラメタで指定した値)ではなく,常設コネクションのタイムアウト(サーバ定義のeads.server.connection.keepAlive.timeoutパラメタで指定した値)が適用されます。常設コネクションのタイムアウトの設定値については,「9.3.1(3) リクエスト処理用の常設コネクション切断までのタイムアウト値の設定」を参照してください。
- ポイント6(★6)
-
EADSクライアントは,イベントリスナ用のコネクションを保持し続けます。コネクションが切断された場合には,EADSサーバに対して再接続を繰り返します。
イベントリスナ用のコネクションの再接続については,「9.3.1(4) イベントリスナ用のコネクションの再接続のタイムアウト値の設定」を参照してください。
- ポイント7(★7)
-
EADSサーバは,イベントリスナ用のコネクションを保持し続けます。コネクションが切断された場合には,EADSクライアントからの再接続を待ちます。
イベントリスナ用のコネクションの再接続については,「9.3.1(4) イベントリスナ用のコネクションの再接続のタイムアウト値の設定」を参照してください。