限流
大眾的限流方案有三種,計數器、漏桶演算法、令牌演算法
計數器
分為固定視窗和滑動視窗
固定視窗計數器
固定視窗比較簡單粗暴,如果假定某個介面1s最多接收100個請求,維護一個固定單位時間的計數器,檢測到單位時間過去則重置計數器為0
其不能應對突發的流量,如1s中前100ms處理了99個請求,最後900ms就只能處理一個了
滑動視窗計數器
滑動視窗是對固定視窗的改進
將單位時間分為多個區間,每個區間都有一個計數器,有一個請求落在該區間內,則該區間的計數器就會加一
每過一段時間,時間視窗就會滑動一格,拋棄最老的一個區間,並納入一個新的區間
計算整個時間視窗內的請求總數時會累加所有時間片段內的計數器
漏桶演算法
漏桶演算法是利用一個快取區,當請求進入系統時,無論請求的速率如何,都先在快取區內儲存,然後以固定的流速流出快取區進行處理,使用佇列實現
將每個請求放入固定大小的佇列進行儲存
佇列以固定速率向外流出請求,如果佇列為空則停止流出
如果佇列滿了則多餘的請求就被直接拒絕
限制的是流量的流出速率,對於流量均衡的可以使用該方式
無法應對突發的大流量
令牌桶演算法
令牌桶演算法是一種反向的漏桶演算法,桶中存放的不再是請求,而是令牌,只有拿到令牌後,才能對請求進行處理,如果沒有令牌,就需要等待可用的令牌,爲了限制流速,該演算法每單位時間產生一定量的令牌存入桶中
限制的是流量的平均流入速率,可以應對突發流量
Nginx的限流模組就是採用令牌桶演算法的實現
每秒有r個令牌放入桶中
桶的容量不變,如果桶滿了則不進行儲存令牌
如果請求來了,沒有令牌會被限流