1. 程式人生 > >「技術幹貨」Pontus-用友雲限流服務

「技術幹貨」Pontus-用友雲限流服務

統一 實踐 分布 fff 使用 交通 大促 分片 發現

在我們討論系統穩定性的時候,其實核心的關鍵詞就是容量規劃,如何做好業務容量與系統性能的評估,是保障系統穩定性的關鍵。對於系統性能的評估,需要我們具備自動化工具來對系統進行性能壓測,探測系統在實際業務場景下的基線數據,這是我們進行系統資源配置的基礎,也是在應對流量增長時進行彈性擴容的依據。
在我們做好容量規劃的前提下,在實際業務場景下,我們還是不可避免的會面對不確定的系統壓力,在面對突發不確定流量的情況下,我們最擔心的就是系統的“雪崩”。就像突然爆發的車流讓道路交通癱瘓一樣,我們的系統在突發流量下,很可能像多米諾骨牌一樣,全鏈路的崩塌。
很多情況下,我們以為我們的系統能夠這樣:
技術分享圖片
但實際上確實這樣
技術分享圖片
在系統發生雪崩的情況下,我們連基本容量規劃的負載都保證不了。如何保障我們的系統能夠在復雜多變的業務場景下,能夠持續穩定的提供的負載處理能力。這就要求我們按照系統的容量規劃,做好系統的限流保護,讓超出負載的流量能夠快速的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能夠為雲應用提供穩定一致的流量防護,進行流量削峰和系統熔斷,為雲應用的穩定性保駕護航。

「技術幹貨」Pontus-用友雲限流服務