成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:限流的常見算法有哪些?

開發 前端
計數器算法是在一定的時間間隔里,記錄請求次數,當請求次數超過該時間限制時,就把計數器清零,然后重新計算。當請求次數超過間隔內的最大次數時,拒絕訪問。

限流的實現算法有很多,但常見的限流算法有三種:計數器算法、漏桶算法和令牌桶算法。

1.計數器算法

計數器算法是在一定的時間間隔里,記錄請求次數,當請求次數超過該時間限制時,就把計數器清零,然后重新計算。當請求次數超過間隔內的最大次數時,拒絕訪問。

計數器算法的實現比較簡單,但存在“突刺現象”。

突刺現象是指,比如限流 QPS(每秒查詢率)為 100,算法的實現思路就是從第一個請求進來開始計時,在接下來的 1 秒內,每來一個請求,就把計數加 1,如果累加的數字達到了 100,后續的請求就會被全部拒絕。等到 1 秒結束后,把計數恢復成 0,重新開始計數。如果在單位時間 1 秒內的前 10 毫秒處理了 100 個請求,那么后面的 990 毫秒會請求拒絕所有的請求,我們把這種現象稱為“突刺現象”。

計數器算法的簡單實現代碼如下:

import java.util.Calendar;
import java.util.Date;
import java.util.Random;

public class CounterLimit {
    // 記錄上次統計時間
    static Date lastDate = new Date();
    // 初始化值
    static int counter = 0;
    // 限流方法
    static boolean countLimit() {
        // 獲取當前時間
        Date now = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        // 當前分
        int minute = calendar.get(Calendar.MINUTE);
        calendar.setTime(lastDate);
        int lastMinute = calendar.get(Calendar.MINUTE);
        if (minute != lastMinute) {
            lastDate = now;
            counter = 0;
        }
        ++counter;
        return counter >= 100; // 判斷計數器是否大于每分鐘限定的值。
    }

    // 測試方法
    public static void main(String[] args) {
        for (; ; ) {
            // 模擬一秒
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Random random = new Random();
            int i = random.nextInt(3);
            // 模擬1秒內請求1次
            if (i == 1) {
                if (countLimit()) {
                    System.out.println("限流了" + counter);

                } else {
                    System.out.println("沒限流" + counter);
                }
            } else if (i == 2) { // 模擬1秒內請求2次
                for (int j = 0; j < 2; j++) {
                    if (countLimit()) {
                        System.out.println("限流了" + counter);
                    } else {
                        System.out.println("沒限流" + counter);
                    }
                }
            } else { // 模擬1秒內請求10次
                for (int j = 0; j < 10; j++) {
                    if (countLimit()) {
                        System.out.println("限流了" + counter);
                    } else {
                        System.out.println("沒限流" + counter);
                    }
                }
            }
        }
    }
}

2.漏桶算法

漏桶算法的實現思路是,有一個固定容量的漏桶,水流(請求)可以按照任意速率先進入到漏桶里,但漏桶總是以固定的速率勻速流出,當流入量過大的時候(超過桶的容量),則多余水流(請求)直接溢出。如下圖所示:

漏桶算法提供了一種機制,通過它可以讓突發流量被整形,以便為系統提供穩定的請求,比如 Sentinel 中流量整形(勻速排隊功能)就是此算法實現的,如下圖所示:

更多 Sentinel 內容詳見:https://mp.weixin.qq.com/s/nF5f18BP8hscqIEmIFRN8Q

3.令牌桶算法

令牌按固定的速率被放入令牌桶中,桶中最多存放 N 個令牌(Token),當桶裝滿時,新添加的令牌被丟棄或拒絕。當請求到達時,將從桶中刪除 1 個令牌。令牌桶中的令牌不僅可以被移除,還可以往里添加,所以為了保證接口隨時有數據通過,必須不停地往桶里加令牌。由此可見,往桶里加令牌的速度就決定了數據通過接口的速度。我們通過控制往令牌桶里加令牌的速度從而控制接口的流量。令牌桶的實現原理如下圖所示:

4.漏桶算法 VS 令牌桶算法

漏桶算法是按照常量固定速率流出請求的,流入請求速率任意,當流入的請求數累積到漏桶容量時,新流入的請求被拒絕。令牌桶算法是按照固定速率往桶中添加令牌的,請求是否被處理需要看桶中的令牌是否足夠,當令牌數減為零時,拒絕新的請求。令牌桶算法允許突發請求,只要有令牌就可以處理,允許一定程度的突發流量。漏桶算法限制的是常量流出速率,從而使突發流入速率平滑。

比如服務器空閑時,理論上使用漏桶算法服務器可以直接處理一次洪峰(一次洪水過程的最大流量),但是漏桶算法處理請求的速率是恒定的,因此,前期服務器資源只能根據恒定的漏水速度逐步處理請求,無法直接處理這次洪峰。而使用令牌桶算法就不存在這個問題,因為它可以先把令牌桶一次性裝滿,處理一次洪峰之后再走限流。

總結

限流的常見算法有以下 3 種:

  • 計數器算法:實現簡單,但有突刺現象;
  • 漏桶算法:固定速率處理請求,處理任意流量更加平滑,可以實現流量整形;
  • 令牌桶算法:通過控制桶中的令牌實現限流,可以處理一定的突發流量,比如處理一次洪峰。
責任編輯:姜華 來源: Java中文社群
相關推薦

2023-02-20 08:08:48

限流算法計數器算法令牌桶算法

2024-02-26 14:07:18

2021-09-30 07:57:13

排序算法面試

2023-11-28 09:19:12

2021-05-27 05:37:10

HTTP請求頭瀏覽器

2024-06-05 10:07:00

限流微服務算法

2024-12-09 07:10:00

限流系統

2022-03-21 07:35:34

處理方式跨域

2021-09-26 10:57:16

集合操作場景

2025-03-26 01:25:00

MySQL優化事務

2023-11-20 10:09:59

2024-03-07 17:21:12

HotSpotJVMHot Code

2021-10-29 09:40:21

設計模式軟件

2024-02-04 10:08:34

2024-12-25 15:44:15

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2021-08-11 08:53:23

Git命令面試

2024-03-12 14:36:44

微服務HTTPRPC

2021-08-02 08:34:20

React性能優化

2021-07-01 07:51:45

React事件綁定
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚州影院 | 国产综合精品一区二区三区 | 免费在线一区二区三区 | 国产免费观看视频 | 久久久精品一区二区三区四季av | 日韩精品成人 | 欧美人成在线视频 | av免费看在线 | 成年无码av片在线 | 国产成人一区二区三区电影 | 精品久久久久一区二区国产 | 精产国产伦理一二三区 | 欧美1页 | 一区二区三区免费看 | 青青草一区 | 中文字幕在线观看一区 | 国产黄色大片 | 成人在线免费电影 | 久久国产精99精产国高潮 | 日本一区二区在线视频 | 久草视频观看 | 免费观看一级毛片视频 | 二区国产 | 久久精品欧美一区二区三区不卡 | 欧美三区视频 | 九色一区 | 欧美一级黄视频 | 国产一区二区三区四区三区四 | 五月婷婷丁香婷婷 | 成人在线精品视频 | 精品国产乱码久久久久久图片 | 午夜精品一区二区三区在线观看 | 欧美一级久久 | 久久久久久高潮国产精品视 | 亚洲成人在线视频播放 | 中文字幕一区二区三区四区不卡 | 色免费在线视频 | 丁香色婷婷 | 国产色网 | 亚洲欧美日韩精品久久亚洲区 | 精品日韩一区二区 |