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