我使用客户端的org.springframework.web.client.RestTemplate来执行rest调用,目标是运行在cent os主机上的restful webservice。
我看到了一个奇怪的行为,当一系列的这些调用被调用时,我得到一个连接超时错误
“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调用看起来甚至没有击中服务器。我错过了什么?我需要换个标题吗?

最佳答案

一种可能的解释是,服务器通过限制它在一段时间内从您的IP地址接受的连接数来限制到API的流量。线索是你说在第n+1个请求神秘地失败之前,前n个请求将成功。
如果在防火墙级别执行此速率限制,则会在到达web服务器之前丢弃http请求,因此您在其日志中看不到它。
听起来你对服务器有控制权。如果是,请尝试以根用户身份运行:
iptables -vL INPUT
如果在“destination”列中看到一个类似于

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)中返回头,以帮助客户端预测何时将达到其限制。

07-24 09:45
查看更多