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

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

          共 3586字,需瀏覽 8分鐘

           ·

          2020-03-16 23:21

          0163e1acfc3efb8def2d57d79c68cc56.webp

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

          270240e0f767166b9a5bdc3ba3b716df.webp

          afb7bf8f6b4273f8475a44f574dbd4f1.webp

          7d09170f5e8941b67ffb7f519fcca1a6.webp

          631ea4b4aaf707321b23673a73f14059.webp

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

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

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

          為什么需要熔斷

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

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

          b4ad8a3b70038c048b1ea1f1e3bee45e.webp

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

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

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

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

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

          b536fd3f00379802a3741ef44aa0e7ab.webp

          b250f0e77ba0b9cfcbd97a52c4839bb6.webp

          1057eb4153db2bc1c3c592ca9875bb10.webp

          22e8f067073f1063328c3a359192a6a3.webp

          68f79927492fdb112f4bb75743057d22.webp9e284915c19e6652344d19cbb829637b.webp

          熔斷器模式

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

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

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

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

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

          • 關(guān)閉

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

          • 開啟

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

          • 半開啟

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

          860e8a6611239b0e086e7d67c6ab4e76.webp

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

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

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

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

          672301618f6d0aaffd44caa43f156af9.webp

          0ae6e85f6692a4b68f96020522022b84.webp

          2d83802d32bbf1fc20d3ecdcc3934306.webp

          a5c1e29f5205bdad230104ccf9f1c091.webp

          熔斷工具

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

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

          Hystrix

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

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

          006771abf168b0eef526fb8a77ee34a2.webp

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

          resilience4j

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

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

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

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

          • 關(guān)于熔斷器在半開狀態(tài)時(shí)的狀態(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ù)等多個(gè)維度來幫助用戶保護(hù)服務(wù)的穩(wěn)定性。

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

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

          • 多樣化的流量控制

          • 熔斷降級

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

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

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

          1204fc0f51e3559fbb5f59157bbda1b2.webp

          dcbec196872503606c6eb98043f30ba6.webp

          7c0c4894fbfebbb2d3a7623b904319fc.webp

          4413ef2bbd5c113010d77a3f8cb28be9.webp

          3efd20f1521c7fdc57110e39155f7095.webp

          擴(kuò)展知識(shí)

          熔斷機(jī)制

          指的是在股票市場的交易時(shí)間中,當(dāng)價(jià)格波動(dòng)的幅度達(dá)到某一個(gè)限定的目標(biāo)(熔斷點(diǎn))時(shí),對其暫停交易一段時(shí)間的機(jī)制。此機(jī)制如同保險(xiǎn)絲在電流過大時(shí)候熔斷比較相似,故而得名。

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

          美國熔斷機(jī)制

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

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

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

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

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

          關(guān)于作者漫話編程,是一個(gè)通過漫畫+音頻的形式講解枯燥的編程知識(shí)的公眾號。致力于讓編程變得更有樂趣。


          推薦閱讀:


          10c35518ba4956021ea0a5790f7a1020.webp喜歡我可以給我設(shè)為星標(biāo)哦10c35518ba4956021ea0a5790f7a1020.webp

          2d38f181f2a9d7ec363b61cb7352ff03.webp

          好文章,我?在看?

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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  国产人妻精品一区二区三水牛影视 | 中国 免费XXXX18 | 欧美成人性爱视频网站 | 粉嫩小泬BBBB欣赏 | 午夜操逼图 |