【Java高級工程師蛻變之路】070 分佈式服務治理之服務熔斷

服務熔斷

什麼是服務熔斷

犧牲局部,保存整體的措施叫做熔斷。

不採取熔斷的後果,例子:

image-20220412134933476

一旦下游服務C變的不可用,積壓了大量請求,服務B的請求也會隨之阻塞。

線程資源逐漸耗盡,使得服務B也變的不可用。緊接着,服務A也會變得不可用,整個服務鏈路被拖垮。

image-20220412135224506

這種調用鏈路的連鎖故障,叫做雪崩。

熔斷機制

可以採用熔斷機制來解決上面的問題。

image-20220412135744686

需要注意兩點:

  1. 開啓熔斷

    在固定時間窗口內,接口調用超時比例達到一個閾值,會開啓熔斷。

    進入熔斷狀態後,後續對該服務的調用,不再經過網絡,而是調用本地的默認方法,達到服務降級的效果。

  2. 熔斷恢復

    熔斷不是永久的,經過了熔斷超時時間之後,服務將從熔斷狀態恢復,再次接受調用方的遠程調用。

熔斷機制的實現
  1. Spring Cloud Hystrix

    Spring Cloud Hystrix是基於Netflix的開源框架Hystrix實現的,該框架實現了服務熔斷、線程隔離等一系列服務保護功能。

    對熔斷機制的實現,Hystrix設計了三種狀態:

    • 熔斷關閉狀態(Closed)

      服務沒有故障時,熔斷器所處的狀態,對調用方的調用不作任何限制。

    • 熔斷開啓狀態(Open)

      在固定時間內,Hystrix默認是10s,接口調用出錯比例達到一個閾值,Hystrix默認是50%,就會進入熔斷狀態。

      進入熔斷狀態後,後續對該服務接口的調用,不再經過網絡,而是調用本地的fallback方法。

    • 半熔斷狀態(Half-Open)

      在進入熔斷開啓狀態一段時間後,Hystrix默認是5s,容器會進入半熔斷狀態。

      半熔斷狀態嘗試恢復服務調用,允許有限的流量調用該服務,並監控調用成功率。如果成功率達到預期,說明服務已經恢復,提前進入熔斷關閉狀態。如果成功率依然很低,則重新進入熔斷開啓狀態。

    三個狀態的轉化關係如下:

    image-20220412143208192

  2. Sentinel

    https://github.com/alibaba/Sentinel

    Sentinel和Hystrix的原則是一致的:當調用鏈路中,某個資源出現不穩定,例如,表現爲timeout,異常比例升高的時候,則對這個資源的的調用進行限制,並讓請求快速失敗,避免影響到其他資源,導致最終產生雪崩。

    Sentinel的熔斷手段:

    • 通過併發線程數進行限制
    • 通過響應時間對資源進行降級
    • 系統負載保護
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章