Hystrixスレッドプールに基づいてリソースの分離
最後の講演で述べたように、あなたはnginxのから開始した場合、キャッシュは無効である、nginxのは、キャッシングサービスを通じて直接、最新の製品データを取得します(私たちのプロジェクトベースの電気の供給者で議論される)製品を呼び出して、遅延を呼び出すことが可能であるキャッシングサービス中に発生資源の枯渇状況。ここで、我々はどのようにHystrixスレッドプールでのリソースの分離を達成するために、ことを懸念しています。
リソースの分離は、それはあなたが依存するすべてのサービスのための1つを要求するために呼び出したい場合は、と言うことですすべて同じでリソースプールを分離し、他のリソースを行っていない、これは、リソースの分離と呼ばれています。今1000に通話の量によって開始されたが、10件のスレッドにスレッドプール、10までしてきたが、このような商品やサービスなど、この依存サービスは、唯一の言うことはありません、実行するには、このスレッドを使用する場合でも、商品やサービスに対する要求インターフェイスは、遅延を呼び出すため、Tomcatの内部のすべてのスレッドがすべてのリソースを使い果たし。
Hystrixリソースの分離は、実際には、コマンドと呼ばれる抽象化を提供します。これは、最も基本的なリソースHystrix分離技術です。
単一のデータ取得を使用してHystrixCommand
私たちは、次のような、キーを定義する際に財やサービスがHystrixCommandで動作して呼び出しますGetProductInfoCommandGroup
、我々は単純に、商品やサービスの各呼び出しは、唯一のスレッドプールのリソースを使用します。このスレッドプールであると考えることができ、私は、他のスレッドのリソースに行くことはありません。
public class GetProductInfoCommand extends HystrixCommand<ProductInfo> {
private Long productId;
public GetProductInfoCommand(Long productId) {
super(HystrixCommandGroupKey.Factory.asKey("GetProductInfoCommandGroup"));
this.productId = productId;
}
@Override
protected ProductInfo run() {
String url = "http://localhost:8081/getProductInfo?productId=" + productId;
// 调用商品服务接口
String response = HttpClientUtils.sendGetRequest(url);
return JSONObject.parseObject(response, ProductInfo.class);
}
}
私たちは、製品データを取得するために、作成および実行するためにPRODUCTIDコマンドに応じて、サービス・インターフェースをキャッシュします。
@RequestMapping("/getProductInfo")
@ResponseBody
public String getProductInfo(Long productId) {
HystrixCommand<ProductInfo> getProductInfoCommand = new GetProductInfoCommand(productId);
// 通过command执行,获取最新商品数据
ProductInfo productInfo = getProductInfoCommand.execute();
System.out.println(productInfo);
return "success";
}
上記execute()メソッドの実装は、実際には、同期されます。あなたはまた、いくつかの他の事をし続けることができますの背後にあるFutureオブジェクトを取得するためにすぐに戻るには、それがキューのスレッドプールへの唯一のコマンドで、キュー()コマンドのメソッドを呼び出すことができ、その後、いくつかの時間は、通話の未来を取得します()メソッドは、データを取得します。これは非同期です。
バッチデータはHystrixObservableCommandを使用して取得しました
限り、製品のデータ取得など、すべての内部に行くために同じスレッド・プールにバインドされ、我々は、スレッドHystrixObservableCommandの実行を経て、そしてそこにこのスレッドでは、より多くのPRODUCTID productInfoの大部分は引き戻します。
public class GetProductInfosCommand extends HystrixObservableCommand<ProductInfo> {
private String[] productIds;
public GetProductInfosCommand(String[] productIds) {
// 还是绑定在同一个线程池
super(HystrixCommandGroupKey.Factory.asKey("GetProductInfoGroup"));
this.productIds = productIds;
}
@Override
protected Observable<ProductInfo> construct() {
return Observable.unsafeCreate((Observable.OnSubscribe<ProductInfo>) subscriber -> {
for (String productId : productIds) {
// 批量获取商品数据
String url = "http://localhost:8081/getProductInfo?productId=" + productId;
String response = HttpClientUtils.sendGetRequest(url);
ProductInfo productInfo = JSONObject.parseObject(response, ProductInfo.class);
subscriber.onNext(productInfo);
}
subscriber.onCompleted();
}).subscribeOn(Schedulers.io());
}
}
リストに基づいて、キャッシュ・サービス・インターフェースでは、このようなであり、IDが来た,
上記HystrixObservableCommand介して、ID列を分離し、APIの方法のいくつかはHystrix、すべての製品データへのアクセスを行います。
public String getProductInfos(String productIds) {
String[] productIdArray = productIds.split(",");
HystrixObservableCommand<ProductInfo> getProductInfosCommand = new GetProductInfosCommand(productIdArray);
Observable<ProductInfo> observable = getProductInfosCommand.observe();
observable.subscribe(new Observer<ProductInfo>() {
@Override
public void onCompleted() {
System.out.println("获取完了所有的商品数据");
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
/**
* 获取完一条数据,就回调一次这个方法
* @param productInfo
*/
@Override
public void onNext(ProductInfo productInfo) {
System.out.println(productInfo);
}
});
return "success";
}
我々は振り返るとHystrixスレッドプールリソースが分離を実現する方法を参照してください。
開始からnginxの、キャッシュは、nginxのは、キャッシングサービスによって製品を呼び出すために、無効です。キャッシュサービスのデフォルトのスレッドサイズは、商品やサービスのインターフェースを呼び出すための10件のスレッドのみ最大10です。Tomcatのキャッシングサービスの他のスレッド内の製品サービスのインタフェースを呼び出し、道路上で死んでハングアップしても製品サービスインタフェースの障害、および10スレッドの最大値のみがまだ他のサービスを呼び出すために使用することができ、他のことを行います。
[〜私たちはあなたを助けることができれば、トラブルは賞賛スポット、お読みいただきありがとうございました]
より多くの経験と技術を学習の交換を歓迎するために一緒に来る:
小さな教室を-夢のためのオンライン学習プラットフォームを戦うhttp://www.yidiankt.com/
[世間の注目の数、自由受け取るために- Javaコア知識[ポイント]]
QQのディスカッション・グループ:616 683 098
QQ:3184402434は
一緒に学ぶ学生の詳細な研究は私のQQの議論を追加することができますしたい-あなたああので、共有するためのリソースの完全なセットがあり経験を議論!