在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

常用的限流工具RateLimiter

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-09-25 15:03 ? 次閱讀

今天我們繼續看看Guava,其中比較常用的限流工具RateLimiter

Guava RateLimiter

有沒有搞錯,別人都在提升系統的訪問并發量,你卻在這搞限制?

我們都知道,服務器資源是有限的,當把應用部署在外網環境中,所有人都可以訪問你的應用,如果訪問人數上去了,你的服務器是否能夠支持足夠量的用戶訪問?在系統訪問高峰時期, 僅從代碼層面提供系統并發量,系統真的就能夠支持突然流量的沖擊?顯然是不可能的,如果誰讓你在不改變硬件配置的情況下,無限制的提高系統性能,你可以說他在白日做夢。

簡介

限流器顧名思義,就是對流量的限制,準確的說應該是流量控制,當然并不是無理由的進行流量控制,應該是在計算機硬件能夠承載的范圍內,防止系統突然流量過高導致系統資源耗盡,最終 系統宕機或崩潰,使得服務器上的應用全部掛掉。限流器是在保證應用能夠正常提供服務的前提下,通過流量控制實現對服務的一種保護手段。

當然流量的閾值到底是多少比較合適,這個可能需要根據實際硬件配置、系統環境以前其他相關參數經過各種測試與驗證才能知道...

本篇文章僅討論限流中相關的技術,在實際應用中使用的限流器,除了包含流量限制的作用,為了提高用戶體驗,還需要對流量超出是,做出對應的應對策略,比如直接拒絕服務,讓請求進行排隊 ,或者服務降級都是比較好的處理手段,這樣既能給用戶友好地體驗,又能保證服務正常。

核心

有幾個核心概念需要先了解到:

  • 限流的目標對象:請求數量、網絡流量、用戶訪問次數...
  • 限流的維度:時間、IP、用戶
  • 限流的實現層面:前端頁面、WEB代理、服務接口...

應用場景

  1. 防止服務接口短時間涌入大量請求導致服務器資源快速耗盡最終服務無法訪問
  2. 突發流量時通過排隊策略實現流量削峰,杜絕對服務器的沖擊
  3. 針對ip、或用戶控制對某個資源的訪問次數
  4. 針對高頻接口,控制單位時間內允許的請求次數
  5. 結合ip或其他因子防爬蟲

限流方法

這里我們主要討論后端基于請求量的限流,限流是一種非常廣泛的應用技術,就比如你在登錄系統時,經常會需要你輸入手機驗證、動態碼或一些奇奇怪怪的驗證方式, 來降低登錄請求的頻次。

  • 計數限流

按數量進行控制,達到設置的閾值則進行限流,其中 固定窗口滑動窗口則是通過該方法實現。

  • 固定窗口

通過控制時間單元內允許的 請求數量 ,一旦達到閾值,則不會處理該請求后續相關的業務或者直接讓請求快速失敗并給予提示。

圖片

比如我們配置10s內允許請求的流量為1000,在第19s內請求為0,在第910秒內的請求數為1000,這樣一秒內的請求就達到了1000。當然我們可以時間單元劃分成更小粒度, 但是應該多小才合適呢?

問題:只能對時間單元內的總請求數進行控制,當請求集中在較小時間范圍內時,無法達到流量限制的效果,因此這是一種粗粒度的流量限制手段

  • 滑動窗口

為了解決固定窗口算法中存在的問題,通過滑動窗口的方法,將上述時間單元劃分成多個細粒度的時間窗口,每個窗口都有自己獨立的請求計數器,這樣就可以讓時間單元內的流量控制均勻地 落在各個時間窗口上,同時滑動的時間窗口可以形成連續時間區間控制,并不像固定窗口那樣只在兩個時間刻度間。

圖片

比如時間單元為1s,每個時間窗口為100ms,在1秒內的10個時間窗口可以為09:01:01.00009:01:02.000、09:01:01.20009:01:02.800...

問題:滑動窗口的區間劃分的越多,則滑動窗口的滾動就越平滑,限流的統計就會越精確,但也需要更多的資源為窗口時間片段保存計數器,從而耗費系統資源

  • 漏桶算法

如果將請求看成水滴,限流器看成一個下面開口的桶(漏桶)。漏桶算法其實就是當水滴(請求)先進入到漏桶里,漏桶以一定的速度出水,當水流入速度過大時則會超過桶的可接納容量, 這時水將直接溢出,漏桶算法能強行限制數據的傳輸速率。使用漏桶算法,可以保證接口會以一個常速速率來處理請求,所以漏桶算法必定不會出現臨界問題。

圖片

問題:當短時間內如果有大量的突發請求時,即使服務器負載不高,每個請求也需要等待一段時間(水滴間隔)才能被響應

  • 令牌桶算法

令牌桶算法會以一個恒定的速度往桶里放入令牌,而如果請求需要被處理,則需要先從桶里獲取一個令牌,當桶里沒有令牌可取時,則拒絕服務。相比“漏桶算法”,“令牌桶算法”能夠在限制數據的平均傳輸速率的同時,還允許能應對流量突增的情況(允許突發請求,只要有足夠的令牌,支持一次拿多個令牌)。

