面試官:熔斷和降級有什麼區別?

2023-02-17 09:00:38

熔斷和降級都是系統自我保護的一種機制,但二者又有所不同,它們的區別主要體現在以下幾點:

  1. 概念不同
  2. 觸發條件不同
  3. 歸屬關係不同

1.概念不同

1.1 熔斷概念

「熔斷」一詞早期來自股票市場。熔斷(Circuit Breaker)也叫自動停盤機制,是指當股指波幅達到規定的熔斷點時,交易所為控制風險採取的暫停交易措施。比如 2020 年 3 月 9 日,紐約股市開盤出現暴跌,隨後跌幅達到 7% 上限,觸發熔斷機制,停止交易 15 分鐘,恢復交易後跌幅有所減緩。

熔斷在程式中,表示「斷開」的意思。如發生了某事件,程式為了整體的穩定性,所以暫時(斷開)停止服務一段時間,以保證程式可用時再被使用。

如果沒有熔斷機制的話,會導致聯機故障和服務雪崩等問題,如下圖所示:

1.2 降級概念

降級(Degradation)降低階別的意思,它是指程式在出現問題時,仍能保證有限功能可用的一種機制。

比如電商交易系統在雙 11 時,使用的人比較多,此時如果開放所有功能,可能會導致系統不可用,所以此時可以開啟降級功能,優先保證支付功能可用,而其他非核心功能,如評論、物流、商品介紹等功能可以暫時關閉。

所以,從上述資訊可以看出:降級是一種退而求其次的選擇,而熔斷卻是整體不可用

2.觸發條件不同

不同框架的熔斷和降級的觸發條件是不同的,本文咱們以經典的 Spring Cloud 元件 Hystrix 為例,來說明觸發條件的問題。

2.1 Hystrix 熔斷觸發條件

預設情況 hystrix 如果檢測到 10 秒內請求的失敗率超過 50%,就觸發熔斷機制。之後每隔 5 秒重新嘗試請求微服務,如果微服務不能響應,繼續走熔斷機制。如果微服務可達,則關閉熔斷機制,恢復正常請求。

2.2 Hystrix 降級觸發條件

預設情況下,hystrix 在以下 4 種條件下都會觸發降級機制:

  1. 方法丟擲 HystrixBadRequestException
  2. 方法呼叫超時
  3. 熔斷器開啟攔截呼叫
  4. 執行緒池或佇列或號誌已滿

雖然 hystrix 元件的觸發機制,不能代表所有的熔斷和降級機制,但足矣說明此問題。

3.歸屬關係不同

熔斷時可能會呼叫降級機制,而降級時通常不會呼叫熔斷機制。因為熔斷是從全域性出發,為了保證系統穩定性而停用服務,而降級是退而求其次,提供一種保底的解決方案,所以它們的歸屬關係是不同(熔斷 > 降級)。

題外話

當然,某些框架如 Sentinel,它早期在 Dashboard 控制檯中可能叫「降級」,但在新版中新版本又叫「熔斷」,如下圖所示:

但在兩個版本中都是通過同一個異常型別 DegradeException 來監聽的,如下程式碼所示:

所以,在 Sentinel 中,熔斷和降級功能指的都是同一件事,也側面證明了「熔斷」和「降級」概念的相似性。但我們要知道它們本質上是不同的,就像兩個雙胞胎,不能因為他們長得像,就說他們是同一個人。

總結

熔斷和降級都是程式在我保護的一種機制,但二者在概念、觸發條件、歸屬關係上都是不同的。熔斷更偏向於全域性視角的自我保護(機制),而降級則偏向於具體模組「退而請其次」的解決方案。

參考 & 鳴謝

https://blog.csdn.net/BiandanLoveyou/article/details/118067224

https://cloud.tencent.com/developer/article/1600700

本文已收錄到 Gitee 開源倉庫《Java 面試指南》,其中包含的內容有:Redis、JVM、並行、並行、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設計模式、訊息佇列等模組。Java 面試有它就夠了:超全 Java 常見面試題,持續更新...