限流定義
? 1、??時間 , 基于某段時間或某個時間點,即:時間窗口
? ?2、資源: 對可用資源進行限制: QPS/連接數/傳輸速率/黑白名單等
分布式環境下,主流限流方案:
網關層限流:流量入口Nginx/Gateway/Zuul
中間件限流:如利用redis過期特性,每秒10個請求,結合lua進行腳本編程
限流組件:sentinel
限流算法
1、令牌桶
? ?把令牌放到桶中,拿到令牌的請求被執行,否則丟棄。另,有恒定的速率把令牌放入桶中
2、漏桶
把請求放到桶中,以恒定的速率漏出請求。
優點:不會有突發流量,對后臺服務輸出的訪問速率恒定
3、滑動窗口
計數器方案。一定時間內的訪問總量。時間窗口越多,限流效果越平滑。
具體的實現限流的手段
---轉載
1)Tomcat 使用 maxThreads來實現限流。
2)Nginx的
limit_req_zone
和 burst來實現速率限流。3)Nginx的
limit_conn_zone
和?limit_conn
兩個指令控制并發連接的總數。4)時間窗口算法借助 Redis的有序集合可以實現。
? ? ? ??限流之redis 有序集合(zset)實現滑動窗口_redistemplate zadd-CSDN博客
5)漏桶算法可以使用Redis-Cell來實現。
6)令牌算法可以解決Google的guava包來實現。
需要注意的是借助Redis實現的限流方案可用于分布式系統,而guava實現的限流只能應用于單機環境。如果你覺得服務器端限流麻煩,可以在不改任何代碼的情況下直接使用容器限流(Nginx或Tomcat),但前提是能滿足項目中的業務需求。
Tomcat限流
Tomcat 8.5 版本的最大線程數在?
conf/server.xml
?配置中,maxThreads 就是 Tomcat 的最大線程數,當請求的并發大于此值(maxThreads)時,請求就會排隊執行,這樣就完成了限流的目的。