在微服務架構中,咱們不可避免的與Hystrix打交道,最近在面試過程當中,也老是被問到Hystrix兩種熔斷方式的區別,今天,就給你們作個小結。java
首先,Hystrix熔斷方式主要有兩種:面試
線程池隔離數據庫
信號量隔離緩存
咱們知道,線程池其實至關於一個容器(池子),容器只有那麼大,超過了其限定額度,就溢出啦,線程池有哪些參數,這裏就再也不給你們贅述了,有興趣的朋友能夠看看我以前發表的文章,有詳細的解釋。那麼信號量隔離是什麼呢?相信有朋友已經想到了,對,就是Semaphore。那麼Semaphore是怎麼使用的呢?恰好以前寫了一段demo,給你們展現下架構
public static void main(String[] args) { Semaphore semaphore = new Semaphore(3); ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { final long num = i; executorService.submit(new Runnable() { @Override public void run() { try { //獲取許可 semaphore.acquire(); //執行 System.out.println("Accessing: " + num); Thread.sleep(new Random().nextInt(5000)); // 模擬隨機執行時長 //釋放 semaphore.release(); System.out.println("Release..." + num); } catch (InterruptedException e) { e.printStackTrace(); } } }); } executorService.shutdown(); }
能夠看到,Semaphore其實也是限定大小,同時訪問的線程會去爭搶獲取一個標識,至關於獲取token祕鑰,拿到的人才有機會執行該邏輯,同時,尤爲記住執行完畢以後須要手動釋放該標識。
下面,咱們就來講說線程池和信號量隔離的區別:併發
線程池 | 信號量 | |
線程 | 請求線程和調用provider線程不是同一條線程 | 請求線程和調用provider線程是同一條線程 |
開銷 | 排隊、調度、上下文切換等 | 無線程切換,開銷低 |
異步 | 支持 | 不支持 |
併發支持 | 支持:最大線程池大小 | 支持:最大信號量上限 |
傳遞Header | 不支持 | 支持 |
支持超時 | 支持 | 不支持 |
那麼,他們兩又是各自在什麼狀況下使用呢?dom
線程池隔離異步
請求併發量大,而且耗時長(通常是計算量大或者讀數據庫):採用線程池隔離,這樣的話,能夠保證大量的容器線程可用,不會因爲服務緣由,一直處於阻塞或者等待狀態,快速失敗返回。ide
信號量隔離微服務
請求併發量大,而且耗時短(通常是計算量小,或讀緩存):採用信號量隔離:由於這類服務的返回每每很是快,不會佔用容器線程太長時間,而且減小了線程切換的一些開銷,提升了緩存服務的效率