微服務(wù)架構(gòu)開(kāi)發(fā)實(shí)戰(zhàn):什么是微服務(wù)的熔斷機(jī)制和熔斷的意義
什么是微服務(wù)的熔斷機(jī)制
在2017年2月1日,GitLab公司的運(yùn)維人員就出現(xiàn)過(guò)這樣的事故。當(dāng)時(shí)運(yùn)維人員在進(jìn)行數(shù)據(jù)庫(kù)維護(hù)時(shí),通過(guò)執(zhí)行rm -rf命令,刪除了約300GB生產(chǎn)環(huán)境數(shù)據(jù)。由于數(shù)據(jù)備份失效,導(dǎo)致整個(gè)網(wǎng)站宕機(jī)數(shù)十個(gè)小時(shí)。
自2017年5月12日起,全球范圍內(nèi)爆發(fā)基于Windows網(wǎng)絡(luò)共享協(xié)議進(jìn)行攻擊傳播的蠕蟲(chóng)惡意代碼,這是不法分子通過(guò)改造之前泄露的NSA黑客武器庫(kù)中“永恒之藍(lán)”攻擊程序發(fā)起的網(wǎng)絡(luò)攻擊事件,用戶(hù)只要開(kāi)機(jī)上網(wǎng)就可被攻擊。短短幾個(gè)小時(shí)內(nèi),包括英國(guó)、俄羅斯、整個(gè)歐洲及國(guó)內(nèi)多個(gè)高校校內(nèi)網(wǎng)、大型企業(yè)內(nèi)網(wǎng)和政府機(jī)構(gòu)專(zhuān)網(wǎng)遭到了攻擊,被勒索支付高額贖金才能解密恢復(fù)文件,對(duì)重要數(shù)據(jù)造成嚴(yán)重的損失。
可見(jiàn)信息系統(tǒng)的安全是一個(gè)無(wú)法忽視的問(wèn)題。無(wú)論是個(gè)人還是組織,即便是最簡(jiǎn)單的系統(tǒng),都需要考慮安全防護(hù)的措施。服務(wù)的熔斷機(jī)制就是一種對(duì)網(wǎng)站進(jìn)行防護(hù)的措施。

服務(wù)熔斷的定義
對(duì)于“熔斷”一詞,大家應(yīng)該都不會(huì)陌生,在中國(guó)股市,就曾經(jīng)在2016年1月1日至2016年1月8日期間,實(shí)施過(guò)兩次熔斷機(jī)制。在微服務(wù)架構(gòu)中,服務(wù)熔斷本質(zhì)上與股市的熔斷機(jī)制并無(wú)差異,其出發(fā)點(diǎn)都是為了更好地控制風(fēng)險(xiǎn)。
服務(wù)熔斷也稱(chēng)服務(wù)隔離或過(guò)載保護(hù)。在微服務(wù)應(yīng)用中,服務(wù)存在一定的依賴(lài)關(guān)系,形成一定的依賴(lài)鏈,如果某個(gè)目標(biāo)服務(wù)調(diào)用慢或者有大量超時(shí),造成服務(wù)不可用,間接導(dǎo)致其他的依賴(lài)服務(wù)不可用,最嚴(yán)重的可能會(huì)阻塞整條依賴(lài)鏈,最終導(dǎo)致業(yè)務(wù)系統(tǒng)崩潰(又稱(chēng)雪崩效應(yīng))。此時(shí),對(duì)該服務(wù)的調(diào)用執(zhí)行熔斷,對(duì)于后續(xù)請(qǐng)求,不再繼續(xù)調(diào)用該目標(biāo)服務(wù),而是直接返回,從而可以快速釋放資源。等到目標(biāo)服務(wù)情況好轉(zhuǎn)后,則可恢復(fù)其調(diào)用。

斷路器
斷路器(Circuit Breaker)本身是一個(gè)電子硬件產(chǎn)品,是電器中一個(gè)重要組成部分。斷路器可用來(lái)分配電能,不用頻繁地啟動(dòng)異步電動(dòng)機(jī),對(duì)電源線(xiàn)路及電動(dòng)機(jī)等實(shí)行保護(hù),當(dāng)它們發(fā)生嚴(yán)重的過(guò)載或者短路及欠壓等故障時(shí)能自動(dòng)切斷電路,其功能相當(dāng)于熔斷器式開(kāi)關(guān)與過(guò)欠熱繼電器等的組合。
在微服務(wù)架構(gòu)中,也存在所謂斷路器或者實(shí)現(xiàn)斷路器模式的軟件構(gòu)件。將受保護(hù)的服務(wù)封裝在一個(gè)可以監(jiān)控故障的斷路器對(duì)象中,當(dāng)故障達(dá)到一定門(mén)限時(shí),斷路器將跳閘,所有后繼調(diào)用將不會(huì)發(fā)往受保護(hù)的服務(wù)而由斷路器對(duì)象之間返回錯(cuò)誤。對(duì)于需要更長(zhǎng)時(shí)間解決的故障問(wèn)題,由于不斷重試沒(méi)有太大意義了,所以就可以使用斷路器模式。
路器模式
Michael Nygard在他編著的書(shū)Release lt!中推廣了斷路器模式。斷路器模式致力于防止應(yīng)用程序反復(fù)嘗試執(zhí)行可能失敗的操作。允許它繼續(xù)而不用等待故障被修復(fù),或者在確定故障持續(xù)的時(shí)候浪費(fèi)CPU周期。斷路器模式還使應(yīng)用程序能夠檢測(cè)故障是否已解決。如果問(wèn)題似乎已經(jīng)解決,應(yīng)用程序可以嘗試調(diào)用該操作。
斷路器模式的目的不同于重試模式。重試模式使應(yīng)用程序可以在預(yù)期成功的情況下重試操作。
斷路器模式阻止應(yīng)用程序執(zhí)行可能失敗的操作。應(yīng)用程序可以通過(guò)使用重試模式及斷路器模式來(lái)進(jìn)行組合。然而,如果斷路器指示故障不是瞬態(tài)的,則重試邏輯應(yīng)該對(duì)斷路器返回異常,并放棄重試嘗試。
斷路器充當(dāng)可能失敗的操作的代理。代理應(yīng)監(jiān)視最近發(fā)生的故障的數(shù)量,并使用此信息來(lái)決定是允許操作繼續(xù),還是立即返回異常。
代理可以作為一個(gè)狀態(tài)機(jī)來(lái)實(shí)現(xiàn),其狀態(tài)模擬一個(gè)電氣斷路器的功能。
·關(guān)閉(Closed):來(lái)自應(yīng)用程序的請(qǐng)求被路由到操作。代理維護(hù)最近失敗次數(shù)的計(jì)數(shù),如果對(duì)操作的調(diào)用不成功,代理將增加此計(jì)數(shù)。如果在給定的時(shí)間段內(nèi)最近的失敗次數(shù)超過(guò)了指定的閾值,則代理被置于打開(kāi)狀態(tài)。此時(shí)代理啟動(dòng)一個(gè)超時(shí)定時(shí)器,當(dāng)這個(gè)定時(shí)器超時(shí)時(shí),代理被置于半開(kāi)狀態(tài)。超時(shí)定時(shí)器的目的是讓系統(tǒng)有時(shí)間來(lái)解決導(dǎo)致失敗的問(wèn)題,然后再允許應(yīng)用程序嘗試再次執(zhí)行操作。
·打開(kāi)(Open):來(lái)自應(yīng)用程序的請(qǐng)求立即失敗,并將異常返回給應(yīng)用程序。
·半打開(kāi) Half-Open?來(lái)自應(yīng)用程序的有限數(shù)量的請(qǐng)求被允許通過(guò)并調(diào)用操作。如果這些請(qǐng)求成功,則認(rèn)為先前引起故障的故障已被修復(fù),斷路器切換到關(guān)閉狀態(tài)(故障計(jì)數(shù)器被重置)。如果有任何請(qǐng)求失敗,斷路器會(huì)認(rèn)為故障仍然存在,因此它將恢復(fù)到打開(kāi)狀態(tài),并重新啟動(dòng)超時(shí)定時(shí)器,以使系統(tǒng)有一段時(shí)間從故障中恢復(fù)。半開(kāi)狀態(tài)有助于防止恢復(fù)服務(wù)突然被請(qǐng)求淹沒(méi)。當(dāng)服務(wù)恢復(fù)時(shí),它可能能夠支持有限的請(qǐng)求量,直到恢復(fù)完成,但在進(jìn)行恢復(fù)時(shí),大量工作可能導(dǎo)致服務(wù)超時(shí)或再次失敗。

圖15-1展示的是 Microsoft Azure關(guān)于斷路器狀態(tài)的設(shè)計(jì)圖。在該圖中,關(guān)閉狀態(tài)使用的故障計(jì)數(shù)器是基于時(shí)間的。它會(huì)定期自動(dòng)重置。如果遇到偶爾的故障,這有助于防止斷路器進(jìn)入打開(kāi)狀態(tài)。只有在指定的時(shí)間間隔內(nèi)發(fā)生指定次數(shù)的故障時(shí),才會(huì)使斷路器跳閘到斷路狀態(tài)的故障閾值。
半打開(kāi)狀態(tài)使用的計(jì)數(shù)器記錄調(diào)用操作的成功嘗試次數(shù)。在指定次數(shù)的連續(xù)操作調(diào)用成功后,斷路器恢復(fù)到關(guān)閉狀態(tài)。如果調(diào)用失敗,斷路器將立即進(jìn)入打開(kāi)狀態(tài),下一次進(jìn)入半打開(kāi)狀態(tài)時(shí),成功計(jì)數(shù)器將被重置。
系統(tǒng)恢復(fù)的方式可以通過(guò)恢復(fù)或重新啟動(dòng)故障組件或者修復(fù)網(wǎng)絡(luò)連接來(lái)進(jìn)行外部處理。
Spring Cloud Hystrix可以用來(lái)處理依賴(lài)隔離,實(shí)現(xiàn)熔斷機(jī)制。其主要的類(lèi)有HystrixCommand和HystrixObservableCommand等。
熔斷的意義
在軟件系統(tǒng)中,不可能百分之百保證不存在故障。為了保障整體系統(tǒng)的可用性和容錯(cuò)性,需要將服務(wù)實(shí)例部署在云或分布式系統(tǒng)環(huán)境中。
所以,我們必須承認(rèn)服務(wù)一定是會(huì)出現(xiàn)故障的,只有清醒地認(rèn)識(shí)到服務(wù)系統(tǒng)的本質(zhì),才能更好地去設(shè)計(jì)系統(tǒng),來(lái)不斷提高服務(wù)的可用性和容錯(cuò)性。
微服務(wù)的故障不可避免,這些故障可能是瞬時(shí)的,如慢的網(wǎng)絡(luò)連接、超時(shí),資源過(guò)度使用而暫時(shí)不可用;也可能是不容易預(yù)見(jiàn)的突發(fā)事件的情況下需要更長(zhǎng)時(shí)間來(lái)糾正的故障。針對(duì)分布式服務(wù)的容錯(cuò),通常的做法有兩種。
·重試機(jī)制,對(duì)于預(yù)期的短暫故障問(wèn)題,通過(guò)重試模式是可以解決的。
·斷路器模式。
斷路器模式所帶來(lái)的好處
斷路器模式提供了穩(wěn)定性,同時(shí)系統(tǒng)從故障中恢復(fù)并最大限度地減少對(duì)性能的影響。通過(guò)快速拒絕可能失敗的操作的請(qǐng)求,而不是等待操作超時(shí)或永不返回,可以幫助維持系統(tǒng)的響應(yīng)時(shí)間。如果斷路器每次改變狀態(tài)都會(huì)產(chǎn)生一個(gè)事件,這個(gè)信息可以用來(lái)監(jiān)測(cè)斷路器所保護(hù)的系統(tǒng)部分的健康狀況,或者在斷路器跳到斷路狀態(tài)時(shí)提醒管理員。
斷路器模式通常是可定制的,可以根據(jù)可能的故障類(lèi)型進(jìn)行調(diào)整。例如,可以自定義定時(shí)器的超時(shí)。您可以先將斷路器置于“打開(kāi)”狀態(tài)幾秒,然后如果故障仍未解決,則將超時(shí)增加到幾分鐘。
斷路器模式的功能
一般來(lái)說(shuō),斷路器具備如下功能。
1.異常處理
通過(guò)斷路器調(diào)用操作的應(yīng)用程序必須能夠處理在操作不可用時(shí)可能被拋出的異常,該類(lèi)異常的處理方式都是應(yīng)用程序特有的。例如,應(yīng)用程序會(huì)暫時(shí)降級(jí)其功能,調(diào)用備選操作嘗試相同的任務(wù)或獲取相同的數(shù)據(jù),或者將異常通知給用戶(hù)讓其稍后重試。
一個(gè)請(qǐng)求可能由于各種原因失敗,其中有一些可能表明故障嚴(yán)重類(lèi)型高于其他故障。例如,一個(gè)請(qǐng)求可能由于需要幾分鐘才能恢復(fù)的遠(yuǎn)程服務(wù)崩潰而失敗,也可能由于服務(wù)暫時(shí)超載造成的超時(shí)而失敗。斷路器有可能可以檢查發(fā)生的異常類(lèi)型,并根據(jù)這些異常類(lèi)型來(lái)調(diào)整策略。例如,促使切換到打開(kāi)狀態(tài)的服務(wù)超時(shí)異常個(gè)數(shù)要遠(yuǎn)多于服務(wù)完全不可用導(dǎo)致的故障個(gè)數(shù)。
2.日志記錄
一個(gè)斷路器應(yīng)記錄所有失敗的請(qǐng)求(如果可能的話(huà)記錄所有請(qǐng)求),以使管理員能夠監(jiān)視它封裝下受保護(hù)操作的運(yùn)行狀態(tài)。
3.可恢復(fù)
應(yīng)該把斷路器配置成與受保護(hù)操作最匹配的恢復(fù)模式。例如,如果設(shè)定斷路器為打開(kāi)狀態(tài)的時(shí)間需要很長(zhǎng),即使底層操作故障已經(jīng)解決,它還會(huì)返回錯(cuò)誤。如果打開(kāi)狀態(tài)切換到半打開(kāi)態(tài)過(guò)快,底層操作故障還沒(méi)解決,它就會(huì)再次調(diào)用受保護(hù)操作。
4.測(cè)試失敗的操作
在打開(kāi)狀態(tài)下,斷路器可能不用計(jì)時(shí)器來(lái)確定何時(shí)切換到半打開(kāi)狀態(tài),而是通過(guò)周期性地查驗(yàn)遠(yuǎn)程服務(wù)或資源以確定它是否已經(jīng)再次可用。這個(gè)檢查可能采用上次失敗的操作的形式,也可以使用由遠(yuǎn)程服務(wù)提供的專(zhuān)門(mén)用于測(cè)試服務(wù)健康狀況的特殊操作。
5.手動(dòng)復(fù)位
在一個(gè)系統(tǒng)中,如果一個(gè)失敗的操作的恢復(fù)時(shí)間差異很大,則提供一個(gè)手動(dòng)復(fù)位選項(xiàng),以使管理員能夠強(qiáng)行關(guān)閉斷路器及重置故障計(jì)數(shù)器。同樣,如果受保護(hù)操作暫時(shí)不可用,管理員可以強(qiáng)制斷路器進(jìn)入打開(kāi)狀態(tài)并重新啟動(dòng)超時(shí)定時(shí)器。
6.并發(fā)
同—斷路器可以被應(yīng)用程序的大量并發(fā)實(shí)例訪(fǎng)問(wèn)。斷路器實(shí)現(xiàn)不應(yīng)阻塞并發(fā)請(qǐng)求或?qū)γ恳徽?qǐng)求增加額外開(kāi)銷(xiāo)。
7.加速斷路
有時(shí)失敗響應(yīng)對(duì)于斷路器實(shí)現(xiàn)來(lái)說(shuō)包含足夠的信息用于判定是否應(yīng)當(dāng)立即跳閘,并保持最小時(shí)間量的跳閘狀態(tài)。例如,從過(guò)載共享資源的錯(cuò)誤響應(yīng)中可能指示了“不推薦立即重試”,那么應(yīng)用程序應(yīng)當(dāng)隔幾分鐘之后再進(jìn)行重試,而不應(yīng)該立即重試。
如果一個(gè)請(qǐng)求的服務(wù)對(duì)于特定Web服務(wù)器不可用,可以返回HTTP協(xié)議定義的“HTTP 503Service Unavailable”響應(yīng)。該響應(yīng)可以包含額外的信息,如預(yù)期延遲持續(xù)時(shí)間。
8.重試失敗請(qǐng)求
在打開(kāi)狀態(tài)下,斷路器可以不僅僅是快速地簡(jiǎn)單返回失敗,而是可以將每個(gè)請(qǐng)求的詳細(xì)信息記錄日志,并在遠(yuǎn)程資源或服務(wù)重新可用時(shí)安排重試。
本篇文章內(nèi)容給大家講解的是什么是微服務(wù)的熔斷機(jī)制和熔斷的意義
下篇文章給大家講解的是熔斷與降級(jí)的區(qū)別、如何集成 Hystrix;
覺(jué)得文章不錯(cuò)的朋友可以轉(zhuǎn)發(fā)此文關(guān)注小編;
感謝大家的支持!
本文就是愿天堂沒(méi)有BUG給大家分享的內(nèi)容,大家有收獲的話(huà)可以分享下,想學(xué)習(xí)更多的話(huà)可以到微信公眾號(hào)里找我,我等你哦。
