<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>

          【漫話】如何給女朋友解釋什么是熔斷?

          共 3433字,需瀏覽 7分鐘

           ·

          2020-03-20 23:23

          f9ddf1d4da84da436e632a5322bd30f5.webp

          最近比較忙,白天上班,晚上還得面試,都沒有時間關(guān)注新聞。某天晚上剛剛結(jié)束一個電話面試,正準(zhǔn)備寫面試評價,女朋友拿著手機(jī)走過來,滿臉疑惑的問我:

          8b3b64e0a027894145c7d9d19a71ac97.webp

          f514a546cad8f6b932a860fd29f72766.webp

          c98111baae39593ff95733ecfa3aeab9.webp

          65fcafca524b2cd595e65afb72280b6e.webp

          在《如何給女朋友解釋為什么雙十一無法修改收貨地址》中我們介紹過關(guān)于QPS、RT、并發(fā)用戶數(shù)以及最大線程數(shù)等知識。我們知道,如果一個軟件系統(tǒng)的并發(fā)請求數(shù)目超過了系統(tǒng)的最佳線程數(shù),那么就會導(dǎo)致激烈的資源競爭,隨著資源的匱乏甚至枯竭,整個系統(tǒng)也就面臨著災(zāi)難。

          所以,很多軟件系統(tǒng)為了保證即使在出現(xiàn)并發(fā)用戶數(shù)>最佳線程數(shù)時,也不至于導(dǎo)致整個萬網(wǎng)站崩潰,都會采用一些技術(shù)手段來避免發(fā)生系統(tǒng)性災(zāi)難。這些技術(shù)中比較典型的就是限流、降級和熔斷。

          這次就來講講什么是服務(wù)熔斷,以及如何在微服務(wù)架構(gòu)中做服務(wù)熔斷。

          為什么需要熔斷

          現(xiàn)在很多網(wǎng)站的背后都是一個龐大的分布式系統(tǒng),多個系統(tǒng)之間的交互大多數(shù)都是采用RPC的方式,但是因?yàn)槭沁h(yuǎn)程調(diào)用,所以被調(diào)用者的服務(wù)的可用情況其實(shí)是不可控的。

          而越是龐大的系統(tǒng),上下游的調(diào)用鏈就會越長,而如果在一個很長的調(diào)用鏈中,某一個服務(wù)由于某種原因?qū)е马憫?yīng)時間很長,或者完全無響應(yīng),那么就可能把整個分布式系統(tǒng)都拖垮。

          ce73cbce0782b84e77acedad0fa7babd.webp

          以上調(diào)用鏈,如果其中某一個服務(wù)由于自身原因?qū)е马憫?yīng)很慢,那么就可能導(dǎo)致上游的服務(wù)影響也很慢,這樣循環(huán)往復(fù),就會導(dǎo)致整個系統(tǒng)全線崩潰,這就是服務(wù)雪崩

          其實(shí),在分布式系統(tǒng)中,為了保證整體服務(wù)可用性和一致性,很多系統(tǒng)都會引入重試機(jī)制,在有些情況下,重試其實(shí)是可以解決問題的,比如網(wǎng)絡(luò)問題等,都可以通過重試來解決。

          但是,有些情況下,重試并不能解決問題,返而會加劇問題的嚴(yán)重性,比如下游系統(tǒng)因?yàn)檎埱罅刻螅瑢?dǎo)致CPU已經(jīng)被打滿,說著數(shù)據(jù)庫連接池被占滿,這時候上游系統(tǒng)調(diào)不通就會不斷進(jìn)行重試,這種重試請求,對于下游系統(tǒng)來說,無疑是雪上加霜,給下游系統(tǒng)造成二次傷害。

          而分布式系統(tǒng),大多數(shù)的服務(wù)雪崩也都是因?yàn)椴粩嘀卦噷?dǎo)致的,這種重試有可能是框架級別的自動重試、有可能是代碼級別的重試邏輯、還有可能是用戶的主動重試。

          有些重試是無法避免的,而且如果因?yàn)榉乐寡┍溃筒辉O(shè)計重試機(jī)制,也是一種因噎廢食。

          ebef206172d86738fa04fa8e51db9de7.webp

          698ae84457a2611d34f2cbe9a146f52a.webp

          21592a3972dfd2b3f5d3a2385ab58739.webp

          0766a3061c3a0235900555cb8bc3128d.webp

          93a85405d9a7b02ab9b1c7f36a822c0f.webp7855a9b279deb7b14a37513fb9abfc94.webp

          熔斷器模式

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

          假設(shè)有個應(yīng)用程序每秒會與數(shù)據(jù)庫溝通數(shù)百次,此時數(shù)據(jù)庫突然發(fā)生了錯誤,程序員并不會希望在錯誤時還不斷地訪問數(shù)據(jù)庫。因此會想辦法直接處理這個錯誤,并進(jìn)入正常的結(jié)束程序。簡單來說,

          熔斷器會偵測錯誤并且“預(yù)防”應(yīng)用程序不斷地重試調(diào)用一個近乎毫無回應(yīng)的服務(wù)(除非該服務(wù)已經(jīng)安全到可重試連線了)。

          熔斷器模式是方志微服務(wù)系統(tǒng)雪崩的一種重要手段。

          一個比較完善的熔斷器,一般包含三種狀態(tài):

          • 關(guān)閉

            • 熔斷器在默認(rèn)情況下下是呈現(xiàn)關(guān)閉的狀態(tài),而熔斷器本身帶有計數(shù)功能,每當(dāng)錯誤發(fā)生一次,計數(shù)器也就會進(jìn)行“累加”的動作,到了一定的錯誤發(fā)生次數(shù)斷路器就會被“開啟”,這個時候亦會在內(nèi)部啟用一個計時器,一旦時間到了就會切換成半開啟的狀態(tài)。

          • 開啟

            • 在開啟的狀態(tài)下任何請求都會“直接”被拒絕并且拋出異常訊息。

          • 半開啟

            • 在此狀態(tài)下斷路器會允許部分的請求,如果這些請求都能成功通過,那么就意味著錯誤已經(jīng)不存在,則會被切換回關(guān)閉狀態(tài)并重置計數(shù)。倘若請求中有“任一”的錯誤發(fā)生,則會回復(fù)到“開啟”狀態(tài),并且重新計時,給予系統(tǒng)一段休息時間。

          0efd648a9822008c6b71cf9eab234e7b.webp

          上圖是熔斷器的三種狀態(tài)的轉(zhuǎn)換情況。

          如果在微服務(wù)系統(tǒng)的調(diào)用過程中,引入熔斷器,那么整個系統(tǒng)將天然具備以下能力:

          • 快速失敗:當(dāng)因?yàn)檎{(diào)用遠(yuǎn)程服務(wù)失敗次數(shù)過多,熔斷器開啟時,上游服務(wù)對于下游服務(wù)的調(diào)用就會快速失敗,這樣可以避免上游服務(wù)被拖垮。

          • 無縫恢復(fù):因?yàn)槿蹟嗥骺梢远ㄆ跈z查下游系統(tǒng)是否恢復(fù),一旦恢復(fù)就可以重新回到關(guān)閉狀態(tài),所有請求便可以正常請求到下游服務(wù)。使得系統(tǒng)不需要認(rèn)為干預(yù)。

          5e24686d287dd3e03a4a7a8943d323d3.webp

          397560eb4c8b79805e02840440a6027f.webp

          64494df1ca19ae46ce9c0e01428a86b3.webp

          0be448a135e386a4591dd90287087af9.webp

          熔斷工具

          熔斷器為了實(shí)現(xiàn)快速失敗和無縫恢復(fù),就需要進(jìn)行服務(wù)調(diào)用次數(shù)統(tǒng)計、服務(wù)調(diào)用切斷等操作,如果想要自己實(shí)現(xiàn)一個熔斷器其實(shí)也是可以的。

          但是,市面上有一些框架已經(jīng)幫我們做了這些事情。如Hystrix和Sentinel、resilience4j等。

          Hystrix

          Hystrix(https://github.com/Netflix/Hystrix )是Netflix開源的一款容錯系統(tǒng),能幫助使用者碼出具備強(qiáng)大的容錯能力和魯棒性的程序。提供降級,熔斷等功能。

          但是,在2018年底,Hystrix在其Github主頁宣布,不再開放新功能,推薦開發(fā)者使用其他仍然活躍的開源項(xiàng)目。

          1d6627ccded3810f016197e7e77d1e05.webp

          Hystrix雖然不再開發(fā)新功能 ,但對用戶的影響應(yīng)該不會太大,一是因?yàn)殚_發(fā)者可以繼續(xù)使用Hystrix的最新版本1.5.18

          resilience4j

          Hystrix停更之后,Netflix官方推薦使用resilience4j(https://github.com/resilience4j/resilience4j ),它是一個輕量、易用、可組裝的高可用框架,支持熔斷、高頻控制、隔離、限流、限時、重試等多種高可用機(jī)制。

          與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只提供基于信號量的隔離

          Sentinel

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

          Hystrix 的關(guān)注點(diǎn)在于以隔離和熔斷為主的容錯機(jī)制,超時或被熔斷的調(diào)用將會快速失敗,并可以提供 fallback 機(jī)制。

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

          • 多樣化的流量控制

          • 熔斷降級

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

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

          下圖是Sentinel的GitHub主頁中關(guān)于Sentinel和Hystrix的對比:

          2a58244cbf45b05bf812b32b9edcef4b.webp

          2d60bc1af3edd5b5e2af76a580a6047b.webp

          a3efb070bd6f64eaf56b0cc2cd8408ab.webp

          6728131efd1fda7efba6b510ecf01b82.webp

          e130af6f787943585b749e7999a6e5c7.webp

          擴(kuò)展知識

          熔斷機(jī)制

          指的是在股票市場的交易時間中,當(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ò)大。

          美國熔斷機(jī)制

          美國指數(shù)熔斷機(jī)制的基準(zhǔn)指數(shù)為標(biāo)普500,單項(xiàng)跌幅閾值為7%、13%、20%。當(dāng)指數(shù)較前一天收盤點(diǎn)位下跌7%、13%時,全美證券市場交易將暫停15分鐘,當(dāng)指數(shù)較前一天收盤點(diǎn)位下跌20%時,當(dāng)天交易停止。2010年美股又開始實(shí)行個股熔斷機(jī)制。

          熔斷機(jī)制最早由美國的紐約股票交易所在1987年提出,以避免發(fā)生類似“黑色星期一”的股災(zāi)。此時的熔斷機(jī)制僅針對大盤指數(shù)進(jìn)行熔斷。1997年10月27日,道瓊斯工業(yè)指數(shù)暴跌7.18%,收于7161.15點(diǎn),這是熔斷機(jī)制在1988年引入之后第一次被觸發(fā)。

          美股第二次觸發(fā)熔斷機(jī)制是在美東時間2020年3月9日,受2019冠狀病毒病疫情和油價崩盤影響,3月9日上午9點(diǎn)34分,標(biāo)普500指數(shù)開盤后跌7%觸發(fā)第一層熔斷機(jī)制,暫停交易15分鐘。3天后,3月12日,標(biāo)普500指數(shù)開盤后短時間內(nèi)跌幅超過7%再次觸發(fā)第一層熔斷機(jī)制。

          中國大陸熔斷機(jī)制

          中華人民共和國自2016年起開始在上海證券交易所、深圳證券交易所和中國金融期貨交易所同時試行熔斷機(jī)制。其熔斷的基準(zhǔn)指數(shù)是滬深300指數(shù),設(shè)置5%、7%兩檔指數(shù)熔斷閾值,漲跌皆熔斷。


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

          歡迎大家關(guān)注程序IT圈公眾號


          好文章,我在看??

          瀏覽 36
          點(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片电影A片录像 | 操批免费视频 |