2

クライアント側でを使用してorg.springframework.web.client.RestTemplate、Cent OS ホストで実行されている安静な Web サービスを対象とした休息呼び出しを実行しています。

これらの一連の呼び出しが行われると、接続タイムアウトエラーが発生するという奇妙な動作が見られます

「java.net.SocketTimeoutException: 接続がタイムアウトしました」

ここで注目すべきことは、少なくとも 1 つの非同期 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

考えられる理由の 1 つは、一定時間内に IP アドレスから受け入れる接続数を制限することで、サーバーが API へのトラフィックのレートを制限していることです。手がかりは、 n + 1番目のリクエストが不思議なことに失敗する前に、最初のnリクエストが成功すると言っていることです。

このレート制限がファイアウォール レベルで行われている場合、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 に答える