2

org.springframework.web.client.RestTemplate在客户端使用 来执行针对在 Cent OS 主机上运行的静止 Web 服务的静止调用。

我看到一个奇怪的行为,当进行一系列这样的调用时,我得到一个连接超时错误说

“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 调用看起来甚至没有击中服务器。我在这里想念什么?我需要设置不同的标题吗?

4

1 回答 1

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 的文档,看看它是否对客户端实施了速率限制。可能是服务器在其响应中返回标头(就像 Twitter 所做的那样),以帮助客户预测他们何时即将达到极限。

于 2014-07-12T16:29:03.317 回答