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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

常用的限流工具RateLimiter

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

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

Guava RateLimiter

有沒有搞錯(cuò),別人都在提升系統(tǒng)的訪問并發(fā)量,你卻在這搞限制?

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

簡介

限流器顧名思義,就是對(duì)流量的限制,準(zhǔn)確的說應(yīng)該是流量控制,當(dāng)然并不是無理由的進(jìn)行流量控制,應(yīng)該是在計(jì)算機(jī)硬件能夠承載的范圍內(nèi),防止系統(tǒng)突然流量過高導(dǎo)致系統(tǒng)資源耗盡,最終 系統(tǒng)宕機(jī)或崩潰,使得服務(wù)器上的應(yīng)用全部掛掉。限流器是在保證應(yīng)用能夠正常提供服務(wù)的前提下,通過流量控制實(shí)現(xiàn)對(duì)服務(wù)的一種保護(hù)手段。

當(dāng)然流量的閾值到底是多少比較合適,這個(gè)可能需要根據(jù)實(shí)際硬件配置、系統(tǒng)環(huán)境以前其他相關(guān)參數(shù)經(jīng)過各種測試與驗(yàn)證才能知道...

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

核心

有幾個(gè)核心概念需要先了解到:

  • 限流的目標(biāo)對(duì)象:請(qǐng)求數(shù)量、網(wǎng)絡(luò)流量、用戶訪問次數(shù)...
  • 限流的維度:時(shí)間、IP、用戶
  • 限流的實(shí)現(xiàn)層面:前端頁面、WEB代理、服務(wù)接口...

應(yīng)用場景

  1. 防止服務(wù)接口短時(shí)間涌入大量請(qǐng)求導(dǎo)致服務(wù)器資源快速耗盡最終服務(wù)無法訪問
  2. 突發(fā)流量時(shí)通過排隊(duì)策略實(shí)現(xiàn)流量削峰,杜絕對(duì)服務(wù)器的沖擊
  3. 針對(duì)ip、或用戶控制對(duì)某個(gè)資源的訪問次數(shù)
  4. 針對(duì)高頻接口,控制單位時(shí)間內(nèi)允許的請(qǐng)求次數(shù)
  5. 結(jié)合ip或其他因子防爬蟲

限流方法

這里我們主要討論后端基于請(qǐng)求量的限流,限流是一種非常廣泛的應(yīng)用技術(shù),就比如你在登錄系統(tǒng)時(shí),經(jīng)常會(huì)需要你輸入手機(jī)驗(yàn)證、動(dòng)態(tài)碼或一些奇奇怪怪的驗(yàn)證方式, 來降低登錄請(qǐng)求的頻次。

  • 計(jì)數(shù)限流

按數(shù)量進(jìn)行控制,達(dá)到設(shè)置的閾值則進(jìn)行限流,其中 固定窗口滑動(dòng)窗口則是通過該方法實(shí)現(xiàn)。

  • 固定窗口

通過控制時(shí)間單元內(nèi)允許的 請(qǐng)求數(shù)量 ,一旦達(dá)到閾值,則不會(huì)處理該請(qǐng)求后續(xù)相關(guān)的業(yè)務(wù)或者直接讓請(qǐng)求快速失敗并給予提示。

圖片

比如我們配置10s內(nèi)允許請(qǐng)求的流量為1000,在第19s內(nèi)請(qǐng)求為0,在第910秒內(nèi)的請(qǐng)求數(shù)為1000,這樣一秒內(nèi)的請(qǐng)求就達(dá)到了1000。當(dāng)然我們可以時(shí)間單元?jiǎng)澐殖筛×6龋?但是應(yīng)該多小才合適呢?

問題:只能對(duì)時(shí)間單元內(nèi)的總請(qǐng)求數(shù)進(jìn)行控制,當(dāng)請(qǐng)求集中在較小時(shí)間范圍內(nèi)時(shí),無法達(dá)到流量限制的效果,因此這是一種粗粒度的流量限制手段

  • 滑動(dòng)窗口

