線程池隔離web
線程隔離技術不是去控制相似tomcat這種web容器的請求線程,它是控制的是tomcat內部的執行線程,線程池滿後,能夠保證的是,tomcat的執行線程不會由於依賴服務的延遲或故障被卡死,使tomcat的執行線程最多損失這個線程池的線程數量,tomcat的其餘線程不會卡死,會當即返回作其餘的事情。緩存
整個流程就是:tomcat
tomcat接收請求,tomcat線程將對依賴服務的調用路由到Hystrix的線程池,Histrix開啓線程執行依賴服務的調用,tomcat線程當即返回,去作處理其餘的請求。網絡
信號量隔離技術併發
信號量是直接用tomcat線程調用依賴服務。框架
線程池,針對涉及網絡請求的操做ide
信號量,針對純內存操做,好比比較複雜的耗時的邏輯,還有就是你當前的服務已經支撐不了某個業務的流量洪峯,想進行流量削峯,這時候能夠用信號量,限制tomcat自己的線程開銷,由於你的目的是限制tomcat自身的線程。性能
說白了,信號量限制的是tomcat自身的線程,線程池是利用hystrix的線程替代tomcat的線程去作tomcat線程該作的事(本身總結,不保證正確性)。this
// 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)
(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); } }