Snetinel服務限流及熔斷的一些基本知識

輕雲K發表於2020-12-23

Snetinel服務限流及熔斷的一些基本知識

服務限流:通過限制併發訪問資料或者限制一段時間內(時間視窗內)允許處理的請求數量來保護系統,不會出現崩潰(或者一些其他的業務關係)。表現的形式是:犧牲一部分使用者的可用性來維持系統的穩定性

常用的限流演算法

  1. 計算器演算法:指定的週期內累加訪問次數,當訪問次數達到設定的閾值時,觸發限流策略(返回一個預設的結果,或者拒絕服務),進入下一個週期,累加次數清除。
    可以用於簡訊服務(或者一些免費服務)的次數上進行限制,比如每個使用者在同一分鐘內只能觸發一定數量的簡訊服務
    這種演算法存在臨界問題,再上一個週期(0:58)和下一個週期(1:02)期間每個週期都觸發了100個請求,整體看就是4秒內有200請求,超過了設定閾值

  2. 滑動 視窗演算法 (為了解決計算器演算法帶來的臨界問題):一種流量控制技術,Tcp網路通訊協議中就是採用這個演算法解決網路擁堵的情況。在固定視窗(或者說週期內)中分割出多個小時間視窗,在每個時間視窗中記錄訪問的次數,滑動視窗(一定數量的小時間視窗)在小時間視窗上滑動並刪除過期的小時間視窗,最後只統計落在滑動視窗上的所有小時間視窗的總訪問次數,對訪問的請求進行限制。
    像上個問題,可以將一分鐘分成4個小時間視窗,滑動視窗大小為2,在滑動視窗內只能處理50個請求。Sentinel 內部就是使用滑動視窗演算法來實現限流的。

  3. 令牌桶限流演算法: 網路流量和速率限制常用的一種演算法。對於每一個訪問請求,都需要從令牌桶(以一定的速率生成令牌,桶的大小可以有一個上限)中獲得一個令牌,如果沒有獲得請求就觸發限流策略。令牌桶生成令牌的效率可以根據實際的需求來。只要生成令牌的效率是恆定的,短時間內突發大量的訪問請求,對於新增的訪問請求,系統能夠正常處理。

    • 請求速度大於令牌生成速度,那麼令牌會很快會被取完,後續再進來的訪問請求會被限流
    • 請求速度等於令牌生成速度,處於平衡
    • 請求速度等於令牌生成速度,此時系統的併發數不高,訪問請求正常處理
  4. 漏桶限流演算法:控制訪問請求注入的速度,平滑的處理網路上的突發請求。維護一個漏桶容器A(有大小),用於儲存訪問請求,容器以恆定的速度派發訪問的請求,漏桶容器A 流出的訪問請求的速度始終保持不變。

    • 請求速度大於漏桶容器A的派發速度:訪問請求書超出當前系統處理的極限,將會觸發限流策略
    • 請求速度小於等於漏桶容器A的派發速度,系統處理能力滿足客戶端需求,正常執行

漏桶演算法和令牌桶演算法的實現原理相差不大,區別漏桶演算法無法處理短時間內的突發訪問請求,漏桶限流演算法是一種速度恆定的限流演算法

服務熔斷:背景—微服務架構中,由於業務拆分的問題,一般會出現請求鏈路較長的情況,使用者發起一個訪問請求,往往需要幾個微服務才能夠完成,在高併發的場景下,這種依賴的服務(請求呼叫鏈)對系統的穩定性影響很大,只要其中某個服務的環節出現網路延遲或者請求超時等意外狀況而導致服務不可用,就會造成當前請求的阻塞,從而可能出現雪崩的效應。服務熔斷就是用於解決這種情況的,一旦某個服務提供者無法正常提供服務的時候,為了防止雪崩效應的產生,就會將當前介面和外部隔離,觸發熔斷,後續一段時間內,呼叫者的請求都會直接失敗返回,知道服務提供者恢復正常。服務熔斷之後,可以提供一個預設的處理結果。
服務降級:伺服器壓力劇增的情況下,根據實際業務情況及流量,對一些服務和頁面有策略的不處理或換種簡單的方式處理,從而釋放伺服器資源以保證核心業務正常運作或高效運作。參考的指標:

1. 平均響應時間:比如1s內5個請求,對應時刻的平均響應時間超過閾值,則在接下來固定時間視窗內,對應的方法自動熔斷
2. 異常比例:某個方法每秒呼叫所獲得異常總數比例超過設定的閾值,該方法自動進入降級狀態,在固定的時間視窗內對這個方法的呼叫會自動返回
3. 異常數量:與異常比例類似,某個方法在時間視窗內獲得異常數超過閾值時觸發

服務熔斷和服務降級的區別:熔斷由服務不可用引起,降級由業務實際情況和系統資源負載設定等關係引起,但最終的表現是類似的 框架中用DegradeRule 設定

QPS(Queries per second):每秒查詢數
QPS 超過閾值觸發流量控制行為,通過controlBehavior 設定,包含:

  1. 直接拒絕(RuleConstant.CONTROL_BEHAVIOR_DEFAULT):預設,請求流量超出預設,直接丟擲FlowException
  2. Warm Up (RuleConstant.CONTROL_BEHAVIOR_WARM_UP):冷啟動(預熱):當流量突然增大,即從空閒突然到繁忙,可能瞬間將系統壓垮,希望控制請求處理數量逐漸增大,並在預期時間內達到最大(個人感覺箱數令牌桶演算法)
  3. 勻速排隊(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMIT):嚴格控制請求的通過時間間隔,即請求以勻速通過限制被處理(漏桶限流)
  4. 冷啟動(預熱)+ 勻速排隊RuleConstant.CONTROL_BEHAVIOR_WARM_UP_RATE_LIMIT)

具體的設定說明在程式碼註釋中

相關文章