圖片

實現示例

固定窗口

public class FixedWindowLimiter {
    /**
     * 時間單元 ms
     */
    private long timeUnit;

    /**
     * 時間單元內的閾值
     */
    private long limit;

    /**
     * 開始時間
     */
    private long startTime;

    /**
     * 計數器
     */
    private long count;

    public FixedWindowLimiter(long timeUnit, long limit) {
        this.timeUnit = timeUnit;
        this.limit = limit;
    }

    /**
     *
     * @return
     */
    public synchronized boolean acquire(){
        long now = System.currentTimeMillis();
        // 開始
        if( startTime == 0 ){
            startTime = now;
            count ++;
            return true;
        }
        // 在一個時間單元內
        if(now - startTime <= timeUnit){
            count ++;
            return count <= limit;
        }else{// 超過時間單元、
            startTime = now;
            count = 0;
            return true;
        }
    }

Guava RateLimiter

  • 令牌桶算法實現
  • 支持預熱
  • 支持突發流量
配置說明
permitsPerSecond單位時間內產生令牌數量
warmupPeriod預熱期
unit預熱期時間單位

創建RateLimiter,每秒發放6個令牌,平均間隔167ms一個,其中有3秒的預熱期

RateLimiter rateLimiter = RateLimiter.create(
            6, // 每秒發放令牌數量
            3, // 預熱期,在預熱期后逐步達到配置的令牌發放數量
            TimeUnit.SECONDS // 時間單位
    );

使用RateLimiter

@Test
    public void limit() throws InterruptedException {
        Stopwatch stopwatch = Stopwatch.createStarted();
        long last;
        for (int i=0; i < 100; i++){
            last = stopwatch.elapsed(TimeUnit.MILLISECONDS);
            rateLimiter.acquire();
            long duration = stopwatch.elapsed(TimeUnit.MILLISECONDS);
            System.out.println( String.format("第%s次,距離開始的時間:%sms,間隔時間:%sms", i, duration, duration-last));

            if( i == 20 ){
                // 中間暫停5秒,看看申請令牌的時間間隔變化
                TimeUnit.SECONDS.sleep(5);
                System.out.println("暫停5秒后...");
                long last2 = stopwatch.elapsed(TimeUnit.MILLISECONDS);
                rateLimiter.acquire(10);
                long duration2 = stopwatch.elapsed(TimeUnit.MILLISECONDS);
                System.out.println( String.format("第%s次,距離開始的時間:%sms,間隔時間:%sms", i, duration2, duration2-last2));
            }
        }
    }

結果:大約3秒后進入平穩期

第0次,距離開始的時間:0ms,間隔時間:0ms
第1次,距離開始的時間:483ms,間隔時間:483ms
第2次,距離開始的時間:926ms,間隔時間:443ms
第3次,距離開始的時間:1334ms,間隔時間:408ms
第4次,距離開始的時間:1703ms,間隔時間:369ms
第5次,距離開始的時間:2036ms,間隔時間:333ms
第6次,距離開始的時間:2333ms,間隔時間:297ms
第7次,距離開始的時間:2592ms,間隔時間:259ms
第8次,距離開始的時間:2815ms,間隔時間:223ms
第9次,距離開始的時間:2999ms,間隔時間:184ms
第10次,距離開始的時間:3166ms,間隔時間:167ms
第11次,距離開始的時間:3333ms,間隔時間:167ms
第12次,距離開始的時間:3500ms,間隔時間:167ms
第13次,距離開始的時間:3666ms,間隔時間:166ms
...
暫停5秒后...
第20次,距離開始的時間:9842ms,間隔時間:0ms
第21次,距離開始的時間:13009ms,間隔時間:3166ms
第22次,距離開始的時間:13176ms,間隔時間:167ms
第23次,距離開始的時間:13342ms,間隔時間:166ms
第24次,距離開始的時間:13510ms,間隔時間:168ms
第25次,距離開始的時間:13676ms,間隔時間:166ms
第26次,距離開始的時間:13843ms,間隔時間:167ms
第27次,距離開始的時間:14009ms,間隔時間:166ms
  • 預熱期 系統剛啟動或者長時間沒有收到請求時,限流器處于冷卻狀態,在預熱期間獲取令牌的時間會比平穩期獲取令牌的時間要長,隨著令牌的減少,獲取單個令牌的時間會慢慢變短,最終到達一個穩定值
  • acquire acquire是一個阻塞方法,通過RateLimiter會得到一個阻塞時間值
  • tryAcquire 非阻塞方法,快速返回令牌申請結果

結束語

作為微服務服務保證的三大利器,限流、熔斷、降級,了解其大概的大概的含義是非常有必要的,雖然現在有很多封裝好的限流框架,比如Sentinel、Resilience4j等,但技術是沒有止境的,當你往下探索 時,更多不可思議的知識,后面有機會我們從源碼,更底層來認識這些技術與設計思想。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9591

