更新時間:2020-11-19 來源:黑馬程序員 瀏覽量:
Spring Cloud中的Hystrix是Netflix開源的一款針對分布式系統(tǒng)延遲和容錯的庫,其目的是通過添加延遲容忍和容錯邏輯,從而控制分布式服務之間的交互。
對于一個復雜的分布式系統(tǒng),包含的應用可能多達數(shù)十個,這些應用有許多依賴項目,每個依賴項目在某個時刻不可避免會失敗導致故障,如果不對這些故障進行隔離,整個分布式系統(tǒng)都可能會崩潰。
借助官網的一個例子來說明,假設某個應用程序依賴30多個服務,每個服務正常運行的概率是99.99%,那么系統(tǒng)可用的概率是99.9930=99.7%,也就是說,每個服務出現(xiàn)故障的概率是0.3%,十億個請求的故障就是3000000個,即使所有依賴具有出色的正常運行時間,每個月至少會有2小時以上的服務是不可用的,現(xiàn)實情況中,情況可能會更糟糕。
當一切正常時,請求情況如下圖所示。
一切正常的請求情況
當其中有一個系統(tǒng)有延遲時,它可能阻塞整個用戶請求,具體如下圖所示。
系統(tǒng)出現(xiàn)延遲的情況
在高流量情況下,一個后端的依賴延遲可能會導致所有服務的資源在數(shù)秒內變的飽和,這也就意味著,后續(xù)如果再有請求將無法提供服務,應用會出現(xiàn)故障。比故障更糟糕的是,這些應用程序還可能導致服務之間的延遲增加,從而備份隊列、線程和其他資源,從而導致整個系統(tǒng)出現(xiàn)更多級聯(lián)故障,如下圖所示。
系統(tǒng)出現(xiàn)更多級聯(lián)故障情況
Hystrix的出現(xiàn)就是為了解決上述問題的,它封裝了每個依賴項,每個依賴項彼此隔離,當延遲發(fā)生時,它會被限制在資源中,并包含回退邏輯,該邏輯決定在依賴發(fā)生任何類型故障時應作出何種響應。
使用Hystrix包裝依賴項后,前面圖中的架構會發(fā)生變化,如下圖所示。
使用Hystrix包裝依賴后的架構
在上圖中,Hystrix被設計的目標是阻止級聯(lián)故障,對通過第三方客戶端訪問的依賴項的延遲和故障進行保護和控制。Hystrix實現(xiàn)這一目標的大致思路具體如下:
(1) 將外部依賴的訪問請求封裝在獨立的線程中,進行資源隔離。
(2) 對于超出設定閾值的服務調用,直接進行超時,不允許其耗費過長時間阻塞線程。
(3) 每個依賴服務維護一個獨立的線程池,一旦線程池滿了,直接拒絕服務的調用。
(4) 統(tǒng)計依賴服務調用的成功次數(shù)、失敗次數(shù)、拒絕次數(shù)、超時次數(shù)等結果。
(5) 在一段時間內,如果服務調用的異常次數(shù)超過一定閾值,就會觸發(fā)熔斷停止對特定服務的所有請求,在一定時間內對服務調用直接降級,一段時間后再次進行自動嘗試恢復。
(6) 如果某個服務出現(xiàn)調用失敗、被拒絕、超時等異常情況,自動調用fallback降級機制。
(7) 實時監(jiān)控指標和配置變化。
關于Hystrix工作機制的深入分析將在后面小節(jié)詳解,這里大家對Hystrix熔斷機制有個大致了解即可。
猜你喜歡: