微服務架構開發實戰:什麼是微服務的熔斷機制和熔斷的意義

什麼是微服務的熔斷機制

在2017年2月1日,GitLab公司的運維人員就出現過這樣的事故。當時運維人員在進行數據庫維護時,通過執行rm -rf命令,刪除了約300GB生產環境數據。由於數據備份失效,導致整個網站宕機數十個小時。

自2017年5月12日起,全球範圍內爆發基於Windows網絡共享協議進行攻擊傳播的蠕蟲惡意代碼,這是不法分子通過改造之前洩露的NSA黑客武器庫中“永恆之藍”攻擊程序發起的網絡攻擊事件,用戶只要開機上網就可被攻擊。短短几個小時內,包括英國、俄羅斯、整個歐洲及國內多個高校校內網、大型企業內網和政府機構專網遭到了攻擊,被勒索支付高額贖金才能解密恢復文件,對重要數據造成嚴重的損失。

可見信息系統的安全是一個無法忽視的問題。無論是個人還是組織,即便是最簡單的系統,都需要考慮安全防護的措施。服務的熔斷機制就是一種對網站進行防護的措施。

微服務架構開發實戰:什麼是微服務的熔斷機制和熔斷的意義

服務熔斷的定義

對於“熔斷”一詞,大家應該都不會陌生,在中國股市,就曾經在2016年1月1日至2016年1月8日期間,實施過兩次熔斷機制。在微服務架構中,服務熔斷本質上與股市的熔斷機制並無差異,其出發點都是為了更好地控制風險。

服務熔斷也稱服務隔離或過載保護。在微服務應用中,服務存在一定的依賴關係,形成一定的依賴鏈,如果某個目標服務調用慢或者有大量超時,造成服務不可用,間接導致其他的依賴服務不可用,最嚴重的可能會阻塞整條依賴鏈,最終導致業務系統崩潰(又稱雪崩效應)。此時,對該服務的調用執行熔斷,對於後續請求,不再繼續調用該目標服務,而是直接返回,從而可以快速釋放資源。等到目標服務情況好轉後,則可恢復其調用。

微服務架構開發實戰:什麼是微服務的熔斷機制和熔斷的意義

斷路器

斷路器(Circuit Breaker)本身是一個電子硬件產品,是電器中一個重要組成部分。斷路器可用來分配電能,不用頻繁地啟動異步電動機,對電源線路及電動機等實行保護,當它們發生嚴重的過載或者短路及欠壓等故障時能自動切斷電路,其功能相當於熔斷器式開關與過欠熱繼電器等的組合。

在微服務架構中,也存在所謂斷路器或者實現斷路器模式的軟件構件。將受保護的服務封裝在一個可以監控故障的斷路器對象中,當故障達到一定門限時,斷路器將跳閘,所有後繼調用將不會發往受保護的服務而由斷路器對象之間返回錯誤。對於需要更長時間解決的故障問題,由於不斷重試沒有太大意義了,所以就可以使用斷路器模式。

路器模式

Michael Nygard在他編著的書Release lt!中推廣了斷路器模式。斷路器模式致力於防止應用程序反覆嘗試執行可能失敗的操作。允許它繼續而不用等待故障被修復,或者在確定故障持續的時候浪費CPU週期。斷路器模式還使應用程序能夠檢測故障是否已解決。如果問題似乎已經解決,應用程序可以嘗試調用該操作。

斷路器模式的目的不同於重試模式。重試模式使應用程序可以在預期成功的情況下重試操作。

斷路器模式阻止應用程序執行可能失敗的操作。應用程序可以通過使用重試模式及斷路器模式來進行組合。然而,如果斷路器指示故障不是瞬態的,則重試邏輯應該對斷路器返回異常,並放棄重試嘗試。

斷路器充當可能失敗的操作的代理。代理應監視最近發生的故障的數量,並使用此信息來決定是允許操作繼續,還是立即返回異常。

代理可以作為一個狀態機來實現,其狀態模擬一個電氣斷路器的功能。

·關閉(Closed):來自應用程序的請求被路由到操作。代理維護最近失敗次數的計數,如果對操作的調用不成功,代理將增加此計數。如果在給定的時間段內最近的失敗次數超過了指定的閾值,則代理被置於打開狀態。此時代理啟動一個超時定時器,當這個定時器超時時,代理被置於半開狀態。超時定時器的目的是讓系統有時間來解決導致失敗的問題,然後再允許應用程序嘗試再次執行操作。

·打開(Open):來自應用程序的請求立即失敗,並將異常返回給應用程序。

·半打開 Half-Open 來自應用程序的有限數量的請求被允許通過並調用操作。如果這些請求成功,則認為先前引起故障的故障已被修復,斷路器切換到關閉狀態(故障計數器被重置)。如果有任何請求失敗,斷路器會認為故障仍然存在,因此它將恢復到打開狀態,並重新啟動超時定時器,以使系統有一段時間從故障中恢復。半開狀態有助於防止恢復服務突然被請求淹沒。當服務恢復時,它可能能夠支持有限的請求量,直到恢復完成,但在進行恢復時,大量工作可能導致服務超時或再次失敗。

微服務架構開發實戰:什麼是微服務的熔斷機制和熔斷的意義

