高併發限流演算法

2021-10-21 17:32:24 字數 1476 閱讀 4983

目錄開篇

限流演算法

1.漏桶(leaky bucket)

2.令牌桶(token bucket)

資料流漏桶演算法和令牌桶演算法的比較

參考資料

在高併發系統中,有很多手段來保護系統,如快取、降級和限流等。

快取:讓資料盡早進入快取,離程式近一點,不要大量頻繁的訪問db,可提供系統訪問速度和增大系統處理能力。

降級:當服務出問題或者影響到核心流程的效能,需要將服務暫時遮蔽掉,待高峰期過去或問題解決後再啟用。

然後,有些場景不能用快取和降級來解決。比如電商的雙十一,使用者的購買,下單等行為,是涉及到大量寫操作,而且是核心鏈路,無法降級的。

限流:通過把併發訪問/請求進行限速或者一定時間視窗內的請求限制在一定範圍內來保護系統,一旦達到限制速率則可以拒絕服務(定向到錯誤頁面或告知資源沒有了)、排隊或等待(如秒殺),從而保證系統不被沖垮,同時盡可能提公升系統的吞吐量。

常見的限流演算法:漏桶、令牌桶。計數器也可用來進行粗暴限流實現。

漏桶演算法可用於流量整形(traffic shaping)和流量控制(traffic policing)

漏桶演算法描述如下:

令牌桶演算法是乙個存放固定容量令牌(token)的桶,按照固定速率往桶裡新增令牌。

令牌桶演算法基本可以用下面的幾個概念來描述:

令牌桶演算法實際上由三部分組成:兩個流和乙個桶,分別是令牌流、資料流與令牌桶。

令牌流與令牌桶

系統會以一定的速度生成令牌,並將其放置到令牌桶中,可以將令牌桶想象成乙個緩衝區(可以用佇列這種資料結構來實現),當緩衝區填滿的時候,新生成的令牌會被扔掉。 這裡有兩個變數很重要:

資料流是真正的進入系統的流量

有以下三種情形可能發生:

何時拒絕請求

限流策略

漏桶演算法

漏桶是按照常量固定速率流出請求,流入請求速率任意,當流入的請求數累積到漏桶容量時,則新流入的請求被拒絕;

漏桶限制的是常量流出速率(即流出速率是乙個固定常量值,比如都是 1 的速率流出,而不能一次是 1 ,下次又是 2 ),從而平滑突發流入速率;

令牌桶演算法

令牌桶是按照固定速率往桶中新增令牌,請求是否被處理需要看桶中令牌是否足夠,當令牌數減為零時則拒絕新的請求;

令牌桶限制的是平均流入速率(允許突發請求,只要有令牌就可以處理,支援一次拿 3 個令牌, 4 個令牌),並允許一定程度突發流量;

高併發系統限流《億級流量**架構核心技術》第2部分 高可用 4.限流詳解

令牌桶演算法/token bucket algorithm

漏桶演算法

高併發系統設計 限流

前面學習過的熔斷和降級都是通過暫時關閉某些非核心服務或者元件來保護核心系統的可用性。但是並不是所有的場景下都可以使用熔斷降級的策略,例如當核心服務產生比較大的影響時,總不能把核心服務進行熔斷與降級,些時一般採用限流方案來進行保護。限流指的是通過限制到達系統的併發請求數量,保證系統能夠正常響應部分使用...

高併發的限流例子

總體思路是這樣 1.用乙個環形來代表通過的請求容器。2.用乙個指標指向當前請求所到的位置索引,來判斷當前請求時間和當前位置上次請求的時間差,依此來判斷是否被限制。3.如果請求通過,則當前指標向前移動乙個位置,不通過則不移動位置 4.重複以上步驟 直到永遠.以下 的核心思路是這樣的 指標當前位置的時間...

使用Aop Redis lua限流,優化高併發問題

限流的方式有很多 1 單機模式下,可以使用atomicinteger ratelimiter semaphore。2 分布式下,可以使用佇列 如kafka等 但是編碼比較繁雜 也可以使用nginx限流,但是屬於閘道器層面,不能解決所有問題 如內部服務介面 所以,應用層也是需要做限流操作的。這裡簡單結...