キープアライブと間違っHTTP500

最近オンライン頻繁HttpServerErrorException:500の異常、しかし強くない規則、サーバーのエラーログを照会することにより、型が見つかりました:

org.apache.http.NoHttpResponseException:21.153.143.183:8080が応答に失敗しました

HTTPヘッダーを除いて見つかった情報を照会することにより、接続パラメータ:キープアライブ、我々は、ApacheのHTTPClientを使用している程度。

  • 、次の設定を使用し、HttpClientを主にNoConnectionReuseStrategy.INSTANCEパラメータを初期化するときに解決策を与えるために、それは、非常に簡単です:
HTTPClientの= HttpClientBuilder.create() 
.setMaxConnPerRoute(20 
.setConnectionReuseStrategy(NoConnectionReuseStrategy.INSTANCE)// 解决NoHttpResponseException问题 
.setMaxConnTotal(200 
.build();

この要求の目的は、もはや時間多重リンクではありませんが、新しいリンクを作成します。

  • 以下の分析では、異常の原因の下に表示され、そしてなぜ上記の方法では、この問題を解決することができます

HTTP1.1デフォルト要求接続を使用します。キープアライブパラメータを、サーバは次の要求を待って、要求がリンクされたままになります受信した後、リンクが維持されるべきであることを示しています。そして、このキープアライブは、クライアントとサーバーの構成効果的な時間は、システムへの影響は非常に大きい有効です。

サービスはspringboot(1.5.9)はTomcatのコンテナのKeepAliveTimeoutデフォルトが来る使って、この一般的なステートメントは、デフォルト値で、次のように、20秒、通勤AbstractEndpointコードビュー、soTimeoutのデフォルト値です。

 soTimeoutのデフォルトは20秒。

 事実デバッグspringbootサービスを経由して起動しない場合には、あなたが位置に次のコードに到達することができます:

それはsoTimeoutが60秒に変更されました。OK、サーバは60秒のKeepAliveTimeout。

コードを回すことにより、デフォルトのKeepAliveTimeoutクライアントは、15分があった発見しました  。

ギャップは少しないクライアント15分のタイムアウト、およびサービスは、60秒のタイムアウトの終了は、次のパケットキャプチャ、TCP対話プロセス、サービスポート8090によって学習することができます。

3ウェイハンドシェイクによってTCP接続を確立するために、接続が閉じられている4ウェイハンドシェイクは、ポート8090がポート50638に接続され、矢印で示される位置を見ることができます。これはアンチを送信するHTTPClientの接続要求を使用して利用できない場合、確立接続プロセスは正常ですが、あなたは近いリンクサーバだけ希望的観測は、フィンのパッケージを作ったとき、クライアントは、フィンパッケージ(接続が利用できないこの時間)に応答しません学生ではない応答例外。だから、15分後に、クライアントフィンは、サーバーが接続がああ存在しないことを言った、それをリセットします。

 

期限切れの接続の繰り返しの使用を避けるために、上記のソリューションは、何NoHttpResponseException例外はないであろう。しかし、この方法は、硬化の指標ではありません、システムは、隠された危険性の多くを植えました。さらなる分析のために、この問題に再び次の記事。

 

おすすめ

転載: www.cnblogs.com/yunnick/p/11290429.html