高併發場景下的限流策略

2021-08-29 18:24:39 字數 1587 閱讀 8509

目錄快取

降級 限流

漏桶演算法

令牌桶演算法

漏桶演算法與令牌桶演算法的區別

有效提公升熱點資料的訪問效率,在高併發、大流量的場景降低服務端壓力。

當訪問量快速增長、服務可能會出現一些問題(響應超時),或者會存在非核心服務影響到核心流程的效能時, 仍然需要保證服務的可用性,即便是有損服務。所以意味著我們在設計服務的時候,需要一些手段或者關鍵資料進行自動降級,或者配置人工降級的開關。

限流的目的是防止惡意請求流量、惡意攻擊,或者防止流量超過系統峰值。

限流是通過對高併發訪問請求進行限速或限量來保護系統,一旦達到限制速率則可以拒絕服務(定向到錯誤頁或者告知資源沒有了)、排隊、等待甚至降級(返回兜底資料或缺省資料或缺省資料,如商品詳情頁庫存預設有貨)。

漏桶演算法是一種常見的限流演算法。如果把請求流量比喻成水流,桶比喻成漏斗容器。桶具有乙個恆定的速率往下漏水,而上方時快時慢的會有水進入桶內。當桶還未滿時,上方的水可以加入,一旦水滿,上方的水就無法加入。桶滿正是演算法中的乙個關鍵的觸發條件(即流量異常判斷成立的條件),在此條件下如何處理上方流下來的水,一般有兩種處理方式:

1. 暫時攔截住上方水的向下流動,等待桶中的一部分水漏走後,再放行上方水。

2. 溢位的上方水直接拋棄。

漏桶演算法的特點:

無論注水過程如何變化,漏水速率都是恆定的。

令牌桶演算法是網路流量整形(traffic shaping)和速率限制(rate limiting)中最常使用的一種演算法。典型情況下,令牌桶演算法用來控制傳送到網路上的資料的數目,並允許突發資料的傳送。

令牌桶是乙個存放固定容量令牌(token)的桶,按照固定速率往桶裡新增令牌; 令牌桶演算法實際上由三部分組成:兩個流和乙個桶,分別是令牌流、資料流和令牌桶。

令牌桶演算法的基本過程如下:

假如使用者配置的平均傳送速率為r,則每隔1/r 秒乙個令牌被加入到桶中。

假設桶最多可以存發b個令牌。如果令牌到達時令牌桶已經滿了,那麼這個令牌會被丟棄。

當乙個n個位元組的資料報到達時,就從令牌桶中刪除n個令牌,並且資料報被傳送到網路。

如果令牌桶中少於n個令牌,那麼不會刪除令牌,並且認為這個資料報在流量限制之外。

演算法允許最長b個位元組的突發,但從長期執行結果看,資料報的速率被限制成常量r。

對於在流量限制外的資料報可以以不同的方式處理:

1. 它們可以被丟棄;

2. 它們可以排放在佇列中以便當令牌桶中累積了足夠多的令牌時再傳輸;

3. 它們可以繼續傳送,但需要做特殊標記,網路過載的時候將這些特殊標記的包丟棄。

漏桶演算法能夠強行限制資料的傳輸速率,而令牌桶演算法在能夠限制資料的平均傳輸速率外,還允許某種程度的突發傳輸。只要令牌桶中存在令牌,那麼就允許突發地傳輸資料直到達到使用者配置的門限,因此它適合於具有突發特性的流量。

高併發環境下的限流策略

在開發高併發系統時,有很多手段來防止系統過載 快取 降級 限流。快取的目的是提公升系統訪問速度和增大系統的吞吐量,降級和限流的目的如下 降級 降級是當服務出問題或者影響到核心流程的效能時需要暫時遮蔽掉某些功能,等高峰或者問題解決後再開啟。降級一般有幾種實現手段,自動降級和人工降級 1 通過配置降級開...

Java高併發系統的限流策略

在大資料量高併發訪問時,經常會出現服務或介面面對暴漲的請求而不可用的情況,甚至引發連鎖反映導致整個系統崩潰。此時你需要使用的技術手段之一就是限流,當請求達到一定的併發數或速率,就進行等待 排隊 降級 拒絕服務等。在開發高併發系統時有三把利器用來保護系統 快取 降級和限流。快取比較好理解,在大型高併發...

高併發限流演算法

目錄開篇 限流演算法 1.漏桶 leaky bucket 2.令牌桶 token bucket 資料流漏桶演算法和令牌桶演算法的比較 參考資料 在高併發系統中,有很多手段來保護系統,如快取 降級和限流等。快取 讓資料盡早進入快取,離程式近一點,不要大量頻繁的訪問db,可提供系統訪問速度和增大系統處理...