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スレッドの最大値のみがまだ他のサービスを呼び出すために使用することができ、他のことを行います。