全部產品
Search
文件中心

:Java SDK報錯:SocketTimeoutException

更新時間:May 13, 2022

現象

當“SDK接收到資料的時間”減去“SDK發送資料的時間”超過SocketTimeout時,SDK會拋出SocketTimeoutException。這段時間內包含了“應用發送請求(包含網路傳輸)”、“服務端處理”和“應用接收響應(包含網路傳輸)”。SocketTimeout可以在建立OTSClient時自訂,如果沒有設定,預設是15s。

解決方案

出現SocketTimeoutException,可能是以下幾種原因:

  • 網路不通

    如果全部請求都是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環境使用了內網的endpoint。

  • 服務端處理慢,超過了SDK設定的SocketTimeout值

    一個請求在Table Store服務端的處理時間幾乎是不會超過15秒的,因為服務端也會有一個逾時時間,大概是10秒,超過這個時間會給用戶端返回OTSTimeout錯誤。

    但是,假設在SDK端自訂了SocketTimeout,例如2秒,那麼當服務端執行時間超過2秒時,SDK就會拋出SocketTimeoutException錯誤。

  • 網路傳輸慢

    如果服務端處理時間並不長,但是網路傳輸慢,導致整體延遲長,也會導致SocketTimeoutException。檢查是否存在流量過高、頻寬吃緊、網路重傳率高等情況。

  • Java進程的GC頻繁,經常FullGC,導致SocketTimeoutException

    程式負載高,GC頻繁時出現SocketTimeoutException。原因是當發生FullGC的時候,請求發不出去,或者收不到響應,超過了SDK端設定的SocketTimeout,就會拋出SocketTimeoutException。

    這種情況下需要用工具分析進程的GC情況,解決進程頻繁GC的問題。