長年悩んできたConnection reet問題

5281 ワード

初めて現れました。thriftのpython clientがserverを要求しました。たまにこの問題があります。
第二回:第三者のappiにアクセスして、データを要求する時、一つのアクセス者のappiは初めていつもこのエラーを報告しました。その時はまだ処理をしていませんでした。情報を空にして、キャッシュに入れたら、データは間違いです。一つの変更をしたらretryが三回で解決されます。
第三回:最近apptorを捕まえに行く応用指数はまたこの問題が現れました。HttpRequest RetryHandlerを使って再試験して、20回まで設定しても一回も成功しません。
スタックエラー情報:
[app][index-error]: ScreenAnts HD ; priority empty
2014-01-26 14:59:30,668 - I/O exception (java.net.SocketException) caught when processing request: Connection reset
2014-01-26 14:59:30,703 - Retrying request
2014-01-26 14:59:30,668 - [SimpleHttpClient] myRetryHandler, IOException:Connection reset
2014-01-26 14:59:30,668 - I/O exception (java.net.SocketException) caught when processing request: Connection reset
2014-01-26 14:59:30,704 - Retrying request
2014-01-26 14:59:30,668 - I/O exception (java.net.SocketException) caught when processing request: Connection reset
2014-01-26 14:59:30,704 - Retrying request
2014-01-26 14:59:30,704 - [SimpleHttpClient] myRetryHandler, IOException:Connection reset
2014-01-26 14:59:30,704 - [SimpleHttpClient] read http://search.itunes.apple.com/WebObjects/MZSearchHints.woa/wa/hints?q=Deadliest+Animals failed
java.net.SocketException: Connection reset
	at java.net.SocketInputStream.read(SocketInputStream.java:185)
	at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:136)
	at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:152)
	at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:270)
	at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140)
	at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
	at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260)
	at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:161)
	at sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.apache.http.impl.conn.CPoolProxy.invoke(CPoolProxy.java:138)
	at $Proxy7.receiveResponseHeader(Unknown Source)
	at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271)
	at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
	at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:253)
	at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:194)
	at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:85)
	at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
	at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)
	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
	at com.fanxer.aso.index.utils.SimpleHttpClient.getContent(SimpleHttpClient.java:135)
	at com.fanxer.aso.index.task.AppIndexTask.getXmlBytesFromSearchLink(AppIndexTask.java:163)
	at com.fanxer.aso.index.task.AppIndexTask.access$000(AppIndexTask.java:40)
	at com.fanxer.aso.index.task.AppIndexTask$1.call(AppIndexTask.java:98)
	at com.fanxer.aso.index.task.AppIndexTask$1.call(AppIndexTask.java:93)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
	at java.util.concurrent.FutureTask.run(FutureTask.java:166)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:679)
  
http://bbs.csdn.net/topics/210061352 4種類のsocket異常を説明しました。
java.net.SocketException: (Connection reetまたはConnect リセット by peer:Socket write error。この異常はクライアントとサーバーの両方で発生する可能性があります。この異常の原因は二つあります。一つ目は端のソケットがオフになった場合(または自動的にオフになった場合、または異常終了によるクローズ)、もう一方の端はまだデータを送信しています。送信された最初のパケットがこの異常を引き起こしました。 リセット by パーカー。もう一つは端が退出したが、終了時はこの接続を閉じておらず、他端は接続からデータを読むとこの異常を投げます。 レスリング簡単に言うと、接続が切断された後の読み書き操作によるものです。
複数のテストにより、50スレッドを同時にし、最大の接続時間は90秒を超えており、平均要求結果は400 KBしかなく、非常に奇妙な現象であることがわかった。アプリ端末の接続時間が長すぎて直接に切断されたと推測されます。変更でタイムアウトしました。要求を早く回復させるしかないです。
RetryExec.executeの時も正常に接続できませんでした。
 
ソースコードを確認してください。InternalHttpClientはClose bleHttpClientを継承して父の抽象的な方法を実現しました。
protected abstract Closeable HttpResonse doExecute(HttpHost target、HttpRequest request、HttpContext context)throws IOException、ClientProtocol Exception;
requestに対してパッケージを作りました。host、config、routeが確定したら、execChainに移動します。 
execCharinは一連の責任連鎖である。 
Redirect Exec->RetryExec->Protocol Exec->MainClient Exec
HttpRequest Exectorに依頼し、Default BHttp ClintConnectionを通じて結果をreponseに書き込み、プログラムを見ても問題が見つからず、ついにcurlを使ってテストをしたが、失敗したことが分かりました。
curl:(56)Failure when receiving data from the peer
要求周波数を下げたり、要求回数を下げたり、エラーが発見された場合は、一時的に停止して解決するしかありません。