服務熔斷
什麼是服務熔斷
犧牲局部,保存整體的措施叫做熔斷。
不採取熔斷的後果,例子:
一旦下游服務C變的不可用,積壓了大量請求,服務B的請求也會隨之阻塞。
線程資源逐漸耗盡,使得服務B也變的不可用。緊接着,服務A也會變得不可用,整個服務鏈路被拖垮。
這種調用鏈路的連鎖故障,叫做雪崩。
熔斷機制
可以採用熔斷機制來解決上面的問題。
需要注意兩點:
-
開啓熔斷
在固定時間窗口內,接口調用超時比例達到一個閾值,會開啓熔斷。
進入熔斷狀態後,後續對該服務的調用,不再經過網絡,而是調用本地的默認方法,達到服務降級的效果。
-
熔斷恢復
熔斷不是永久的,經過了熔斷超時時間之後,服務將從熔斷狀態恢復,再次接受調用方的遠程調用。
熔斷機制的實現
-
Spring Cloud Hystrix
Spring Cloud Hystrix是基於Netflix的開源框架Hystrix實現的,該框架實現了服務熔斷、線程隔離等一系列服務保護功能。
對熔斷機制的實現,Hystrix設計了三種狀態:
-
熔斷關閉狀態(Closed)
服務沒有故障時,熔斷器所處的狀態,對調用方的調用不作任何限制。
-
熔斷開啓狀態(Open)
在固定時間內,Hystrix默認是10s,接口調用出錯比例達到一個閾值,Hystrix默認是50%,就會進入熔斷狀態。
進入熔斷狀態後,後續對該服務接口的調用,不再經過網絡,而是調用本地的fallback方法。
-
半熔斷狀態(Half-Open)
在進入熔斷開啓狀態一段時間後,Hystrix默認是5s,容器會進入半熔斷狀態。
半熔斷狀態嘗試恢復服務調用,允許有限的流量調用該服務,並監控調用成功率。如果成功率達到預期,說明服務已經恢復,提前進入熔斷關閉狀態。如果成功率依然很低,則重新進入熔斷開啓狀態。
三個狀態的轉化關係如下:
-
-
Sentinel
https://github.com/alibaba/Sentinel
Sentinel和Hystrix的原則是一致的:當調用鏈路中,某個資源出現不穩定,例如,表現爲timeout,異常比例升高的時候,則對這個資源的的調用進行限制,並讓請求快速失敗,避免影響到其他資源,導致最終產生雪崩。
Sentinel的熔斷手段:
- 通過併發線程數進行限制
- 通過響應時間對資源進行降級
- 系統負載保護