<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:熔斷降級原理是什么?

          共 4035字,需瀏覽 9分鐘

           ·

          2021-07-31 19:31

          僅以兩張圖來初步形容一下 熔斷 適用的場景:

          • 雪崩

          • 股災(zāi)

           

          什么是熔斷

          來自 wiki熔斷機(jī)制 描述:

          熔斷機(jī)制(英語:Circuit breaker / Trading curb)指的是在股票市場的交易時間中,
          當(dāng)價格波動的幅度達(dá)到某一個限定的目標(biāo)(熔斷點(diǎn))時,對其暫停交易一段時間的機(jī)制。
          此機(jī)制如同保險絲在電流過大時候熔斷,故而得名。

          熔斷機(jī)制推出的目的是為了防范系統(tǒng)性風(fēng)險,給市場更多的冷靜時間,避免恐慌情緒蔓延導(dǎo)致市場波動,
          從而防止大規(guī)模股價下跌現(xiàn)象的發(fā)生。
          然而熔斷機(jī)制也因切斷了資金的流通性,同樣會造成市場情緒加大,并令市場風(fēng)險在熔斷期結(jié)束后繼續(xù)擴(kuò)大。

          轉(zhuǎn)換成互聯(lián)網(wǎng)語言可以這么理解:

          • 當(dāng)異常幅度達(dá)到設(shè)定的閥值后觸發(fā)的系統(tǒng)保護(hù)機(jī)制

          • 保護(hù)機(jī)制會將某部分能力關(guān)閉,以保證大部分能力正常

          • 這種機(jī)制是有損的,但是利大于端

          熔斷機(jī)制的特點(diǎn),在關(guān)閉一段時間后,會自動觸發(fā)恢復(fù)檢測,如果發(fā)現(xiàn)服務(wù)正常,則將服務(wù)逐漸開放。

          1、雪崩效應(yīng)

          在分布式服務(wù)部署的架構(gòu)下,整體鏈路可以參考為:

          image.png

          如果在大促期間, DB_2 由于 機(jī)器負(fù)載過高sql執(zhí)行緩慢,鏈接數(shù)打滿網(wǎng)絡(luò)抖動等情況,導(dǎo)致 DB_2 不可用,那么整體鏈路的影響就會變成:

          image.png

          服務(wù)雪崩的每個階段都可能由不同的原因造成, 比如造成 服務(wù)不可用 的原因有:

          • 硬件故障

          • 程序Bug

          • 緩存擊穿

          • 用戶大量請求

          2、雪崩處理策略

          • 流量控制:限流削峰都屬于流量控制的一種策略

          • 緩存優(yōu)化:在上述案例中,DB 由于壓力過大導(dǎo)致的雪崩,可以引入緩存,減輕DB壓力

          • 服務(wù)降級:通過異常分支鏈路快速失敗,確保主鏈路正常提供服務(wù)

          • 應(yīng)用擴(kuò)容:針對機(jī)器壓力過大負(fù)載過高,可以通過機(jī)器擴(kuò)容來解決,緩解流量壓力

           

          斷路器模式

          熔斷器模式(Circuit Breaker Pattern),是一個現(xiàn)代軟件開發(fā)的設(shè)計模式。用以偵測錯誤,并避免不斷地觸發(fā)相同的錯誤(如維護(hù)時服務(wù)不可用、暫時性的系統(tǒng)問題或是未知的系統(tǒng)錯誤)。

          狀態(tài)描述:

          • 關(guān)閉:熔斷器默認(rèn)處于關(guān)閉狀態(tài),熔斷器本身帶有計數(shù)能力(如滑動窗口實(shí)現(xiàn)),當(dāng)失敗數(shù)量達(dá)到預(yù)設(shè)閥值后,觸發(fā)狀態(tài)變更,熔斷器被打開

          • 開啟:在一定時間內(nèi),所有請求都會被拒絕,或采用備用鏈路處理。

          • 半開啟:在刷新時間窗口后,會進(jìn)入半開啟狀態(tài),熔斷器嘗試接受請求,如果這階段出現(xiàn)請求失敗,直接恢復(fù)到開啟狀態(tài)。

          image.png

           

          隔離策略

          1、線程隔離

          Hystrix 采用了 Bulkhead Partition艙壁隔離技術(shù),來將外部依賴進(jìn)行資源隔離,進(jìn)而避免任何外部依賴的故障導(dǎo)致本服務(wù)崩潰。

          艙壁隔離,是說將船體內(nèi)部空間區(qū)隔劃分成若干個隔艙,一旦某幾個隔艙發(fā)生破損進(jìn)水,水流不會在其間相互流動,如此一來船舶在受損時,依然能具有足夠的浮力和穩(wěn)定性,進(jìn)而減低立即沉船的危險。

          image.png

          圖片來源:《防雪崩利器:熔斷器 Hystrix 的原理與使用》

          Hystrix 在線程池隔離實(shí)現(xiàn)主要解決一下場景:

          在商品詳情系統(tǒng)中,如果沒有對服務(wù)做降級措施,那么當(dāng)評論服務(wù)出現(xiàn)異常時,整個商品詳情系統(tǒng)都會受到影響,最終導(dǎo)致用戶無法查看商品詳情。

          在這個例子中,商品詳情服務(wù),從請求入口分配線程處理,對每個服務(wù)使用同一個線程進(jìn)行處理(同步),在評論服務(wù)出現(xiàn)異常時(響應(yīng)緩慢處理超時,服務(wù)異常等),導(dǎo)致整個線程阻塞,服務(wù)端響應(yīng)超時,觸發(fā)用戶重試刷新請求,最終導(dǎo)致服務(wù)雪崩,系統(tǒng)崩潰。

          image.png

          Hystrix 線程池隔離方案;

          hystrix把每個依賴都進(jìn)行隔離,對依賴的調(diào)用全部包裝成HystrixCommand或者HystrixObservableCommand 在服務(wù)調(diào)用時,分配獨(dú)立的線程池進(jìn)行資源隔離調(diào)用,如下圖中的評論服務(wù)出現(xiàn)不可用時,商品詳情系統(tǒng)還是能夠?qū)?/span>商品信息,大促信息封裝好返回給用戶。評論服務(wù)的異常,并不會影響其他依賴的調(diào)用。

          image.png

          線程隔離特點(diǎn)

          優(yōu)點(diǎn):

          • 一個依賴可以給予一個線程池,這個依賴的異常不會影響其他的依賴。

          • 使用線程可以完全隔離第三方代碼,請求線程可以快速放回。

          • 當(dāng)一個失敗的依賴再次變成可用時,線程池將清理,并立即恢復(fù)可用,而不是一個長時間的恢復(fù)。

          • 可以完全模擬異步調(diào)用,方便異步編程。

          • 使用線程池,可以有效的進(jìn)行實(shí)時監(jiān)控、統(tǒng)計和封裝。

          缺點(diǎn):

          • 使用線程池的缺點(diǎn)主要是增加了計算的開銷。每一個依賴調(diào)用都會涉及到隊列,調(diào)度,上下文切換,而這些操作都有可能在不同的線程中執(zhí)行。

          線程切換的性能損耗問題

          Netflix在使用過程中詳細(xì)評估了使用異步線程同步線程帶來的性能差異,結(jié)果表明在99%的情況下,異步線程帶來的幾毫秒延遲的完全可以接受的

          2、信號量隔離

          Hystrix 的信號量隔離限制對某個資源調(diào)用異常比例。

          Sentinel 在信號量隔離的限制上提供了更多的策略選擇,基于慢調(diào)用比例、異常比例異常數(shù)。

          信號量隔離實(shí)現(xiàn)原理

          Sentinel 底層采用高性能的滑動窗口數(shù)據(jù)結(jié)構(gòu) LeapArray 來統(tǒng)計實(shí)時的秒級指標(biāo)數(shù)據(jù),在 信號量隔離的底層實(shí)現(xiàn)中, 通過根據(jù)不同的策略,如 異常數(shù) 策略,統(tǒng)計在 滑動窗口區(qū)間內(nèi), 異常請求量的比例,來決定對服務(wù)進(jìn)行熔斷降級處理。

          滑動窗口示意圖:

          image.png

          1、慢調(diào)用比例 (SLOW_REQUEST_RATIO) 設(shè)置允許的慢調(diào)用 RT(即最大的響應(yīng)時間),請求的響應(yīng)時間大于該值則統(tǒng)計為慢調(diào)用。當(dāng)調(diào)用請求數(shù)量大于閥值,觸發(fā)熔斷。閥值設(shè)置,100ms響應(yīng)10個請求 如下圖所示:

          image.png

          2、異常比例 (ERROR_RATIO

          當(dāng)單位統(tǒng)計時長內(nèi)請求數(shù)目大于設(shè)置的最小請求數(shù)目,并且異常的比例大于閾值,則接下來的熔斷時長內(nèi)請求會自動被熔斷。閥值設(shè)置 20% 如下圖所示:

          image.png

          3、異常數(shù) (ERROR_COUNT)

          當(dāng)單位統(tǒng)計時長內(nèi)的異常數(shù)目超過閾值之后會自動進(jìn)行熔斷。閥值設(shè)置 5 如圖所示:

          image.png

           

          熔斷降級組件對比

          image.png

          Sentinel

          Sentinel是阿里中間件團(tuán)隊開源的,面向分布式服務(wù)架構(gòu)的輕量級高可用流量控制組件,主要以流量為切入點(diǎn),從流量控制、熔斷降級、系統(tǒng)負(fù)載保護(hù)等多個維度來幫助用戶保護(hù)服務(wù)的穩(wěn)定性。

          Sentinel 的側(cè)重點(diǎn)在于:

          • 多樣化的流量控制

          • 熔斷降級

          • 系統(tǒng)負(fù)載保護(hù)

          • 實(shí)時監(jiān)控和控制臺

          Hystrix

          HystrixNetflix開源的一款容錯系統(tǒng),能幫助使用者碼出具備強(qiáng)大的容錯能力和魯棒性的程序。提供降級,熔斷等功能。在2018年底,Hystrix在其Github主頁宣布,不再開放新功能,推薦開發(fā)者使用其他仍然活躍的開源項目。

          官方 wiki 描述:
          Hystrix is designed to do the following:

          Give protection from and control over latency and failure from dependencies accessed (typically over the network) via third-party client libraries.
          Stop cascading failures in a complex distributed system.
          Fail fast and rapidly recover.
          Fallback and gracefully degrade when possible.
          Enable near real-time monitoring, alerting, and operational control.
          1. 對通過第三方客戶端庫訪問的依賴項(通常是通過網(wǎng)絡(luò))的延遲和故障進(jìn)行保護(hù)和控制。

          2. 在復(fù)雜的分布式系統(tǒng)中阻止級聯(lián)故障。

          3. 快速失敗,快速恢復(fù)。

          4. 回退,盡可能優(yōu)雅地降級。

          5. 啟用近實(shí)時監(jiān)控、警報和操作控制。

          resilience4j

          resilience4j是一個輕量、易用、可組裝的高可用框架,支持熔斷、高頻控制、隔離、限流、限時、重試等多種高可用機(jī)制。Netflix 官方在停止維護(hù)Hystrix 后,推薦使用 resilience4j 作為替代方案。

          與Hystrix相比,它有以下一些主要的區(qū)別:

          • Hystrix調(diào)用必須被封裝到HystrixCommand里,而resilience4j以裝飾器的方式提供對函數(shù)式接口、lambda表達(dá)式等的嵌套裝飾,因此你可以用簡潔的方式組合多種高可用機(jī)制

          • Hystrix的頻次統(tǒng)計采用滑動窗口的方式,而resilience4j采用環(huán)狀緩沖區(qū)的方式

          • 關(guān)于熔斷器在半開狀態(tài)時的狀態(tài)轉(zhuǎn)換,Hystrix僅使用一次執(zhí)行判定是否進(jìn)行狀態(tài)轉(zhuǎn)換,而resilience4j則采用可配置的執(zhí)行次數(shù)與閾值,來決定是否進(jìn)行狀態(tài)轉(zhuǎn)換,這種方式提高了熔斷機(jī)制的穩(wěn)定性

          • 關(guān)于隔離機(jī)制,Hystrix提供基于線程池和信號量的隔離,而resilience4j只提供基于信號量的隔離


          有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

          歡迎大家關(guān)注Java之道公眾號


          好文章,我在看??

          瀏覽 71
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  夜夜爽夜夜 | A片在线免费看 | 天天日天天干成人影音 | 无码中文日韩 | 色老板在线视频永久免费 |