三.Hystrix資源隔離

1.Hystrix資源隔離的策略

  線程池隔離web

  線程隔離技術不是去控制相似tomcat這種web容器的請求線程,它是控制的是tomcat內部的執行線程,線程池滿後,能夠保證的是,tomcat的執行線程不會由於依賴服務的延遲或故障被卡死,使tomcat的執行線程最多損失這個線程池的線程數量,tomcat的其餘線程不會卡死,會當即返回作其餘的事情。緩存

  整個流程就是:tomcat

  tomcat接收請求,tomcat線程將對依賴服務的調用路由到Hystrix的線程池,Histrix開啓線程執行依賴服務的調用,tomcat線程當即返回,去作處理其餘的請求。網絡

 信號量隔離技術併發

  信號量是直接用tomcat線程調用依賴服務。框架

 

2.如何在線程池和信號量之間作選擇

  線程池,針對涉及網絡請求的操做ide

  信號量,針對純內存操做,好比比較複雜的耗時的邏輯,還有就是你當前的服務已經支撐不了某個業務的流量洪峯,想進行流量削峯,這時候能夠用信號量,限制tomcat自己的線程開銷,由於你的目的是限制tomcat自身的線程。性能

 

  說白了,信號量限制的是tomcat自身的線程,線程池是利用hystrix的線程替代tomcat的線程去作tomcat線程該作的事(本身總結,不保證正確性)。this

 

3.配置 

// to use thread isolation
HystrixCommandProperties.Setter()
   .withExecutionIsolationStrategy(ExecutionIsolationStrategy.THREAD)
// to use semaphore isolation
HystrixCommandProperties.Setter()
   .withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)

 

1.command group:command group用來定義一個線程池的,並且還會經過command group來聚合一些監控和報警信息,同一個command group中的請求,都會進入同一個線程池中。spa

2.threadpool key:表明了一個HystrixThreadPool,用來進行統一監控,統計,緩存。默認的threadpool key就是command group名稱,每一個command都會跟它的threadpool key對應的thread pool綁定在一塊兒。若是不想直接用command group,也能夠手動設置thread pool name。

public CommandHelloWorld(String name) {
    super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
            .andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld"))
            .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("HelloWorldPool")));
    this.name = name;
}

3.command key:表明了一類command,通常來講,表明了底層的依賴服務的一個接口

 

 

command group:表明了某一個底層的依賴服務,一個依賴服務可能會暴露出來多個接口,每一個接口就是一個command key,command group是用來在邏輯上組合一堆command的,在邏輯上去組織起來一堆command key的調用,統計信息,成功次數,timeout超時次數,失敗次數,能夠看到某一個服務總體的一些訪問狀況;通常來講,推薦是根據一個服務去劃分出一個線程池,command key默認都是屬於同一個線程池的。

舉個例子,對於一個服務中的某個功能模塊來講,但願將這個功能模塊內的全部command放在一個group中,那麼在監控和報警的時候能夠放一塊兒看。

command group對應了一個服務,可是這個服務暴露出來的幾個接口,訪問量很不同,差別很是之大,你可能就但願在這個服務command group內部,包含的對應多個接口的command key,作一些細粒度的資源隔離,那麼能夠對同一個服務的不一樣接口,都使用不一樣的線程池。

 

4 .coreSize

設置線程池的大小,默認是10

HystrixThreadPoolProperties.Setter()
   .withCoreSize(int value)

 

5.queueSizeRejectionThreshold

控制queue滿後執行reject,由於maxQueueSize不容許熱修改,所以提供這個參數能夠熱修改,控制隊列的最大大小,默認值是5.

 

6.ExecutionIsolationSemaphoreMaxConcurrentRequests

設置使用SEMAPHORE隔離策略的時候,容許訪問的最大併發量,超過這個最大併發量,請求直接被reject

這個併發量的設置,跟線程池大小的設置,是相似的,可是基於信號量的話,性能會好不少,並且hystrix框架自己的開銷會小不少

默認值是10,設置的小一些,不然由於信號量是基於調用tomcat線程去執行command的(線程池技術是基於hystrix本身的線程去執行command),並且也不能從timeout中抽離,所以一旦設置的太大,並且有延時發生,可能瞬間致使tomcat自己的線程資源本佔滿。

HystrixCommandProperties.Setter()
   .withExecutionIsolationSemaphoreMaxConcurrentRequests(int value)

 

 

4.代碼

(1). 設置信號量隔離

public class SemaphoreCommand extends HystrixCommand<String> {public SemaphoreCommand() {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("SemaphoreGroup"))
                .andCommandKey(HystrixCommandKey.Factory.asKey("SemaphoreCommand"))
                .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("SemaphorePool"))
                .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                        .withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
                        .withExecutionIsolationSemaphoreMaxConcurrentRequests(15)));
    }
    
    @Override
    protected String run() throws Exception {
        return "數據";
    }
    
}

 

(2).設置線程池的隊列大小

public class GetProductInfoCommand extends HystrixCommand<ProductInfo> {

    private Long productId;
    
    public GetProductInfoCommand(Long productId) {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ProductInfoService"))
                .andCommandKey(HystrixCommandKey.Factory.asKey("GetProductInfoCommand"))
                .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("GetProductInfoPool"))
                .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
                        .withCoreSize(15)
                        .withQueueSizeRejectionThreshold(10))
                );  
        this.productId = productId;
    }
    
    @Override
    protected ProductInfo run() throws Exception {return JSONObject.parseObject("數據", ProductInfo.class);  
    }

}
相關文章
相關標籤/搜索