熔斷、限流、降級都是保持系統穩定運行的策略,但針對的場景有所不同。
熔斷
服務熔斷的作用類似於我們家用的保險絲,當某服務出現不可用或響應超時的情況時,為了防止整個系統出現雪崩,暫時停止對該服務的調用。
上面的解釋中有兩個很關鍵的詞,一個是暫時,一個是停止。
停止是說,當前服務一旦對下游服務進行熔斷,當請求到達時,當前服務不再對下游服務進行調用,而是使用設定好的策略(如構建默認值)直接返回。
暫時是說,熔斷后,並不會一直不再調用下游服務,而是以一定的策略(如每分鍾調用 10 次,若均返回成功,則增大調用量)試探調用下游服務,當下游服務恢復可用時,自動停止熔斷。
如上圖,當 ServiceD 不可用時,ServiceB 應對 ServiceD 進行熔斷。
開源的熔斷器,如:Hystrix
限流
限流是指上游服務對本服務請求 QPS 超過闕值時,通過一定的策略(如延遲處理、拒絕處理)對上游服務的請求量進行限制,以保證本服務不被壓垮,從而持續提供穩定服務。常見的限流算法有滑動窗口、令牌桶、漏桶等。
如上圖,當 ServiceB 對 ServiceD 請求過多時,ServiceD 可以放棄一部分請求,保證自身服務的穩定。
目前比較常用的限流算法有以下幾種:
- 計數器固定窗口算法
- 計數器滑動窗口算法
- 漏桶算法
- 令牌桶算法
降級
降級是指當自身服務壓力增大時,采取一些手段,增強自身服務的處理能力,以保障服務的持續可用。比如,下線非核心服務以保證核心服務的穩定、降低實時性、降低數據一致性。
- 讀舊
- PlanB
- 默認值
- 放棄部分請求
- 降低質量
- 提高參與門檻
- 反向過濾
- 補償
- 容災
總結
措施 | 產生原因 | 針對服務 |
---|---|---|
熔斷 | 下游服務不可用 | 下游服務 |
降級 | 自身服務的處理能力不夠 | 自身服務 |
限流 | 上游服務請求增多 | 上游服務 |