熔斷:
生活中的一個最形象的例子,就是保險絲,可以在短路的時候自動跳閘,保護家電
在分布式系統中的熔斷,也可以保護我們的系統
分布式系統中,一個上游服務,可能調用多個下游服務。比如一個購物模服務,需要調用訂單服務,支付服務,統計服務等等等
如果下游服務出現了故障,上游服務還是繼續訪問的話,就可能回出現請求無法被解決,被堆積的情況
更壞的情況是,一條調用鏈路,A->B->C->D->E->F->G,如果G出現故障,上游服務調用它會出現等待超時的情況,這時候如果沒有一個好的措施,那么就會導致這個服務鏈路雪崩,從一個服務的故障演化為整個系統的故障
這時候就是熔斷上場的好時候,熔斷器可以防止服務不斷的去嘗試下游可能超時或失敗的服務,即時斷開這條鏈路,並且保護下游服務變得更壞
並且熔斷器還可以讓服務自動診斷下游服務是否已經修復,如果還未修復,依然保持熔斷狀態,如果已經修復,慢慢的放量請求,增加請求次數直到恢復故障前的狀態
降級:
降級解決的是(系統資源 < 請求量)
如何在資源有限的情況下,扛住海量的請求(棄卒保帥)
這個場景在雙十一就能看到,為了保證秒殺,購物,支付等業務正常進行,會禁用一些服務,降低圖片的清晰度等等
三大措施:
- 強一致性->最終一致性
- 次要功能禁用
- 簡化功能流程
限流:
限制請求的數量,限制某段時間內的請求總量
對於超出的總量的請求,可以直接拒絕,也可以在請求的時候對請求分組,允許特殊請求進來,剩下的拒絕,也可以放入消息隊列,削峰填谷
限流的實現方式:
- 計數器:維護一個counter,每個時間段清零,對時間段內的請求進行計數,計數前判斷counter是否達到闕值,如果沒有就加一,達到則拒絕
- 漏斗算法:一個固定容量的桶,當桶為空的時候,不會漏出水滴,流入桶的水的速率是任意的,漏出水的速率是固定的,如果流入桶的水超出桶的容量,進行拒絕
一般的實現方法是隊列,隊列模擬漏斗,空的時候不再出隊,滿的時候拒絕
- 令牌桶算法:和漏斗算法很類似,不過除了一個隊列以外,還加入了一個中間人,它會以一定的速率發放令牌(token)到桶內,隊列中的的等待着只有拿到token才能通過
漏斗限制了傳輸速率,而令牌桶在限制的同時,還允許突然的大流量,即:在大流量到來的時候,有足夠空間的情況下(足夠的隊列和桶內有足夠的令牌),就允許進入