2014-07-11 41 views
2

我在客戶端使用org.springframework.web.client.RestTemplate來執行鍼對在Cent OS主機上運行的restful webservice的其餘調用。爲什麼我的HTTP GET請求開始超時?

我看到一個奇怪的現象,其中當一系列這些電話都是由我得到一個連接超時錯誤說

「java.net.SocketTimeoutException:連接超時」

一這裏值得注意的是,至少在進行一次異步http呼叫後,http呼叫總是失敗。在發生故障時,http呼叫會嘗試多次,修復等待時間爲5秒。

以下是得到的HTTP調用傳遞的標題 -

[Accept: application/json 
, Content-Type: application/json;charset=UTF-8 
, Accept-Language: en_US 
, API-Version: 100 
, X-Request-ID: a99ccd66-5172-4056-a319-4e2e2614aff6 
, X-User-Waiting: false 
, Connection: Close 
, Content-Length: 2015 
] 

HTTP調用不看甚至擊中服務器。我在這裏錯過了什麼?是否需要設置不同的標題?

回答

1

一個可能的解釋是,服務器通過限制它在一段時間內將從您的IP地址接受的連接數來限制對API的流量限制。線索是你說第請求會在第012個請求神祕失敗之前成功。

如果此限速是在防火牆級別完成的,那麼HTTP請求在到達Web服務器之前將被丟棄,因此您不會在其日誌中看到它。

這聽起來像你有一些控制服務器。如果你這樣做,嘗試運行(作爲root):

iptables -vL INPUT

如果你看到在「目的地」列中的條目,看起來像

tcp dpt:http state NEW limit: avg 10/min burst 5 

或對條目的像

tcp dpt:http state NEW recent: UPDATE seconds: 60 hit_count: 10 name: DEFAULT side: source 
tcp dpt:http state NEW recent: SET name: DEFAULT side: source 

那麼這很可能是發生了什麼事情,您需要接受此限制或修改服務器的防火牆規則。

如果您的不是可以控制服務器,請檢查您正在使用的API的文檔以查看它是否對客戶端強制執行速率限制。它可能是服務器在其響應中返回標頭(as Twitter does),以幫助客戶預測何時達到其限制。