1. 程式人生 > >常見的限流演算法以及應用

常見的限流演算法以及應用

常見的限流演算法

令牌桶演算法

1)存放固定令牌的桶,生產令牌的速率固定
2)當令牌達到上限時候,產生的令牌被丟棄或拒絕
3)n個請求過來,拿n個令牌,若令牌不足,則請求被決絕或等待

漏桶演算法

1)桶容量固定,固定速錄流出
2)桶是空的,不流出
3)以任意速率流入桶,若超過桶容量,被丟棄

對比:令牌桶演算法可一次拿n個令牌,說明允許突發請求。漏桶演算法流出速率固定,說明會平滑處理突發請求

計數器限流

例如資料庫連線池大小,執行緒池大小,秒殺併發數限制。全域性請求數量達到一定閾值進行限流。

常見的限流應用

應用層限流

1)底層資料庫連線數,tomcat訪問執行緒數,某個介面最大請求數總數限制
2)過載保護,guava的令牌桶演算法,hystrix降級
場景:①系統只能抗住100/s流量 ②搶購超出限額,直接告訴使用者沒貨
3)分散式限流
nginx+lua指令碼實現

接入層限流

nginx限流模組
ngx_http_limit_conn_module可按照ip維度進行限流
ngx_http_limit_req_module漏桶演算法的實現,可按照ip維度限制請求速率

節流

有時候想在特定時間內對重複的相同事情只處理一次,或者限制多個連續相同時間最小執行時間間隔。
1)throttleFirst/throttleLast
同一時間視窗內,若相同時間處理只處理第一個/最後一個。
例如:網頁resize事件,快速改變瀏覽器大小時候,可保證頁面不卡頓。
2)throttleWithTimeOut
限制兩個連續時間執行時間不小於某個時間視窗。例如android實現RxJava1.2


例如:關鍵字搜尋自動補全,使用者快速輸入造成自動補全之前的請求無效,可減少頻繁網路請求,避免每個字都發送請求。