分離に基づく_少しクラス(マルチショア・カレッジ)Hystrixスレッドプールの技術リソース

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コア知識[ポイント]]
いかなる社会的関心、自由受け取るために -  Javaコア知識[ポイントなし]
QQのディスカッション・グループ:616 683 098
QQ:3184402434は
一緒に学ぶ学生の詳細な研究は私のQQの議論を追加することができますしたい-あなたああので、共有するためのリソースの完全なセットがあり経験を議論!
ここに画像を挿入説明

おすすめ

転載: www.cnblogs.com/yidiankt/p/11458242.html