我正在使用客户端的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呼叫看起来甚至没有命中服务器。我在这里错过了什么?我需要设置不同的标题吗?
答案 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),以帮助客户预测他们何时会达到其限制。