Hystrixは、スレッドプールのリソースの分離を達成するために

Hystrixスレッドプールに基づいてリソースの分離

最後の講演で述べたように、あなたはnginxのから開始した場合、キャッシュは無効である、nginxのは、キャッシングサービスを通じて直接、最新の製品データを取得します(私たちのプロジェクトベースの電気の供給者で議論される)製品を呼び出して、遅延を呼び出すことが可能であるキャッシングサービス中に発生資源の枯渇状況。ここで、我々はどのようにHystrixスレッドプールでのリソースの分離を達成するために、ことを懸念しています。

リソースの分離は、それはあなたが依存するすべてのサービスのための1つを要求するために呼び出したい場合は、と言うことですすべて同じでリソースプールを分離し、他のリソースを行っていない、これは、リソースの分離と呼ばれています。今1000に通話の量によって開始されたが、10件のスレッドにスレッドプール、10までしてきたが、このような商品やサービスなど、この依存サービスは、唯一の言うことはありません、実行するには、このスレッドを使用する場合でも、商品やサービスに対する要求インターフェイスは、遅延を呼び出すため、Tomcatの内部のすべてのスレッドがすべてのリソースを使い果たし。

Hystrixリソースの分離は、実際には、コマンドと呼ばれる抽象化を提供します。これは、最も基本的なリソースHystrix分離技術です。

単一のデータ取得を使用してHystrixCommand

私たちは、次のようなキー、定義にHystrixCommandで動作パッケージ商品やサービスを呼び出します  GetProductInfoCommandGroup のみスレッドプールのリソースを使用します、我々は単にこのスレッドプール、商品やサービスの各呼び出しであると考えることができ、 、他のスレッドのリソースと行くことはありません。

パブリック クラス GetProductInfoCommandは 延び HystrixCommandを< ProductInfo >  {

    プライベート ロングPRODUCTID。

    公共 GetProductInfoCommand (ロング商品コード){

        スーパー(HystrixCommandGroupKey 工場asKey("GetProductInfoCommandGroup" ));

        これ商品コード=  商品コード;

    }

    @オーバーライド

    保護 ProductInfo ラン(){

        文字列のURL =  "のhttp:// localhostを:?8081 / getProductInfoのProductID ="  +  PRODUCTID。

        //コール製品サービス・インターフェース

        文字列の応答=  HttpClientUtils sendGetRequest(URL);

        返す JSONObjectをparseObject(応答、ProductInfo クラス)

    }

}

私たちは、製品データを取得するために、作成および実行するためにPRODUCTIDコマンドに応じて、サービス・インターフェースをキャッシュします。

@RequestMapping "/ getProductInfo" @ResponseBodypublic  ストリングgetProductInfo(ロング商品コード){

    HystrixCommand < ProductInfo >  getProductInfoCommand =  新しい GetProductInfoCommand(商品コード);

    //コマンド実行することで、最新の取引データを取得します

    ProductInfo productInfo =  getProductInfoCommand 実行()。

    システムアウトprintln(productInfo)。

    戻る 「成功」

}

上記execute()メソッドの実装は、実際には、同期されます。あなたはまた、いくつかの他の事をし続けることができますの背後にあるFutureオブジェクトを取得するためにすぐに戻るには、それがキューのスレッドプールへの唯一のコマンドで、キュー()コマンドのメソッドを呼び出すことができ、その後、いくつかの時間は、通話の未来を取得します()メソッドは、データを取得します。これは非同期です。

バッチデータはHystrixObservableCommandを使用して取得しました

限り、製品のデータ取得など、すべての内部に行くために同じスレッド・プールにバインドされ、我々は、スレッドHystrixObservableCommandの実行を経て、そしてそこにこのスレッドでは、より多くのPRODUCTID productInfoの大部分は引き戻します。

パブリック クラス GetProductInfosCommandは 延び HystrixObservableCommandを< ProductInfo >  {

    プライベート 文字列[] productIds。

    公共 GetProductInfosCommand 文字列[] productIds ){

        //または同じスレッドプールに結合

        スーパー(HystrixCommandGroupKey 工場asKey("GetProductInfoGroup" ));

        これproductIds =  productIds。

    }

    @オーバーライド

    保護 観測< ProductInfo >  コンストラクト(){

        戻る 観察可能unsafeCreate((観測.OnSubscribe < ProductInfo > )加入者- >  {

             (文字列商品コード {productIds)

                //バルク製品データを取得します

                文字列のURL =  "のhttp:// localhostを:?8081 / getProductInfoのProductID ="  +  PRODUCTID。

                文字列の応答=  HttpClientUtils sendGetRequest(URL);

                ProductInfo productInfo =  JSONObject parseObject(応答、ProductInfo クラス)

                加入者onNext(productInfo)。

            }

            加入者)(onCompleted。

        }) subscribeOn(スケジューラIO())。

    }

}

リストに基づいて、キャッシュ・サービス・インターフェースでは、このようなあるとして、IDを来て   いくつかのAPIメソッドHystrix、すべての製品データへのアクセスを実行し、上記HystrixObservableCommandを通じて、id文字列を分離しました。

パブリック 文字列getProductInfos(文字列productIds){

    文字列[] productIdArray =  productIds スプリット("" );

    HystrixObservableCommand < ProductInfo >  getProductInfosCommand =  新しい GetProductInfosCommand(productIdArray)。

    観測可能な< ProductInfo >  観察できる=  getProductInfosCommand 観察する();

    観測可能サブスクライブ(新しい オブザーバー< ProductInfo > (){

        @オーバーライド

        公共 のボイド onCompleted (){

            システムOUT のprintln(「すべての製品データを乗り越えます」);

        }

        @オーバーライド

        公共 ボイド のonError (ThrowableのE ){

            電子printStackTrace();

        }

        / ** *コールバックメソッドと、完全なデータを取得する* @param  productInfo * /

        @オーバーライド

        公共 のボイド onNext (ProductInfo productInfo ){

            システムアウトprintln(productInfo)。

        }

    });

    戻る 「成功」

}

我々は振り返るとHystrixスレッドプールリソースが分離を実現する方法を参照してください。

開始からnginxの、キャッシュは、nginxのは、キャッシングサービスによって製品を呼び出すために、無効です。キャッシュサービスのデフォルトのスレッドサイズは、商品やサービスのインターフェースを呼び出すための10件のスレッドのみ最大10です。Tomcatのキャッシングサービスの他のスレッド内の製品サービスのインタフェースを呼び出し、道路上で死んでハングアップしても製品サービスインタフェースの障害、および10スレッドの最大値のみがまだ他のサービスを呼び出すために使用することができ、他のことを行います。

 

おすすめ

転載: blog.csdn.net/u014513171/article/details/93461992