字節Java高級崗:線程面試題Java

形成雪崩的真實場景

1.4.1 服務提供者不可用

  • 硬件故障:如網絡故障、硬盤損壞等。面試

  • 程序的 bug:如算法須要佔用大量 CPU 的計算時間致使 CPU 使用率太高。算法

  • 緩存擊穿:好比應用剛重啓,短期內緩存是失效的,致使大量請求直接訪問到了數據庫,數據庫不堪重負,服務不可用。數據庫

  • 秒殺和大促:服務短期承載不了那麼多請求量。

1.4.2 重試加大流量

  • 用戶連續重試:好比用戶看到界面上沒有響應,因此又操做了一遍,結果又增長了一倍請求量。緩存

  • 程序重試機制:好比代碼中有屢次重試的邏輯,一次失敗後,過幾秒後再重試,重試個三次就取消重試,走異常處理分支了。也是增長了請求量。

5、如何防止雪崩

方案

出問題前預防:限流、主動降級、隔離markdown

出問題後修復:熔斷、被動降級網絡

「本篇主要來說解熔斷機制。」?後續幾篇會講解其餘方案。ide

6、熔斷原理和算法

1.6.1 熔斷概念

字節Java高級崗:線程面試題Java

熔斷這個概念來源於電路系統中的保險絲熔斷。當電流過大時,保險絲熔斷,防止因電流過大損壞電器元器件,或因電流過大,致使元器件熱度太高,發生火災。線程

字節Java高級崗:線程面試題Java

「物理公式」?電功率 P = I^2 * R,I 表明電流,元器件的電阻 R 不變的狀況下,電流越大,電功率約大,電阻作的電功大部分都用來發熱了,因此電功率越大,發熱越嚴重。(還好高中物理沒忘。)3d

放到咱們系統中,怎麼理解熔斷?code

若是在某段時間內,調用某個服務很是慢甚至超時,就能夠將這個服務熔斷,後續其餘服務再調用這個服務就直接返回,告訴其餘服務:「「已經熔斷了,你別調用我了,過段時間再來試下吧。」」

1.6.2 如何熔斷

「熔斷有個原則」?一段時間內,統計失敗的次數或者失敗請求的佔比超過必定閾值,就進行熔斷。

詳細的原理以下圖所示:

字節Java高級崗:線程面試題Java

1.6.3 統計請求的算法

  • 請求訪問到後臺服務後,首先判斷熔斷開關是否打開。

  • 若是熔斷開關已打開,則代表當前請求不能被處理。

  • 若是熔斷開關未打開,則判斷時間窗口是否已滿。

  • 若是時間窗口未滿,則請求桶中的請求數加 1。

  • 若是返回的響應有異常,則失敗桶的失敗數加 1,若是返回的響應沒有異常,則成功桶的成功數加 1

  • 若是時間窗口已滿,則開始判斷是否須要熔斷。

1.6.4 熔斷的恢復算法

  • 當熔斷後,開關切換到斷開狀態

  • 過一段時間後,開關切換爲半斷開狀態(Half-Open)。半斷開狀態下,容許對應用程序的必定數量的請求能夠去調用服務,若是調用成功,則認爲服務能夠正常訪問了,因而將開關切換爲閉合狀態

  • 若是半斷開狀態下,仍是有調用失敗的狀況,則認爲服務尚未恢復,開關從半斷開狀態切換到斷開狀態

1.6.5 統計失敗率的時間窗口

字節Java高級崗:線程面試題Java

  • 時間窗口能夠比喻爲人坐在窗戶邊,看外面來往的車輛,必定時間內從窗戶外通過的車輛。

  • 每次請求,都會判斷時間窗口是否已滿(如5分鐘),若是時間窗口已滿,則從新開始計時,且清理請求數/成功數/失敗數。

  • 注意:第一次開始的起始時間默認爲當前時間。

1.6.6 嘗試恢復服務的時間窗口

字節Java高級崗:線程面試題Java

  • 開關爲斷開的狀態,通過必定時間後,好比 1 分鐘,設置爲半斷開的狀態,嘗試發送請求檢測服務是否恢復。

  • 若是已恢復,則切換狀態爲關閉狀態。若是未恢復,則切換狀態爲斷開的狀態,通過 1 分鐘後,重複上面的步驟。

  • 這裏的時間窗口能夠根據環境的運行狀態進行動態調整,好比第一次是 1 分鐘,第二次是 3 分鐘,第三次是 10 分鐘。

7、熔斷中間件

確定有人會問了,你這上面講的原理,難道還真的本身去寫這套算法?

「答案:是的,項目中咱們本身造了一個輪子:熔斷器。」

但這裏我不推薦你們這麼作。市面上還有更優秀的開源組件供你們使用,好比阿里系的?Sentinel(推薦),Netflix 的?Hystrix(已中止更新)。

固然 Sentinel 就不在這篇講了,後續奉上~

字節Java高級崗:線程面試題Java### 最後

通過日積月累, 如下是小編概括整理的深刻了解Java虛擬機文檔,但願能夠幫助你們過關斬將順利經過面試。
因爲整個文檔比較全面,內容比較多,篇幅不容許,下面以截圖方式展現 。若有須要獲取資料文檔的朋友,[能夠點擊這裏免費獲取]( )
字節Java高級崗:線程面試題Java
字節Java高級崗:線程面試題Java
字節Java高級崗:線程面試題Java
字節Java高級崗:線程面試題Java
字節Java高級崗:線程面試題Java
字節Java高級崗:線程面試題Java
字節Java高級崗:線程面試題Java

因爲篇幅限制,文檔的詳解資料太全面,細節內容太多,因此只把部分知識點截圖出來粗略的介紹,每一個小節點裏面都有更細化的內容!

相關文章
相關標籤/搜索