為了解決固定窗口算法中存在的問題,通過滑動(dòng)窗口的方法,將上述時(shí)間單元?jiǎng)澐殖啥鄠€(gè)細(xì)粒度的時(shí)間窗口,每個(gè)窗口都有自己獨(dú)立的請(qǐng)求計(jì)數(shù)器,這樣就可以讓時(shí)間單元內(nèi)的流量控制均勻地 落在各個(gè)時(shí)間窗口上,同時(shí)滑動(dòng)的時(shí)間窗口可以形成連續(xù)時(shí)間區(qū)間控制,并不像固定窗口那樣只在兩個(gè)時(shí)間刻度間。

圖片

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

問題:滑動(dòng)窗口的區(qū)間劃分的越多,則滑動(dòng)窗口的滾動(dòng)就越平滑,限流的統(tǒng)計(jì)就會(huì)越精確,但也需要更多的資源為窗口時(shí)間片段保存計(jì)數(shù)器,從而耗費(fèi)系統(tǒng)資源

  • 漏桶算法

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

圖片

問題:當(dāng)短時(shí)間內(nèi)如果有大量的突發(fā)請(qǐng)求時(shí),即使服務(wù)器負(fù)載不高,每個(gè)請(qǐng)求也需要等待一段時(shí)間(水滴間隔)才能被響應(yīng)

  • 令牌桶算法

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

圖片

實(shí)現(xiàn)示例

固定窗口

public class FixedWindowLimiter {
    /**
     * 時(shí)間單元 ms
     */
    private long timeUnit;

    /**
     * 時(shí)間單元內(nèi)的閾值
     */
    private long limit;

    /**
     * 開始時(shí)間
     */
    private long startTime;

    /**
     * 計(jì)數(shù)器
     */
    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;
        }
        // 在一個(gè)時(shí)間單元內(nèi)
        if(now - startTime <= timeUnit){
            count ++;
            return count <= limit;
        }else{// 超過時(shí)間單元、
            startTime = now;
            count = 0;
            return true;
        }
    }

Guava RateLimiter

  • 令牌桶算法實(shí)現(xiàn)
  • 支持預(yù)熱
  • 支持突發(fā)流量
配置說明
permitsPerSecond單位時(shí)間內(nèi)產(chǎn)生令牌數(shù)量
warmupPeriod預(yù)熱期
unit預(yù)熱期時(shí)間單位

創(chuàng)建RateLimiter,每秒發(fā)放6個(gè)令牌,平均間隔167ms一個(gè),其中有3秒的預(yù)熱期

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

使用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次,距離開始的時(shí)間:%sms,間隔時(shí)間:%sms", i, duration, duration-last));

            if( i == 20 ){
                // 中間暫停5秒,看看申請(qǐng)令牌的時(shí)間間隔變化
                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次,距離開始的時(shí)間:%sms,間隔時(shí)間:%sms", i, duration2, duration2-last2));
            }
        }
    }

結(jié)果:大約3秒后進(jìn)入平穩(wěn)期

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

