計數器法
- 有一個十分致命的問題,那就是臨界問題。
- 能夠當作是滑動窗口的低精度實現。
- 好比每5分鐘容許500個請求,可能在第一秒或者最後一秒忽然來500個請求。
滑動窗口
- 滑動窗口因爲須要存儲多份的計數器,因此滑動窗口在實現上須要更多的存儲空間。
- 會發生單位時間的前半段有大量的請求涌入,然後半段則拒絕全部請求的狀況發生。
漏桶算法
- 漏桶算法能強行限制數據的傳輸速率,不能突發傳輸。
- 主要目的是控制數據注入到網絡的速率,平滑網絡上的突發流量。
- 漏桶算法提供了一種機制,經過它,突發流量能夠被整形以便爲網絡提供一個穩定的流量。
令牌桶算法
- 令牌桶算法的原理是系統會以一個恆定的速度往桶裏放入令牌,而若是請求須要被處理,則須要先從桶裏獲取一個令牌,當桶裏沒有令牌可取時,則拒絕服務。
- 令牌桶算法用來控制發送到網絡上的數據的數目,並容許突發數據的發送。
- 若是但願程序QPS不要超過1000,那麼每秒往桶裏扔1000個令牌。
- 雖然令牌桶算法容許突發速率,可是下一個突發速率必需要等桶內有足夠的token後才能發生。
- 令牌桶算法因爲實現簡單,且容許某些流量的突發,對用戶友好,因此被業界採用得較多。
區別
- 漏桶算法可以強行限制數據的傳輸速率,不容許突發傳輸。
- 令牌桶算法可以限制數據的平均傳輸速率外,還容許某種程度的突發傳輸。
- 令牌桶算法只要令牌桶中存在令牌,那麼就容許突發地傳輸數據,直到達到用戶配置的閥值,因此它適合於具備突發特性的流量。
方案
Guava的RateLimiter(java)java
Semphore(java)算法