    瀏覽量

    86948
  • 限流器
    +關注

    關注

    0

    文章

    43

    瀏覽量

    14620
  • 網絡流量
    +關注

    關注

    0

    文章

    59

    瀏覽量

    10608
收藏 人收藏

    評論

    相關推薦

    常用質量工具培訓資料

    常用質量工具培訓資料解決問題的一般途徑常用質量工具的原理常用質量工具的應用解決問題的一般途徑舊七
    發表于 07-30 10:57 ?34次下載

    電工常用工具的使用技巧

    電工常用工具的使用技巧 扳手的使用  活絡扳手又叫活扳手,是一種旋緊或擰松有角螺絲釘或螺母的工具。電工常用的有200、250、300mm三種,使
    發表于 11-20 15:46 ?2140次閱讀

    常用工具軟件

    電子發燒友網站提供《常用工具軟件.rar》資料免費下載
    發表于 10-14 10:59 ?11次下載

    28個java常用工具

    28個java常用工具類。
    發表于 11-06 11:30 ?3次下載

    Java常用工具

    Java常用工具類。
    發表于 11-06 11:21 ?1次下載

    常用網絡調試工具

    [4]常用網絡調試工具_v1.0rc
    發表于 12-27 16:26 ?0次下載

    電工常用工具儀表的使用

    電工常用工具儀表的使用說明。
    發表于 03-18 11:48 ?22次下載

    應對高并發的手段之一自適應限流

    作為應對高并發的手段之一,限流并不是一個新鮮的話題了。從Guava的Ratelimiter到Hystrix,以及Sentinel都可作為限流工具。 Part1自適應
    的頭像 發表于 05-27 15:52 ?2249次閱讀
    應對高并發的手段之一自適應<b class='flag-5'>限流</b>

    常用串口通信測試工具sscom

    常用串口通信測試工具,是工程師手頭必備的工具軟件。
    發表于 06-07 15:11 ?2次下載

    常用藍牙調試工具分享

    該部分主要分享一下常用的藍牙調試工具,方便后續藍牙抓包及分析。
    的頭像 發表于 07-25 10:16 ?7150次閱讀

    常用限流方式分析 怎么設計出高并發限流方案

    來源:樓仔 常用限流方式 計數器 滑動窗口 漏桶 令牌桶 Redis + Lua 分布式限流 聊聊其它 限流對比 什么是限流呢?
    的頭像 發表于 10-09 17:53 ?1872次閱讀

    滲透測試中常用工具

    代理池是滲透測試中常用工具,用來躲避各種各樣的封IP的防火墻,也幫助自身隱藏蹤跡.
    的頭像 發表于 10-27 09:24 ?2133次閱讀

    kali常用工具匯總

    本文將kali中常用工具進行了匯總。對每個工具的具體用途做了大概的描述。希望通過本文,能對初學kali的小伙伴有所幫助。當然里面部分工具可能隨著系統版本的提高而移除,但我們仍可安裝。
    的頭像 發表于 02-10 15:44 ?1587次閱讀

    限流方案常用算法 常用限流方案

    需要注意的是借助Redis實現的限流方案可用于分布式系統,而guava實現的限流只能應用于單機環境。如果你覺得服務器端限流麻煩,可以在不改任何代碼的情況下直接使用容器限流(Nginx或
    發表于 04-08 10:50 ?534次閱讀

    分布式限流簡介

    限流是生產中經常遇到的一個場景, 目前現有的一個工具大部分是提供單機限流的能力, 例如 google 的 guava 中提供的 RateLimiter. 但是生產環境大部分是分布式環境
    的頭像 發表于 05-16 16:40 ?1204次閱讀
    分布式<b class='flag-5'>限流</b>簡介
    主站蜘蛛池模板: 在线成人免费 | 国模私拍福利一区二区 | 亚洲综合激情另类专区 | 欧美性猛交xxxx乱大交中文 | 在线免费看片a | 午夜视频h | 午夜影院啊啊啊 | 色97色| 久久99久久精品免费思思6 | 国产精品福利午夜一级毛片 | 久久精品国产夜色 | 色天天综合色天天碰 | 天天干天天要 | 人人天天夜夜 | 丁香婷婷亚洲六月综合色 | 美女性视频网站 | 亚洲精品美女在线观看 | 亚洲第一久久 | 在线观看不卡一区 | 性生生活三级视频在线观看 | 美女被异性狂揉下部羞羞视频 | 色国产视频 | 在线免费观看视频 | 69日本xxxxxxxx59 | 久久青草视频 | 国产精品视频久久久久 | 亚洲高清一区二区三区 | 成人午夜影院在线观看 | 久久一卡二卡 | 成年在线视频 | 国产福利2021最新在线观看 | 国产成人综合网 | 激激婷婷综合五 | 欧美性第一页 | 欧美成人 一区二区三区 | 在线免费观看你懂的 | h视频在线看 | 8888四色奇米在线观看不卡 | 伊人婷婷色香五月综合缴激情 | 欧美在线小视频 | 国产亚洲一区二区精品 |