分布式系統中的限流器是一種重要的技術組件,用于控制和管理系統的流量,防止系統因流量過大而崩潰或性能下降。限流器的主要作用是在保證系統可用性的前提下,對流量進行合理的限制和調度,以保證系統的穩定性和可靠性。
在分布式系統中,限流器通常被部署在系統的入口或關鍵節點上,用于控制來自外部或內部的請求流量。通過限制流量的速度和數量,限流器可以有效地防止系統因流量過大而出現擁塞或崩潰的情況。同時,限流器還可以對流量進行調度和分配,以保證系統的負載均衡和資源利用率的最大化。
常見的限流算法包括計數器、固定窗口、滑動窗口、漏桶和令牌桶等。其中,計數器是最簡單的限流算法,它通過統計請求的數量來進行限流,但缺乏時間概念,容易出現流量突增的情況。固定窗口和滑動窗口算法則引入了時間概念,通過對時間窗口內的請求數量進行限制來實現限流,但可能存在窗口邊界的流量突變問題。漏桶和令牌桶算法則通過控制流量的速率來進行限流,可以更好地平滑流量波動。
在實際應用中,限流器還可以結合其他技術手段來提高系統的可用性和性能,如降級處理、請求排隊、熔斷機制等。當系統流量超過閾值時,可以通過降級處理來減少非關鍵業務的影響,保證核心業務的正常運行;請求排隊則可以將超出閾值的請求放入隊列中等待處理,避免直接拒絕請求導致用戶體驗下降;熔斷機制則可以在系統出現異常情況時快速切斷請求鏈路,防止故障擴散和影響整個系統。
限流方法
這里我們主要討論后端基于請求量的限流,限流是一種非常廣泛的應用技術,就比如你在登錄系統時,經常會需要你輸入手機驗證、動態碼或一些奇奇怪怪的驗證方式, 來降低登錄請求的頻次。
計數限流
按數量進行控制,達到設置的閾值則進行限流,其中固定窗口,滑動窗口則是通過該方法實現。
固定窗口
通過控制時間單元內允許的請求數量,一旦達到閾值,則不會處理該請求后續相關的業務或者直接讓請求快速失敗并給予提示。
比如我們配置10s內允許請求的流量為1000,在第1~9s內請求為0,在第9~10秒內的請求數為1000,這樣一秒內的請求就達到了1000。當然我們可以時間單元劃分成更小粒度, 但是應該多小才合適呢?
問題:只能對時間單元內的總請求數進行控制,當請求集中在較小時間范圍內時,無法達到流量限制的效果,因此這是一種粗粒度的流量限制手段
滑動窗口
為了解決固定窗口算法中存在的問題,通過滑動窗口的方法,將上述時間單元劃分成多個細粒度的時間窗口,每個窗口都有自己獨立的請求計數器,這樣就可以讓時間單元內的流量控制均勻地 落在各個時間窗口上,同時滑動的時間窗口可以形成連續時間區間控制,并不像固定窗口那樣只在兩個時間刻度間。
比如時間單元為1s,每個時間窗口為100ms,在1秒內的10個時間窗口可以為09:01:01.000~09:01:02.000、09:01:01.200~09:01:02.800...
問題:滑動窗口的區間劃分的越多,則滑動窗口的滾動就越平滑,限流的統計就會越精確,但也需要更多的資源為窗口時間片段保存計數器,從而耗費系統資源
漏桶算法
如果將請求看成水滴,限流器看成一個下面開口的桶(漏桶)。漏桶算法其實就是當水滴(請求)先進入到漏桶里,漏桶以一定的速度出水,當水流入速度過大時則會超過桶的可接納容量, 這時水將直接溢出,漏桶算法能強行限制數據的傳輸速率。使用漏桶算法,可以保證接口會以一個常速速率來處理請求,所以漏桶算法必定不會出現臨界問題。
問題:當短時間內如果有大量的突發請求時,即使服務器負載不高,每個請求也需要等待一段時間(水滴間隔)才能被響應。
總之,分布式系統中的限流器是一種重要的技術組件,它可以幫助系統更好地應對流量壓力,保證系統的穩定性和可靠性。在實際應用中,需要根據系統的特點和需求選擇合適的限流算法和技術手段,以實現最佳的限流效果。
審核編輯:黃飛
-
計數器
+關注
關注
32文章
2259瀏覽量
94802 -
限流器
+關注
關注
0文章
41瀏覽量
14504 -
分布式系統
+關注
關注
0文章
146瀏覽量
19280
發布評論請先 登錄
相關推薦
評論