Javaの修正方法.入出力Javaで壊れたパイプ( Warly fly 10.1 )



プレビュー
私の最初の道は壊れたパイプの問題と交差していたとき、私は私が取り組んでいたソフトウェアのログを見つめていた.
ソフトウェアのスタックは以下の通りです.
JAX - RS によるJavaEE 7
  • Java 8
  • アプリケーションサーバとしての
  • Wildfly 10.1
  • nginxはリバースプロキシとロードバランサとして使用されました.
  • ログに氾濫した跡が見えました.
    < div >
    < br/>
    クラスをハイライト表示する
    java.lang.RuntimeException: org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
    
    < div >
    私は以前に何度も無視してきましたが、これはプロダクションサーバにどんな混乱も生じておらず、どのようにして生成されたのか、どのように処理するか、全く完全にそれを防ぐことができなかったのです.p >
    < H 3 >

    どのような正確に壊れたパイプですか?
    <高橋潤子>
    単純な用語では、壊れたパイプは、マシンがパイプからのデータを読み書きしようとしていることを意味しますが、パイプの他の端のマシンが死んだり終了したりします.今、接続が閉じられているので、データのさらなる転送のために新しい接続を確立しなければなりません、さもなければ、データ転送は止まりますp >
    < H 3 >

    どうやって起きるの?
    <高橋潤子>
    この問題の最も一般的な原因の一つは、クライアントがページを読み込んだり、添付ファイルをダウンロードしたりしている間、クライアントがオープン接続を閉じたときです.また、NGinxのようなプロキシ/ロードバランサーを使用するとき、強制的に特定の接続を閉じるときに起こります.p >
    単純なシナリオ:サーバからリソースを要求するブラウザで、応答サーバはブラウザに対する応答を返す.ブラウザがブラウザに応答を送信したとき、ユーザーがブラウザを閉じた場合、どうなりますか?サーバーへのサーバー間の接続が予期せず閉じます.これは壊れたパイプを引き起こします、そして、例外はJavaと呼ばれます.入出力Javaで壊れたパイプp >
    < tt >クライアントとサーバ間の接続を中断して、パフォーマンスの問題やネットワークの間欠性を持っています.p >

    Not every Broken Pipe exception is developer's fault


    この例外を引き起こす可能性のある要因
    <ウル>
  • < p >エンドユーザ数
    壊れたパイプの主な原因の1つはユーザの振る舞いである(予期していないが、サーバが応答を送信するのを完了する前に、アクティブなブラウザセッションを閉じてしまう).p>
  • < p >重反応負荷
    サーバからの重い応答はクライアント側に転送されるのにかなりの時間を要します、そして、この巨大な時間間隔は壊れたパイプの場合でありえますp>
  • サーバのタイムアウト
    Webサーバがサーバから設定されたタイムアウト値に等しい一定時間のサービスからレスポンスを得ることができなかった場合、クライアントの接続先を終了します.p>< ull >
    < H 3 >

    壊れたパイプ例外は赤い信号ですか?
    <高橋潤子>
    公平に言えば、それは赤信号ではありません.なぜなら、主にユーザの通常の振る舞いによって引き起こされるからです.しかし、サーバが一度に比較的多数のユーザリクエストを実行しているならば、壊れたパイプだけではなく、どんな例外も問題になります.p >

    In my case, due to the high network traffic, logs were flooded with broken pipe exception. As, writing to a file (I/O operation) is one of the expensive operation performed by server, imagine server being flooded with Broken Pipe related exception, and the amount of resource server has to put in order to write that exception stacktrace to log file. This had caused server to response slowly and had made it sluggish.

    At this point, I realized, YES BROKEN PIPE EXCEPTION IS A RED SIGNAL when scaled to large traffic.


    < H 3 >

    壊れたパイプの取扱いまたは除去に対する挑戦
    <高橋潤子>
    システムは、アプリケーションサーバとしてワイルドフライ10.1を使用しており、JavaEE 7に書かれていた.このシナリオを扱うことは、私のためのCakewalkでありませんでした
    <ウル>
    ローカルまたはQA環境でこの例外を複製する
  • < p >は、すべての惑星が適切に整列していることを要求します.p>
  • 例外はcatchブロック内でキャッチされる限り、Javaでのハンドリング例外は簡単です.未処理の例外の性質:Java.入出力IoException :壊れたパイプは、それがWildflyコンテナから調達され、キャッチブロックにトラップされるのではなく、StackTraceでログオンします.さて、コードから捕捉できない例外に対処する必要があると想像してください.よし!!p>
  • < p >あなたは決して知りません、どんな要求が問題を引き起こしたかについて、サーバーが要求の高い量を得ていて、彼らのどれでも例外の原因でありえたかもしれません.ソケットエンドポイントとともにすべての残りのエンドポイントにログを追加することは実現できません.p>
  • < ull >
    < H 3 >

    Javaの修正.入出力壊れたパイプ
    <高橋潤子>
    最後に、コンテキストトークの多くが終わった後に、メインセクションがあります.p >
    システムから例外を削除する2つの方法は以下の通りです.
    <ウル>
  • は例外の根本原因を調査し、それを排除する.
  • 適切なログまたはいくつかのアクションで、例外的に例外を処理します.
  • < ull >
    < H 3 >

    根本原因の除去
    <高橋潤子>
    <ウル>
  • < p >ユーザに不意に接続を閉じないよう要求する< br/>
    こうすることは不可能です.神のために
  • < p > API応答負荷を減らす
    これはどうにか実現可能であるが、レガシーなシステムでは大量のデータを操作し、APIレスポンスが重くないように全てのロジックを書き直すこともできない.p>
  • < p >サーバのタイムアウトを増やす
    nginxには、< em > ProxyChangReadCountTimeout という名前の変数があります.デフォルト値は60 sです.p>
  • < ull >
    このような場合、正確な根の原因をなくしても、壊れたパイプの存在を完全に排除することはできません.できますか?p >
    したがって、次の解決策は壊れたパイプを優雅に扱うことですp >
    < H 3 >

    Javaの処理入出力壊れたパイプ
    <高橋潤子>
    <ウル>

  • ロガー自体からログを抑制する
    log 4 jをログマネージャとして使用する場合、log 4 jに次の設定を追加します.プロパティは、壊れたパイプのためにログを氾濫する例外を取り除くのを助けます.
  • < ull >
    クラスをハイライト表示する
    log4j.logger.org.apache.catalina.connector.ClientAbortException = ERROR, console, cloudAppender
    log4j.additivity.org.apache.catalina.connector.ClientAbortException = false
    
    < div >
    <ウル>

  • Wildfly内での再構築
    JavaでRESTを実装するためのJAX - RSとResteasy V 3の再実装を使用しました.0.19はワイルドフライ10.1にバンドルされています.resteasy自体のいくつかの修正を見つけることの望みで、私はresteasyのリリースノートに掘り始めて、resteasyクライアントv 3の後、それを発見しました.1.1 ,未処理の例外: java入出力IOExceptionは、ログトレースに直接それを公開するコンテナとは異なり、コードからキャッチできます.
    したがって、resteasyクライアントのバージョンアップグレードでは、グローバルな例外ハンドラー(以降のポイントで説明)を通じて例外を処理できます.
  • < ull >
    <研究報告> Wildfly < p >における再構築のステップアップ
    < OL >
  • <P>Resiasy Distribution Jarsの位置を見つける
    resteasy distribution jarの位置は内部にあります
    <川合>ホーム/モジュール/システム/レイヤー/ベース/org/JBoss/Restasy/Resteasy JAXRS/メイン
    ファイル名は以下の通りです.ファイナル.<川合>
    Resteasy downloads < p >
  • からresteasy ( 3.1.1以上)のターゲットバージョンのzipファイルをダウンロードします
  • < p >ファイルを一時ディレクトリに展開します.他の2つのZIPファイルがあります
    < em > READASY - JBOSS - 3.1.1 .最終的なmavenized.Zip & amp ;

    < em > READASY - JBOSS - 3.1.1 .ファイナル.<高橋潤子>
  • < p >をアンパックします.zipファイル:
    <川合>
    <高橋潤子>XML < br/>
    < p >
  • < OL >
    クラスをハイライト表示する
    <dependency> 
      <groupId>org.jboss.resteasy</groupId> 
      <artifactId>resteasy-jaxrs</artifactId> 
      <version>3.1.1.Final</version>
      <scope>provided</scope>
    </dependency>
    
    
    < div >
    <ウル>

  • グローバル例外ハンドラを使用する
    さらに、Javaコード自体からジェネリック例外マッパーを追加し、壊れたパイプをキャッチして処理します.
  • < ull >
    < div class ="LagagCount - gig - Link - tag "
    "スクリプトのID "https://gist.github.com/bishwapoudel/2e3c9ee1ab6230bf8c4f2d65a3416c59.js//>
    < div >
    < H 3 >

    最後のアプローチ
    <高橋潤子>
    私はこの問題を解決するために複数のテクニックを集めましたが、実際に以下のように実装されています.
    <ウル>
  • V 11へのWildflyのアップグレード0は、自動的にresteasy v 3が付属します.1.1(私が正確に欲しかったバージョン)は、それの中で束ねられました.
  • グローバル例外ハンドラ
  • を通じてハンドル例外
    < ull >
    そして、これで、壊れたパイプの問題は現在古いログアーカイブだけに存在します😎😎.


    < H 3 >

    別れの言葉
    <高橋潤子>
    それは私の最初のブログです、はい、それは少し長いです、しかし、私は私が実際に問題に接近して、それを修理した方法に洞察を与えていました.コメントセクション&フィードバックのフィードバックを提供する無料これらのスペースを見てください.p >
    また、最後に自己宣伝のビット😉. & amp ;/で私に手を差し伸べるp >
    < H 3 >

    参考文献
    <高橋潤子>
    <ウル>
  • <p>RESTEASY-1238<p>
  • <p>Github Issue - 756<p>
  • <p>Github - 1169<p>
  • <p>Github - 772<p>
  • <p>Blog post<p>
  • <p>Jira - Atlassian<p>
  • < ull >