圖15-1展示的是 Microsoft Azure關於斷路器狀態的設計圖。在該圖中,關閉狀態使用的故障計數器是基於時間的。它會定期自動重置。如果遇到偶爾的故障,這有助於防止斷路器進入打開狀態。只有在指定的時間間隔內發生指定次數的故障時,才會使斷路器跳閘到斷路狀態的故障閾值。

半打開狀態使用的計數器記錄調用操作的成功嘗試次數。在指定次數的連續操作調用成功後,斷路器恢復到關閉狀態。如果調用失敗,斷路器將立即進入打開狀態,下一次進入半打開狀態時,成功計數器將被重置。

系統恢復的方式可以通過恢復或重新啟動故障組件或者修復網絡連接來進行外部處理。

Spring Cloud Hystrix可以用來處理依賴隔離,實現熔斷機制。其主要的類有HystrixCommand和HystrixObservableCommand等。

熔斷的意義

在軟件系統中,不可能百分之百保證不存在故障。為了保障整體系統的可用性和容錯性,需要將服務實例部署在雲或分佈式系統環境中。

所以,我們必須承認服務一定是會出現故障的,只有清醒地認識到服務系統的本質,才能更好地去設計系統,來不斷提高服務的可用性和容錯性。

微服務的故障不可避免,這些故障可能是瞬時的,如慢的網絡連接、超時,資源過度使用而暫時不可用;也可能是不容易預見的突發事件的情況下需要更長時間來糾正的故障。針對分佈式服務的容錯,通常的做法有兩種。

·重試機制,對於預期的短暫故障問題,通過重試模式是可以解決的。

·斷路器模式。

斷路器模式所帶來的好處

斷路器模式提供了穩定性,同時系統從故障中恢復並最大限度地減少對性能的影響。通過快速拒絕可能失敗的操作的請求,而不是等待操作超時或永不返回,可以幫助維持系統的響應時間。如果斷路器每次改變狀態都會產生一個事件,這個信息可以用來監測斷路器所保護的系統部分的健康狀況,或者在斷路器跳到斷路狀態時提醒管理員。

斷路器模式通常是可定製的,可以根據可能的故障類型進行調整。例如,可以自定義定時器的超時。您可以先將斷路器置於“打開”狀態幾秒,然後如果故障仍未解決,則將超時增加到幾分鐘。

斷路器模式的功能

一般來說,斷路器具備如下功能。

1.異常處理

通過斷路器調用操作的應用程序必須能夠處理在操作不可用時可能被拋出的異常,該類異常的處理方式都是應用程序特有的。例如,應用程序會暫時降級其功能,調用備選操作嘗試相同的任務或獲取相同的數據,或者將異常通知給用戶讓其稍後重試。

一個請求可能由於各種原因失敗,其中有一些可能表明故障嚴重類型高於其他故障。例如,一個請求可能由於需要幾分鐘才能恢復的遠程服務崩潰而失敗,也可能由於服務暫時超載造成的超時而失敗。斷路器有可能可以檢查發生的異常類型,並根據這些異常類型來調整策略。例如,促使切換到打開狀態的服務超時異常個數要遠多於服務完全不可用導致的故障個數。

2.日誌記錄

一個斷路器應記錄所有失敗的請求(如果可能的話記錄所有請求),以使管理員能夠監視它封裝下受保護操作的運行狀態。

3.可恢復

應該把斷路器配置成與受保護操作最匹配的恢復模式。例如,如果設定斷路器為打開狀態的時間需要很長,即使底層操作故障已經解決,它還會返回錯誤。如果打開狀態切換到半打開態過快,底層操作故障還沒解決,它就會再次調用受保護操作。

4.測試失敗的操作

在打開狀態下,斷路器可能不用計時器來確定何時切換到半打開狀態,而是通過週期性地查驗遠程服務或資源以確定它是否已經再次可用。這個檢查可能採用上次失敗的操作的形式,也可以使用由遠程服務提供的專門用於測試服務健康狀況的特殊操作。

5.手動復位

在一個系統中,如果一個失敗的操作的恢復時間差異很大,則提供一個手動復位選項,以使管理員能夠強行關閉斷路器及重置故障計數器。同樣,如果受保護操作暫時不可用,管理員可以強制斷路器進入打開狀態並重新啟動超時定時器。

6.併發

同—斷路器可以被應用程序的大量併發實例訪問。斷路器實現不應阻塞併發請求或對每一請求增加額外開銷。

7.加速斷路

有時失敗響應對於斷路器實現來說包含足夠的信息用於判定是否應當立即跳閘,並保持最小時間量的跳閘狀態。例如,從過載共享資源的錯誤響應中可能指示了“不推薦立即重試”,那麼應用程序應當隔幾分鐘之後再進行重試,而不應該立即重試。

如果一個請求的服務對於特定Web服務器不可用,可以返回HTTP協議定義的“HTTP 503Service Unavailable”響應。該響應可以包含額外的信息,如預期延遲持續時間。

8.重試失敗請求

在打開狀態下,斷路器可以不僅僅是快速地簡單返回失敗,而是可以將每個請求的詳細信息記錄日誌,並在遠程資源或服務重新可用時安排重試。

本篇文章內容給大家講解的是什麼是微服務的熔斷機制和熔斷的意義

  1. 下篇文章給大家講解的是熔斷與降級的區別、如何集成 Hystrix;
  2. 覺得文章不錯的朋友可以轉發此文關注小編;
  3. 感謝大家的支持!


分享到:


相關文章: