問題の説明
Tablestore SDK for Java がデータを受信する時刻と Tablestore SDK for Java がデータを送信する時刻の差がソケットタイムアウト値を超えると、Tablestore SDK for Java は SocketTimeoutException を返します。ソケットタイムアウト期間には、アプリケーションとサーバー間のネットワーク転送の期間が含まれ、アプリケーションがリクエストを送信してからサーバーがリクエストを処理し、アプリケーションがレスポンスを受信するまでの時間で計算されます。 OTSClient インスタンスを作成するときに、ソケットタイムアウト値をカスタマイズできます。デフォルトでは、ソケットタイムアウト値は 15 秒です。
解決策
考えられる原因に基づいて解決策が提供されます。
-
ネットワーク接続障害
すべてのリクエストに対して SocketTimeoutException が返される場合、考えられる原因はネットワーク接続障害です。 ping または curl コマンドを実行して、ネットワークの接続性をテストできます。
ping aaaa.cn-hangzhou.ots.aliyuncs.com curl aaaa.cn-hangzhou.ots.aliyuncs.com
ほとんどの場合、curl コマンドは同様の出力を返します。
<? xml version="1.0" encoding="UTF-8"? > <Error><Code>OTSUnsupportOperation</Code><Message>Unsupported operation: ''. </Message><RequestID>00054ec5-822c-8964-adaf-990a07a4d0c9</RequestID><HostID>MTAuMTUzLjE3NS4xNzM=</HostID></Error>
接続に失敗した場合、考えられる原因は、リクエストが ECS インスタンスによって送信されていないときに内部エンドポイントが使用されていることです。
-
Tablestore SDK for Java で指定されたソケットタイムアウト値を超えるサーバー側の遅延
サーバーのデフォルトの最大タイムアウト期間は約 10 秒であるため、Tablestore サーバーがリクエストを処理する期間は 15 秒を超えません。実際の期間が 10 秒を超えると、OTSTimeout がクライアントに返されます。
ただし、Tablestore SDK for Java で 2 などのソケットタイムアウト値が指定されている場合、Tablestore SDK for Java は SocketTimeoutException を返します。
-
ネットワーク転送遅延
サーバー側の処理ではなくネットワーク転送によって全体的な遅延が長くなった場合にも、SocketTimeoutException が返される可能性があります。トラフィックと帯域幅の使用状況、およびパケット再送信率が高いかどうかを確認してください。
-
頻繁なフル GC
頻繁なフル GC によりプログラムが重い負荷で実行されている場合、SocketTimeoutException が返される可能性があります。考えられる原因は、フル GC が発生すると、リクエストを送信できないか、レスポンスを受信できないことです。 Tablestore SDK for Java で指定されたソケットタイムアウト値を実際のタイムアウト期間が超えると、SocketTimeoutException が返されます。
このエラーが発生した場合は、ツールを使用してプロセスの GC 状態を分析し、頻繁な GC を解決する必要があります。