Hystrix兩種隔離方式對比

​在微服務架構中,咱們不可避免的與Hystrix打交道,最近在面試過程當中,也老是被問到Hystrix兩種熔斷方式的區別,今天,就給你們作個小結。java

首先,Hystrix熔斷方式主要有兩種:面試

  1. 線程池隔離數據庫

  2. 信號量隔離緩存

咱們知道,線程池其實至關於一個容器(池子),容器只有那麼大,超過了其限定額度,就溢出啦,線程池有哪些參數,這裏就再也不給你們贅述了,有興趣的朋友能夠看看我以前發表的文章,有詳細的解釋。那麼信號量隔離是什麼呢?相信有朋友已經想到了,對,就是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

    1. 線程池隔離異步

      請求併發量大,而且耗時長(通常是計算量大或者讀數據庫):採用線程池隔離,這樣的話,能夠保證大量的容器線程可用,不會因爲服務緣由,一直處於阻塞或者等待狀態,快速失敗返回。ide

    2. 信號量隔離微服務

請求併發量大,而且耗時短(通常是計算量小,或讀緩存):採用信號量隔離:由於這類服務的返回每每很是快,不會佔用容器線程太長時間,而且減小了線程切換的一些開銷,提升了緩存服務的效率

相關文章
相關標籤/搜索