中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nginx中限流算法有哪些

發布時間:2021-11-17 10:34:26 來源:億速云 閱讀:173 作者:小新 欄目:大數據

這篇文章主要介紹nginx中限流算法有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

為什么需要限流

正常的業務量增長不是瞬時的,可以采用應用實例或者數據庫實例的垂直或水平伸縮應對,而限流針對場景主要兩種:

  1. 網絡攻擊、爬蟲程序

  2. 熱點事件觸發業務(如各平臺營銷活動、微博熱點話題)

限流算法

1、計數器算法

原理:請求達到時計數器+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個請求。

nginx中限流算法有哪些

2、滑動窗口算法

滑動窗口本質上還是計數器算法,只是采用了更加細粒度的計數,對滾動區間進行計數。針對上述問題,將1分鐘拆分為10個格子即每10秒一次滑動,統計當前一分鐘窗口內的總計數。針對上述的問題,把一分鐘拆成60個格子,即每秒一次滑動。00:59秒進入100個請求,01:00的請求則被限流攔截。

nginx中限流算法有哪些

so 滑動窗口的本質是對粗粒度限流一定程度的優化,假如一開始就用極細粒度時間間隔做計數統計,也能實現較為精確的限流,但同時因為頻繁的進行計數器的重置犧牲部分效率。

3、 漏桶算法

原理:請求排隊,系統勻速取出排隊請求進行處理。

漏桶很形象,不管進水速度如何,漏孔滴水的速率是勻速穩定的。

nginx中限流算法有哪些

4、令牌桶算法

劃重點,目前應用比較廣泛的算法。

原理: 比如每分鐘/秒產生一定數目的令牌到令牌桶中(令牌桶滿則忽略),請求到達時網關獲取令牌成功則處理,失敗則觸發限流邏輯。

nginx中限流算法有哪些

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中限流算法有哪些”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新余市| 福建省| 炎陵县| 和田县| 山西省| 高碑店市| 惠水县| 修水县| 二连浩特市| 金沙县| 象州县| 庆城县| 叙永县| 成安县| 娄底市| 斗六市| 镇江市| 惠州市| 龙川县| 白河县| 平利县| 华亭县| 互助| 靖州| 涞水县| 秦安县| 乳山市| 东台市| 岢岚县| 赤水市| 枞阳县| 长阳| 万州区| 晋江市| 绥中县| 华蓥市| 吉水县| 彰化市| 平潭县| 美姑县| 新竹县|