您好,登錄后才能下訂單哦!
這篇文章主要介紹nginx中限流算法有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
正常的業務量增長不是瞬時的,可以采用應用實例或者數據庫實例的垂直或水平伸縮應對,而限流針對場景主要兩種:
網絡攻擊、爬蟲程序
熱點事件觸發業務(如各平臺營銷活動、微博熱點話題)
原理:請求達到時計數器+1,然后比較當前計數是否達到閾值。
具體有兩種實現:
1.1 判斷系統正在處理的請求數是否達到閾值
請求處理前計數器+1,請求處理完成計數器-1,比如要控制系統同時處理的請求不超過100個。
static AtomicInteger runningThread = new AtomicInteger(0); @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { if (runningThread.get() > MAX_VALUE) { return getVoidMono(exchange, BaseResult.builder().code("SYSTEM_BUSY").message("系統繁忙").build()); } runningThread.getAndIncrement(); Mono<Void> mono = chain.filter(exchange) .then(Mono.fromRunnable(() -> runningThread.getAndDecrement())); return mono; }
1.2 判斷單位時間內請求數是否達到閾值
如:每分鐘處理請求不超過100個。
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { //redis鍵值自增,key不存在時自動創建,初始值為0 Long v = redisTemplate.opsForValue().increment(key, 1L); //初始化生效時間 if (v == 1) { redisTemplate.expire(key, 1L, TimeUnit.MINUTES); } //請求數大于閾值攔截處理 if (v > MAX_VALUE) { return getVoidMono(exchange, BaseResult.builder().code("SYSTEM_BUSY").message("系統繁忙").build()); } return chain.filter(exchange); }
這種限流方法有明顯的缺陷,如下圖,分別看兩個單位時間內的并發數是被限制到每分鐘100個請求了,但是如果請求如果集中分布在第一分鐘的最后一秒和第二分鐘的第一秒之間,算出的并發成了每秒100個請求。
滑動窗口本質上還是計數器算法,只是采用了更加細粒度的計數,對滾動區間進行計數。針對上述問題,將1分鐘拆分為10個格子即每10秒一次滑動,統計當前一分鐘窗口內的總計數。針對上述的問題,把一分鐘拆成60個格子,即每秒一次滑動。00:59秒進入100個請求,01:00的請求則被限流攔截。
so 滑動窗口的本質是對粗粒度限流一定程度的優化,假如一開始就用極細粒度時間間隔做計數統計,也能實現較為精確的限流,但同時因為頻繁的進行計數器的重置犧牲部分效率。
原理:請求排隊,系統勻速取出排隊請求進行處理。
漏桶很形象,不管進水速度如何,漏孔滴水的速率是勻速穩定的。
劃重點,目前應用比較廣泛的算法。
原理: 比如每分鐘/秒產生一定數目的令牌到令牌桶中(令牌桶滿則忽略),請求到達時網關獲取令牌成功則處理,失敗則觸發限流邏輯。
Google開源工具包Guava提供了基于令牌桶算法的限流工具類RateLimiter。
詳細用法 :https://cloud.tencent.com/developer/article/1408819
//每秒生成10個令牌,5秒預熱時間。 static RateLimiter rateLimiter = RateLimiter.create(10, 5, TimeUnit.SECONDS); @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { if (!rateLimiter.tryAcquire()) { return getVoidMono(exchange, BaseResult.builder().code("SYSTEM_BUSY").message("系統繁忙").build()); } return chain.filter(exchange); }
以上是“nginx中限流算法有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。