一.前言
在股票市場,熔斷這個詞大家都不陌生,是指當股指波幅達到某個點後,交易所爲控制風險採取的暫停交易措施。相應的,服務熔斷一般是指軟件系統中,由於某些原因使得服務出現了過載現象,爲防止造成整個系統故障,從而採用的一種保護措施,所以很多地方把熔斷亦稱爲過載保護。大家都見過女生旅行吧,大號的旅行箱是必備物,平常走走近處綽綽有餘,但一旦出個遠門,再大的箱子都白搭了,怎麼辦呢?常見的情景就是把物品拿出來分分堆,比了又比,最後一些非必需品的就忍痛放下了,等到下次箱子夠用了,再帶上用一用。而服務降級,就是這麼回事,整體資源快不夠了,忍痛將某些服務先關掉,待渡過難關,再開啓回來。
二.熔斷
當下遊的服務因爲某種原因突然變得不可用或響應過慢,上游服務爲了保證自己整體服務的可用性,不再繼續調用目標服務,直接返回,快速釋放資源。如果目標服務情況好轉則恢復調用。
需要說明的是熔斷其實是一個框架級的處理,那麼這套熔斷機制的設計,基本上業內用的是斷路器模式
,如Martin Fowler
提供的狀態轉換圖如下所示
- 最開始處於
closed
狀態,一旦檢測到錯誤到達一定閾值,便轉爲open
狀態; - 這時候會有個 reset timeout,到了這個時間了,會轉移到
half open
狀態; - 嘗試放行一部分請求到後端,一旦檢測成功便迴歸到
closed
狀態,即恢復服務;
三.降級
關於降級,這裏有兩種場景:
- 當下遊的服務因爲某種原因響應過慢,下游服務主動停掉一些不太重要的業務,釋放出服務器資源,增加響應速度!
- 當下遊的服務因爲某種原因不可用,上游主動調用本地的一些降級邏輯,避免卡頓,迅速返回給用戶!
其實乍看之下,很多人還是不懂熔斷和降級的區別!
其實應該要這麼理解:
- 服務降級有很多種降級方式!如開關降級、限流降級、熔斷降級!
- 服務熔斷屬於降級方式的一種!
可能有的人不服,覺得熔斷是熔斷、降級是降級,分明是兩回事啊!其實不然,因爲從實現上來說,熔斷和降級必定是一起出現。因爲當發生下游服務不可用的情況,這個時候爲了對最終用戶負責,就需要進入上游的降級邏輯了。因此,將熔斷降級視爲降級方式的一種,也是可以說的通的!
四.熔斷和降級的互相交集
4.1 類似性
- 目的很一致,都是從可用性可靠性着想,爲防止系統的整體緩慢甚至崩潰,採用的技術手段;
- 最終表現類似,對於兩者來說,最終讓用戶體驗到的是某些功能暫時不可達或不可用;
- 粒度一般都是服務級別,當然,業界也有不少更細粒度的做法,比如做到數據持久層(允許查詢,不允許增刪改);
- 自治性要求很高,熔斷模式一般都是服務基於策略的自動觸發,降級雖說可人工干預,但在微服務架構下,完全靠人顯然不可能,開關預置、配置中心都是必要手段;
4.2 區別
- 觸發原因不太一樣,服務熔斷一般是某個服務(下游服務)故障引起,而服務降級一般是從整體負荷考慮;
- 管理目標的層次不太一樣,熔斷其實是一個框架級的處理,每個微服務都需要(無層級之分),而降級一般需要對業務有層級之分(比如降級一般是從最外圍服務開始)
- 實現方式不太一樣
參考文章
[1].【原創】談談服務雪崩、降級與熔斷 [N] 孤獨煙
[2]. 談談我對服務熔斷、服務降級的理解 [N] developerguy