在我們討論系統穩定性的時候,其實核心的關鍵詞就是容量規劃,如何做好業務容量與系統效能的評估,是保障系統穩定性的關鍵。對於系統效能的評估,需要我們具備自動化工具來對系統進行效能壓測,探測系統在實際業務場景下的基線資料,這是我們進行系統資源配置的基礎,也是在應對流量增長時進行彈性擴容的依據。
在我們做好容量規劃的前提下,在實際業務場景下,我們還是不可避免的會面對不確定的系統壓力,在面對突發不確定流量的情況下,我們最擔心的就是系統的“雪崩”。就像突然爆發的車流讓道路交通癱瘓一樣,我們的系統在突發流量下,很可能像多米諾骨牌一樣,全鏈路的崩塌。
很多情況下,我們以為我們的系統能夠這樣:
但實際上確實這樣
在系統發生雪崩的情況下,我們連基本容量規劃的負載都保證不了。如何保障我們的系統能夠在複雜多變的業務場景下,能夠持續穩定的提供的負載處理能力。這就要求我們按照系統的容量規劃,做好系統的限流保護,讓超出負載的流量能夠快速的failover,將系統無法承載的流量拒之門外,保護我們的系統不會發生雪崩。
如何做限流
在一般的概念中,我們在討論限流的時候,首先會想到併發的限流,通過限制系統服務呼叫的併發數來對系統進行保護。這裡面其實包含兩層概念:執行緒數和QPS。
執行緒數是我們系統中實際活躍的處理執行緒的數目,而QPS是我們系統在一定時間度量範圍內的訪問速率。一般傳統的限流手段是通過對活躍執行緒數進行控制來進行系統流量的控制。在現今複雜的網際網路服務呼叫體系下,更常用的是QPS進行限制來達到我們系統保護的效果。
考慮我們現今大部分的網際網路架構,一般業務系統會由幾十甚至上百的微服務構成,一次業務請求的處理,涉及眾多的微服務呼叫。從執行緒數的角度看,很難去對整體系統的流量做一個衡量。在我們對複雜的業務系統進行效能評估的時候,會使用全鏈路壓測的工具來進行,衡量的目標也是基於系統的QPS.所以使用對QPS進行限制的手段,會更好的對業務系統進行一個負載保護。
在筆者多年穩定性的負責工作中,一般在系統的各個入口處使用QPS作為主要的限流保護手段,執行緒數限流更多是作為上游系統對下游系統的一種熔斷機制來使用,保護上游系統在下游RT變長的情況下,不會被拖垮。
限流的實現
執行緒數限流
對於執行緒數的限流,一般通過令牌許可的方式實現,通過預置令牌的數目來控制系統的活躍執行緒數量,沒有獲取令牌的執行緒,快速的失敗返回。
線上程的入口處獲取許可令牌,在執行業務邏輯完畢的出口處歸還令牌。在實現上一般使用try{……}finally{……}結構實現,在finally中進行令牌的釋放。
執行緒數的限流多數用於簡單系統的負載保護,及自我的熔斷保護優雅降級,防止依賴的下游服務RT變長的情況下,造成自身系統效能下降。在例如天貓交易系統這種,依賴下游服務(庫存、物流、商品、營銷等)較多的系統中,一個服務的變慢可能會對處於核心的交易系統造成不良的影響,所以對於在交易系統中,對於依賴的核心服務都是設定一個自我保護的執行緒數限流值,在下游服務出問題的情況下進行優雅降級。
QPS限流
和執行緒數不同,QPS限流是對按照一定時間單位內的併發速率來對系統進行限制。QPS與執行緒數限流相比,最大的好處除了能夠按照壓測模型的測算進行設定外,在筆者看來,另一個最大的好處就是可以對流量進行削峰,防止流量突刺對系統資源進行穿透影響。
QPS雖然度量單位上是秒,但是一般的實現不會基於秒級進行計數統計來進行限流保護,基於秒級的計數時間視窗過大,不能夠消除流量突刺。試想一下在一秒的時間視窗內,流量突發集中在後面10ms,那麼在最後的時刻,系統流量會變成我們期望值的100倍,可想而知這個時候對於系統來說是多麼可怕的災難。
所以在實現上,一般基於時間視窗的分片來進行計數,將整個QPS的計數週期劃分為多個時間視窗,將計數值分散在各個時間視窗進行控制和計算,這樣能夠避免上面提到的流量突刺的出現,能夠有效的將流量進行削峰,將流量洪峰削平,放著洪峰對於系統資源的破壞,例如快取的熱點穿透。
在軟體的世界裡很奇妙,我們會發現很多東西沒有銀彈,軟體的進化過程,就是跟著實際的場景不斷的調優。基於時間視窗的QPS限流,雖然能夠消除流量突刺的場景,但是不可避免的會造成流量的損耗。試想一下如果流量的分佈不均勻,那麼在流量少的時間視窗下,沒有到達的流量實際是損耗的。
在實際場景中,例如天貓雙十一零點高峰,流量實際在每個時間視窗都是處於極度飽和的狀態,這個時候簡單的視窗分片就能達到很好的限流效果。
在流量分佈不均勻的情況下,我們可以實現動態的時間視窗分片,將不飽和的時間視窗流量在不超過系統負荷的情況下累加到下一時間視窗,這樣可以降低流量的損耗。
Pontus-用友雲限流服務
用友雲iuap平臺為了保證客戶雲端系統服務的穩定性,結合微服務平臺的建設,推出了穩定服務套件之一的限流服務Pontus,幫助用友雲客戶構建穩定性的系統防護體系。
Pontus支援QPS和執行緒限流兩種方式,結合用友雲微服務治理平臺,將限流服務通過中介軟體統一服務的方式,內建在應用的微服務框架體系中,對微服務介面提供統一的限流一級防護。
採用動態滑動視窗機制,能夠對流量峰值進行削峰,並且最大程度的降低流量損耗。觸發限流及後端介面響應超時時,自動觸發介面降級。
pontus服務與用友雲開發者中心無縫整合,包含在用友雲中介軟體統一SDK中,使用者應用在開發者中心部署之後,能夠自動發現服務介面,並對相應服務介面進行限流配置。
源於電商大促多年實踐場景,Pontus能夠為雲應用提供穩定一致的流量防護,進行流量削峰和系統熔斷,為雲應用的穩定性保駕護航。