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

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

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

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