結(jié)束語

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9304

    瀏覽量

    86066
  • 限流器
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    14522
  • 網(wǎng)絡(luò)流量
    +關(guān)注

    關(guān)注

    0

    文章

    58

    瀏覽量

    10429
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    常用質(zhì)量工具培訓(xùn)資料

    常用質(zhì)量工具培訓(xùn)資料解決問題的一般途徑常用質(zhì)量工具的原理常用質(zhì)量工具的應(yīng)用解決問題的一般途徑舊七
    發(fā)表于 07-30 10:57 ?34次下載

    電工常用工具的使用技巧

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

    常用工具軟件

    電子發(fā)燒友網(wǎng)站提供《常用工具軟件.rar》資料免費(fèi)下載
    發(fā)表于 10-14 10:59 ?11次下載

    28個(gè)java常用工具

    28個(gè)java常用工具類。
    發(fā)表于 11-06 11:30 ?3次下載

    Java常用工具

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

    常用網(wǎng)絡(luò)調(diào)試工具

    [4]常用網(wǎng)絡(luò)調(diào)試工具_v1.0rc
    發(fā)表于 12-27 16:26 ?0次下載

    限流器的作用_限流器的工作原理

    本文首先介紹了限流器的作用和特征,然后分析了限流器的優(yōu)缺點(diǎn),最后粗略說明了限流器的工作原理并且從限流方式方面對(duì)限流器進(jìn)行了分類。
    的頭像 發(fā)表于 08-02 14:56 ?2.4w次閱讀

    電工常用工具儀表的使用

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

    應(yīng)對(duì)高并發(fā)的手段之一自適應(yīng)限流

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

    常用串口通信測試工具sscom

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

    常用藍(lán)牙調(diào)試工具分享

    該部分主要分享一下常用的藍(lán)牙調(diào)試工具,方便后續(xù)藍(lán)牙抓包及分析。
    的頭像 發(fā)表于 07-25 10:16 ?6848次閱讀

    常用限流方式分析 怎么設(shè)計(jì)出高并發(fā)限流方案

    來源:樓仔 常用限流方式 計(jì)數(shù)器 滑動(dòng)窗口 漏桶 令牌桶 Redis + Lua 分布式限流 聊聊其它 限流對(duì)比 什么是限流呢?
    的頭像 發(fā)表于 10-09 17:53 ?1754次閱讀

    kali常用工具匯總

    本文將kali中常用工具進(jìn)行了匯總。對(duì)每個(gè)工具的具體用途做了大概的描述。希望通過本文,能對(duì)初學(xué)kali的小伙伴有所幫助。當(dāng)然里面部分工具可能隨著系統(tǒng)版本的提高而移除,但我們?nèi)钥砂惭b。
    的頭像 發(fā)表于 02-10 15:44 ?1436次閱讀

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

    需要注意的是借助Redis實(shí)現(xiàn)的限流方案可用于分布式系統(tǒng),而guava實(shí)現(xiàn)的限流只能應(yīng)用于單機(jī)環(huán)境。如果你覺得服務(wù)器端限流麻煩,可以在不改任何代碼的情況下直接使用容器限流(Nginx或
    發(fā)表于 04-08 10:50 ?453次閱讀

    分布式限流簡介

    限流是生產(chǎn)中經(jīng)常遇到的一個(gè)場景, 目前現(xiàn)有的一個(gè)工具大部分是提供單機(jī)限流的能力, 例如 google 的 guava 中提供的 RateLimiter. 但是生產(chǎn)環(huán)境大部分是分布式環(huán)境
    的頭像 發(fā)表于 05-16 16:40 ?1105次閱讀
    分布式<b class='flag-5'>限流</b>簡介
    主站蜘蛛池模板: 99免费视频观看 | 色丁香在线观看 | 久久综合九色综合欧美狠狠 | 最近2018中文字幕免费看在线 | 中文字幕在线播放第一页 | 国产一区二区三区夜色 | japan日韩xxxx69hd jdav视频在线观看 | 夜夜操国产 | 欧美日韩亚洲国产一区二区综合 | 四虎影院精品在线观看 | 在线看你懂得 | аⅴ资源天堂8在线 | 四虎成人免费网站在线 | 天天看天天爽天天摸天天添 | 性生交大片免费一级 | 一区二区三区视频网站 | 四虎国产精品4hu永久 | 中文字幕一区二区三区不卡 | 免费番茄社区性色大片 | 玖玖国产在线观看 | 爽好舒服快受不了了老师 | 午夜精品视频在线观看美女 | 亚洲合集综合久久性色 | 国产va免费精品观看 | 萌白酱一线天粉嫩喷水在线观看 | 曰韩毛片 | 99久热| 国产综合图片 | 三级黄色短视频 | 国产成人夜间影院在线观看 | 在线免费你懂的 | www.亚洲免费 | 天天谢天天干 | 日韩成人影院 | 91精品久久国产青草 | 综合爱| 丁香婷婷社区 | 国产精品偷伦费观看 | 影音先锋在线亚洲精品推荐 | 女人张开腿 让男人桶个爽 免费观看 | a站在线观看 |