深度解析微服務高並發流量服務降級、限流、熔斷、流量效果控制

程序員高級碼農ii 發佈 2023-02-02T16:00:23.435876+00:00

基礎知識本篇主要介紹服務降級、限流、熔斷、流量效果控制等概念,解讀Sentinel的一些特性,並通過對Sentinel性能壓測介紹Sentinel的性能表現。本篇內容主要包括以下幾個方面。• 服務降級、限流、熔斷、流量效果控制。• Sentinel的特性。

基礎知識

本篇主要介紹服務降級、限流、熔斷、流量效果控制等概念,解讀Sentinel的一些特性,並通過對Sentinel性能壓測介紹Sentinel的性能表現。

本篇內容主要包括以下幾個方面。

• 服務降級、限流、熔斷、流量效果控制。

• Sentinel的特性。

• Sentinel性能壓測。

服務降級、限流、熔斷、流量效果控制

限流,是指控制服務在單位時間內的流入流量,也就是控制服務在單位時間內處理的請求總數。

熔斷,是指當下游服務突然變得不可用或者不穩定時,服務可以自動切斷與下游服務的交互,從而保證自身可用。就像保險絲一樣,當電流異常升高到一定數值時,保險絲就會熔斷以切斷電流。

流量效果控制,是指控制流量以達到某種效果,如控制每毫秒只放行一個請求以達到勻速通過的效果。常見的流量效果控制有勻速通過、冷啟動。

服務降級,表示臨時暫停一些不是那麼重要的服務,以釋放更多資源給重要的服務使用;也表示暫時由計劃A改為計劃B,計劃A為正常提供的服務,計劃B為臨時提供的服務,如快速響應「系統忙碌,請稍後再試」的提示。

常見的服務降級實現方式有限流降級、熔斷降級、開關降級。

限流降級

假設服務A需要依賴服務B完成客戶端的一次請求,如圖1.1所示。這時通過壓測預測服務B單節點1秒內所能處理的最大並發請求數為200個,若為服務B配置限流閾值為200 QPS,則當1秒內服務B接收的請求數超過200個時,超出的請求就會被服務B拒絕。

對於超出閾值的流量除直接拒絕外,還可以採取一些策略以處理更多的請求,即流量效果控制。例如,均速排隊這種方式主要用於處理間隔性突發的流量,如某一秒有大量的請求到來,而接下來的幾秒都處於空閒狀態,這時我們希望系統能夠在接下來的空閒時間內逐個處理這些請求,而不是在第一秒直接拒絕多餘的請求。

熔斷降級

假設服務A需要依賴服務B完成客戶端的一次請求,那麼服務A如果能夠感知服務B的狀態,在服務B不行的時候不再請求服務B,就能確保服務A自身不會受服務B的影響。如何知道服務B到底行不行呢?

如圖1.2所示,假設1秒內向服務B發送230個請求,結果有30個請求發生超時異常或響應異常,根據這個數字就可以預測後續請求也大概率不能被服務B正常處理。服務B已經處理不過來了,那麼後續的請求就沒有必要再發送了,因為發送出去也會顯示異常。

當然,服務B不會一直不行,當服務B恢復之後,服務A也應該能感知到,所以熔斷需要以一個時長為周期,如1秒。這個周期也被稱為時間窗口。每個時間窗口都要重新計算請求總數、異常總數這些指標數據,這樣熔斷就會在下一個周期自動恢復。

熔斷降級的常見降級策略如下。

(1)在每秒請求異常數超過多少時觸發熔斷降級。

(2)在每秒請求異常錯誤率超過多少時觸發熔斷降級。

(3)在每秒請求平均耗時超過多少時觸發熔斷降級。

提示:請求異常數越多、請求異常錯誤率越大或請求平均耗時越長,都說明服務的處理能力在下降。

開關降級

開關降級也是服務降級的一種實現方式。開關降級用於在有限的硬體條件下,提升系統核心功能的並發處理能力,以最少的硬體成本應對流量高峰。

電商項目開發涉及較多開關降級。一般在「大促活動」之前,都會通過開關方式將一些無關緊要的業務接口變成「不可用」。常見的實現方式是使用Redis控制服務降級的開關,如圖1.3所示,在服務A收到服務B的請求時,先從Redis獲取開關配置,若開關打開,則直接拒絕請求,並響應一個表示當前服務降級的狀態碼給調用者。

控制服務降級開關的方式可以是人工控制,也可以是定時任務,即在某個時段開啟、某個時段關閉。

提示:定時任務控制服務降級開關的方式適合固定時間段請求突增的場景,例如,點外賣的高峰期在中午,就可以在上午11:00左右打開開關,在下午1:30之後關閉開關。

本文給大家講解的內容是深度解析微服務高並發基礎知識:服務降級、限流、熔斷、流量效果控制

  1. 下篇文章給大家講解的內容是度解析微服務高並發基礎知識:Sentinel的特性
  2. 感謝大家的支持!
關鍵字: