硬件故障:
如網絡故障、硬盤損壞等。面試
程序的 bug:
如算法須要佔用大量 CPU 的計算時間致使 CPU 使用率太高。算法
緩存擊穿:
好比應用剛重啓,短期內緩存是失效的,致使大量請求直接訪問到了數據庫,數據庫不堪重負,服務不可用。數據庫
秒殺和大促:
服務短期承載不了那麼多請求量。用戶連續重試:
好比用戶看到界面上沒有響應,因此又操做了一遍,結果又增長了一倍請求量。緩存
程序重試機制:
好比代碼中有屢次重試的邏輯,一次失敗後,過幾秒後再重試,重試個三次就取消重試,走異常處理分支了。也是增長了請求量。出問題前預防:限流、主動降級、隔離markdown
出問題後修復:熔斷、被動降級網絡
「本篇主要來說解熔斷機制。」?後續幾篇會講解其餘方案。ide
熔斷這個概念來源於電路系統中的保險絲
熔斷。當電流過大時,保險絲熔斷,防止因電流過大
損壞電器元器件,或因電流過大,致使元器件熱度太高,發生火災。線程
「物理公式」?電功率 P = I^2 * R,I 表明電流,元器件的電阻 R 不變的狀況下,電流越大,電功率約大,電阻作的電功大部分都用來發熱
了,因此電功率越大,發熱越嚴重。(還好高中物理沒忘。)3d
放到咱們系統中,怎麼理解熔斷?code
若是在某段時間內,調用某個服務很是慢甚至超時,就能夠將這個服務熔斷,後續其餘服務再調用這個服務就直接返回,告訴其餘服務:「「已經熔斷了,你別調用我了,過段時間再來試下吧。」」
「熔斷有個原則」?一段時間內,統計失敗的次數或者失敗請求的佔比超過必定閾值,就進行熔斷。
詳細的原理以下圖所示:
請求訪問到後臺服務後,首先判斷熔斷開關是否打開。
若是熔斷開關已打開
,則代表當前請求不能被處理。
若是熔斷開關未打開
,則判斷時間窗口是否已滿。
若是時間窗口未滿
,則請求桶中的請求數加 1。
若是返回的響應有異常,則失敗桶的失敗數加 1
,若是返回的響應沒有異常,則成功桶的成功數加 1
。
已滿
,則開始判斷是否須要熔斷。當熔斷後,開關切換到斷開狀態
。
過一段時間後,開關切換爲半斷開狀態
(Half-Open)。半斷開狀態下,容許對應用程序的必定數量的請求能夠去調用服務,若是調用成功,則認爲服務能夠正常訪問了,因而將開關切換爲閉合狀態
。
斷開狀態
。時間窗口能夠比喻爲人坐在窗戶邊,看外面來往的車輛,必定時間內從窗戶外通過的車輛。
每次請求,都會判斷時間窗口是否已滿(如5分鐘),若是時間窗口已滿,則從新開始計時,且清理請求數/成功數/失敗數。
開關爲斷開的狀態,通過必定時間後,好比 1 分鐘,設置爲半斷開
的狀態,嘗試發送請求檢測服務是否恢復。
若是已恢復,則切換狀態爲關閉狀態。若是未恢復,則切換狀態爲斷開
的狀態,通過 1 分鐘後,重複上面的步驟。
確定有人會問了,你這上面講的原理,難道還真的本身去寫這套算法?
「答案:是的,項目中咱們本身造了一個輪子:熔斷器。」
但這裏我不推薦你們這麼作。市面上還有更優秀的開源組件供你們使用,好比阿里系的?Sentinel
(推薦),Netflix 的?Hystrix
(已中止更新)。
固然 Sentinel 就不在這篇講了,後續奉上~
### 最後
通過日積月累, 如下是小編概括整理的深刻了解Java虛擬機文檔,但願能夠幫助你們過關斬將順利經過面試。
因爲整個文檔比較全面,內容比較多,篇幅不容許,下面以截圖方式展現 。若有須要獲取資料文檔的朋友,[能夠點擊這裏免費獲取]( )
因爲篇幅限制,文檔的詳解資料太全面,細節內容太多,因此只把部分知識點截圖出來粗略的介紹,每一個小節點裏面都有更細化的內容!