为什么我的HTTP GET请求开始超时?

时间:2014-07-11 20:19:47

标签: java rest http socket-timeout-exception

我正在使用客户端的org.springframework.web.client.RestTemplate执行针对在Cent OS主机上运行的restful Web服务的休息调用。

我看到一种奇怪的行为,当进行一系列调用时,我收到连接超时错误

  

“java.net.SocketTimeoutException:connect timed out”

这里一个值得注意的事情是,在至少进行一次asynch 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 个答案:

答案 0 :(得分:1)

一个可能的解释是,服务器通过限制在一段时间内从IP地址接受的连接数量来限制API流量。线索是,你说第一个 n 请求会在 n + 1 请求神秘失败之前成功。

如果在防火墙级别进行此速率限制,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),以帮助客户预测他们何时会达到其限制。