欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

電子工程師 ? 來源:樓仔 ? 作者:樓仔 ? 2022-10-09 17:53 ? 次閱讀

來源:樓仔

常用限流方式

計(jì)數(shù)器

滑動(dòng)窗口

漏桶

令牌桶

Redis + Lua 分布式限流

聊聊其它

限流對(duì)比

什么是限流呢?限流是限制到達(dá)系統(tǒng)的并發(fā)請(qǐng)求數(shù)量,保證系統(tǒng)能夠正常響應(yīng)部分用戶請(qǐng)求,而對(duì)于超過限制的流量,則通過拒絕服務(wù)的方式保證整體系統(tǒng)的可用性。

根據(jù)限流作用范圍,可以分為單機(jī)限流和分布式限流 ;根據(jù)限流方式,又分為計(jì)數(shù)器、滑動(dòng)窗口、漏桶和令牌桶限流 ,下面我們對(duì)這塊詳細(xì)進(jìn)行講解。

常用限流方式

計(jì)數(shù)器

計(jì)數(shù)器是一種最簡單限流算法,其原理就是:在一段時(shí)間間隔內(nèi),對(duì)請(qǐng)求進(jìn)行計(jì)數(shù),與閥值進(jìn)行比較判斷是否需要限流,一旦到了時(shí)間臨界點(diǎn),將計(jì)數(shù)器清零。

這個(gè)就像你去坐車一樣,車廂規(guī)定了多少個(gè)位置,滿了就不讓上車了,不然就是超載了,被交警叔叔抓到了就要罰款的,如果我們的系統(tǒng)那就不是罰款的事情了,可能直接崩掉了。

程序執(zhí)行邏輯:

可以在程序中設(shè)置一個(gè)變量 count,當(dāng)過來一個(gè)請(qǐng)求我就將這個(gè)數(shù) +1,同時(shí)記錄請(qǐng)求時(shí)間。

當(dāng)下一個(gè)請(qǐng)求來的時(shí)候判斷 count 的計(jì)數(shù)值是否超過設(shè)定的頻次,以及當(dāng)前請(qǐng)求的時(shí)間和第一次請(qǐng)求時(shí)間是否在 1 分鐘內(nèi)。

如果在 1 分鐘內(nèi)并且超過設(shè)定的頻次則證明請(qǐng)求過多,后面的請(qǐng)求就拒絕掉。

如果該請(qǐng)求與第一個(gè)請(qǐng)求的間隔時(shí)間大于計(jì)數(shù)周期,且 count 值還在限流范圍內(nèi),就重置 count。

那么問題來了,如果有個(gè)需求對(duì)于某個(gè)接口 /query 每分鐘最多允許訪問 200 次,假設(shè)有個(gè)用戶在第 59 秒的最后幾毫秒瞬間發(fā)送 200 個(gè)請(qǐng)求,當(dāng) 59 秒結(jié)束后 Counter 清零了,他在下一秒的時(shí)候又發(fā)送 200 個(gè)請(qǐng)求。

那么在 1 秒鐘內(nèi)這個(gè)用戶發(fā)送了 2 倍的請(qǐng)求,這個(gè)是符合我們的設(shè)計(jì)邏輯的,這也是計(jì)數(shù)器方法的設(shè)計(jì)缺陷,系統(tǒng)可能會(huì)承受惡意用戶的大量請(qǐng)求,甚至擊穿系統(tǒng)。這種方法雖然簡單,但也有個(gè)大問題就是沒有很好的處理單位時(shí)間的邊界。

ab27270e-46ae-11ed-96c9-dac502259ad0.png

不過說實(shí)話,這個(gè)計(jì)數(shù)引用了鎖,在高并發(fā)場景,這個(gè)方式可能不太實(shí)用,我建議將鎖去掉,然后將 l.count++ 的邏輯通過原子計(jì)數(shù)處理,這樣就可以保證 l.count 自增時(shí)不會(huì)被多個(gè)線程同時(shí)執(zhí)行,即通過原子計(jì)數(shù)的方式實(shí)現(xiàn)限流。

滑動(dòng)窗口

滑動(dòng)窗口是針對(duì)計(jì)數(shù)器存在的臨界點(diǎn)缺陷,所謂滑動(dòng)窗口(Sliding window)是一種流量控制技術(shù),這個(gè)詞出現(xiàn)在 TCP 協(xié)議中?;瑒?dòng)窗口把固定時(shí)間片進(jìn)行劃分,并且隨著時(shí)間的流逝,進(jìn)行移動(dòng),固定數(shù)量的可以移動(dòng)的格子,進(jìn)行計(jì)數(shù)并判斷閥值。

ab4bea62-46ae-11ed-96c9-dac502259ad0.png

上圖中我們用紅色的虛線代表一個(gè)時(shí)間窗口(一分鐘),每個(gè)時(shí)間窗口有 6 個(gè)格子,每個(gè)格子是 10 秒鐘。每過 10 秒鐘時(shí)間窗口向右移動(dòng)一格,可以看紅色箭頭的方向。我們?yōu)槊總€(gè)格子都設(shè)置一個(gè)獨(dú)立的計(jì)數(shù)器 Counter,假如一個(gè)請(qǐng)求在 0:45 訪問了那么我們將第五個(gè)格子的計(jì)數(shù)器 +1(也是就是 0:40~0:50),在判斷限流的時(shí)候需要把所有格子的計(jì)數(shù)加起來和設(shè)定的頻次進(jìn)行比較即可。

那么滑動(dòng)窗口如何解決我們上面遇到的問題呢?來看下面的圖:

ab5bfb96-46ae-11ed-96c9-dac502259ad0.png

當(dāng)用戶在 0:59 秒鐘發(fā)送了 200 個(gè)請(qǐng)求就會(huì)被第六個(gè)格子的計(jì)數(shù)器記錄 +200,當(dāng)下一秒的時(shí)候時(shí)間窗口向右移動(dòng)了一個(gè),此時(shí)計(jì)數(shù)器已經(jīng)記錄了該用戶發(fā)送的 200 個(gè)請(qǐng)求,所以再發(fā)送的話就會(huì)觸發(fā)限流,則拒絕新的請(qǐng)求。

其實(shí)計(jì)數(shù)器就是滑動(dòng)窗口啊,只不過只有一個(gè)格子而已,所以想讓限流做的更精確只需要?jiǎng)澐指嗟母褡泳涂梢粤耍瑸榱烁_我們也不知道到底該設(shè)置多少個(gè)格子,格子的數(shù)量影響著滑動(dòng)窗口算法的精度,依然有時(shí)間片的概念,無法根本解決臨界點(diǎn)問題。

漏桶

漏桶算法(Leaky Bucket),原理就是一個(gè)固定容量的漏桶,按照固定速率流出水滴。

用過水龍頭都知道,打開龍頭開關(guān)水就會(huì)流下滴到水桶里,而漏桶指的是水桶下面有個(gè)漏洞可以出水,如果水龍頭開的特別大那么水流速就會(huì)過大,這樣就可能導(dǎo)致水桶的水滿了然后溢出。

abc2225e-46ae-11ed-96c9-dac502259ad0.png

一個(gè)固定容量的桶,有水流進(jìn)來,也有水流出去。對(duì)于流進(jìn)來的水來說,我們無法預(yù)計(jì)一共有多少水會(huì)流進(jìn)來,也無法預(yù)計(jì)水流的速度。但是對(duì)于流出去的水來說,這個(gè)桶可以固定水流出的速率(處理速度),從而達(dá)到流量整形和流量控制的效果。

漏桶算法有以下特點(diǎn):

漏桶具有固定容量,出水速率是固定常量(流出請(qǐng)求)

如果桶是空的,則不需流出水滴

可以以任意速率流入水滴到漏桶(流入請(qǐng)求)

如果流入水滴超出了桶的容量,則流入的水滴溢出(新請(qǐng)求被拒絕)

漏桶限制的是常量流出速率(即流出速率是一個(gè)固定常量值),所以最大的速率就是出水的速率,不能出現(xiàn)突發(fā)流量。

令牌桶

令牌桶算法(Token Bucket)是網(wǎng)絡(luò)流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種算法。典型情況下,令牌桶算法用來控制發(fā)送到網(wǎng)絡(luò)上的數(shù)據(jù)的數(shù)目,并允許突發(fā)數(shù)據(jù)的發(fā)送。

abe49b2c-46ae-11ed-96c9-dac502259ad0.png

我們有一個(gè)固定的桶,桶里存放著令牌(token)。一開始桶是空的,系統(tǒng)按固定的時(shí)間(rate)往桶里添加令牌,直到桶里的令牌數(shù)滿,多余的請(qǐng)求會(huì)被丟棄。當(dāng)請(qǐng)求來的時(shí)候,從桶里移除一個(gè)令牌,如果桶是空的則拒絕請(qǐng)求或者阻塞。

令牌桶有以下特點(diǎn):

令牌按固定的速率被放入令牌桶中

桶中最多存放 B 個(gè)令牌,當(dāng)桶滿時(shí),新添加的令牌被丟棄或拒絕

如果桶中的令牌不足 N 個(gè),則不會(huì)刪除令牌,且請(qǐng)求將被限流(丟棄或阻塞等待)

令牌桶限制的是平均流入速率 (允許突發(fā)請(qǐng)求,只要有令牌就可以處理,支持一次拿3個(gè)令牌,4個(gè)令牌...),并允許一定程度突發(fā)流量,所以也是非常常用的限流算法。

Redis + Lua 分布式限流

單機(jī)版限流僅能保護(hù)自身節(jié)點(diǎn),但無法保護(hù)應(yīng)用依賴的各種服務(wù),并且在進(jìn)行節(jié)點(diǎn)擴(kuò)容、縮容時(shí)也無法準(zhǔn)確控制整個(gè)服務(wù)的請(qǐng)求限制。

而分布式限流,以集群為維度,可以方便的控制這個(gè)集群的請(qǐng)求限制,從而保護(hù)下游依賴的各種服務(wù)資源。

分布式限流最關(guān)鍵的是要將限流服務(wù)做成原子化 ,我們可以借助 Redis 的計(jì)數(shù)器,Lua 執(zhí)行的原子性,進(jìn)行分布式限流,大致的 Lua 腳本代碼如下:

localkey="rate.limit:"..KEYS[1]--限流KEY

locallimit=tonumber(ARGV[1])--限流大小

localcurrent=tonumber(redis.call('get',key)or"0")

ifcurrent+1>limitthen--如果超出限流大小

return0

else--請(qǐng)求數(shù)+1,并設(shè)置1秒過期

redis.call("INCRBY",key,"1")

redis.call("expire",key,"1")

returncurrent+1

end

限流邏輯(Java 語言):

publicstaticbooleanaccquire()throwsIOException,URISyntaxException{

Jedisjedis=newJedis("127.0.0.1");

FileluaFile=newFile(RedisLimitRateWithLUA.class.getResource("/").toURI().getPath()+"limit.lua");

StringluaScript=FileUtils.readFileToString(luaFile);



Stringkey="ip:"+System.currentTimeMillis()/1000;//當(dāng)前秒

Stringlimit="5";//最大限制

Listkeys=newArrayList();

keys.add(key);

Listargs=newArrayList();

args.add(limit);

Longresult=(Long)(jedis.eval(luaScript,keys,args));//執(zhí)行l(wèi)ua腳本,傳入參數(shù)

returnresult==1;

}

聊聊其它

上面的限流方式,主要是針對(duì)服務(wù)器進(jìn)行限流,我們也可以對(duì)容器進(jìn)行限流,比如 Tomcat、Nginx 等限流手段。

Tomcat 可以設(shè)置最大線程數(shù)(maxThreads),當(dāng)并發(fā)超過最大線程數(shù)會(huì)排隊(duì)等待執(zhí)行;而 Nginx 提供了兩種限流手段:一是控制速率,二是控制并發(fā)連接數(shù)。

對(duì)于 Java 語言,我們其實(shí)有相關(guān)的限流組件,比如大家常用的 RateLimiter,其實(shí)就是基于令牌桶算法 ,大家知道為什么唯獨(dú)選用令牌桶么?

在實(shí)際的限流場景中,我們也可以控制單個(gè) IP、城市、渠道、設(shè)備 id、用戶 id 等在一定時(shí)間內(nèi)發(fā)送的請(qǐng)求數(shù);如果是開放平臺(tái),需要為每個(gè) appkey 設(shè)置獨(dú)立的訪問速率規(guī)則。

限流對(duì)比

下面我們就對(duì)常用的線程策略,總結(jié)它們的優(yōu)缺點(diǎn),便于以后選型。

計(jì)數(shù)器:

優(yōu)點(diǎn):固定時(shí)間段計(jì)數(shù),實(shí)現(xiàn)簡單,適用不太精準(zhǔn)的場景;

缺點(diǎn):對(duì)邊界沒有很好處理,導(dǎo)致限流不能精準(zhǔn)控制。

滑動(dòng)窗口:

優(yōu)點(diǎn):將固定時(shí)間段分塊,時(shí)間比“計(jì)數(shù)器”復(fù)雜,適用于稍微精準(zhǔn)的場景;

缺點(diǎn):實(shí)現(xiàn)稍微復(fù)雜,還是不能徹底解決“計(jì)數(shù)器”存在的邊界問題。

漏桶:

優(yōu)點(diǎn):可以很好的控制消費(fèi)頻率;

缺點(diǎn):實(shí)現(xiàn)稍微復(fù)雜,單位時(shí)間內(nèi),不能多消費(fèi),感覺不太靈活。

令牌桶:

優(yōu)點(diǎn):可以解決“漏桶”不能靈活消費(fèi)的問題,又能避免過渡消費(fèi),強(qiáng)烈推薦;

缺點(diǎn):實(shí)現(xiàn)稍微復(fù)雜,其它缺點(diǎn)沒有想到。

Redis + Lua 分布式限流:

優(yōu)點(diǎn):支持分布式限流,有效保護(hù)下游依賴的服務(wù)資源;

缺點(diǎn):依賴 Redis,對(duì)邊界沒有很好處理,導(dǎo)致限流不能精準(zhǔn)控制。

聲明:本文內(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)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4631

    瀏覽量

    93421
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2276

    瀏覽量

    95048
  • 限流
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    22572
  • Lua
    Lua
    +關(guān)注

    關(guān)注

    0

    文章

    81

    瀏覽量

    10608
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    379

    瀏覽量

    10966

原文標(biāo)題:沒有10年的功力,根本不可能設(shè)計(jì)出這么好的高并發(fā)限流方案!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    常用限流工具RateLimiter

    今天我們繼續(xù)看看Guava,其中比較常用限流工具RateLimiter Guava RateLimiter 有沒有搞錯(cuò),別人都在提升系統(tǒng)的訪問并發(fā)量,你卻在這搞限制? 我們都知道,服務(wù)器資源是有限
    的頭像 發(fā)表于 09-25 15:03 ?2871次閱讀
    <b class='flag-5'>常用</b>的<b class='flag-5'>限流</b>工具RateLimiter

    標(biāo)準(zhǔn)限流電路

    標(biāo)準(zhǔn)限流電路 圖 標(biāo)準(zhǔn)限流電路 在簡單串聯(lián)穩(wěn)
    發(fā)表于 07-20 15:50 ?1.1w次閱讀
    標(biāo)準(zhǔn)<b class='flag-5'>限流</b>電路

    滑動(dòng)變阻器限流式與分壓式的區(qū)別分析

    都是變阻器與“電表——待測電阻”系統(tǒng)之間的連接方式。分壓是變相的并聯(lián),限流是串聯(lián)。分壓測量范圍廣,更常用限流可以保護(hù)元件,一般需要計(jì)算。所謂限流
    發(fā)表于 11-29 10:40 ?7w次閱讀
    滑動(dòng)變阻器<b class='flag-5'>限流</b>式與分壓式的區(qū)別<b class='flag-5'>分析</b>

    混合型限流及開斷技術(shù)綜述

    的應(yīng)用前景。文章詳細(xì)介紹了混合型限流斷路器、混合型限流熔斷器、混合型超導(dǎo)限流器和混合型液態(tài)金屬限流器的工作原理及其發(fā)展現(xiàn)狀,對(duì)不同的拓?fù)?b class='flag-5'>方案
    發(fā)表于 12-29 14:40 ?6次下載
    混合型<b class='flag-5'>限流</b>及開斷技術(shù)綜述

    一種飽和鐵心橋式故障限流

    的體積和成本;通過外加限流電感,有效提高了限流器的限流效果。首先分析飽和鐵心型橋式故障限流器的工作原理,然后建立
    發(fā)表于 01-29 11:23 ?0次下載
    一種飽和鐵心橋式故障<b class='flag-5'>限流</b>器

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

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

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

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

    一文詳解限流算法的實(shí)現(xiàn)方式

    不依賴外部庫的情況下,限流算法有什么實(shí)現(xiàn)的思路?本文介紹了3種實(shí)現(xiàn)限流方式
    的頭像 發(fā)表于 05-25 12:00 ?1454次閱讀

    什么是限流,怎樣使用限流?

    所有輸出電流都會(huì)流經(jīng)限流電阻,它是一個(gè)放置在運(yùn)算放大器反饋回路內(nèi)的低歐姆值電阻。將限流電阻放置在反饋回路內(nèi)十分必要,這樣電壓下降就不會(huì)在輸出中顯示為錯(cuò)誤。
    的頭像 發(fā)表于 11-30 11:06 ?4407次閱讀

    Redis實(shí)現(xiàn)限流的三種方式分享

    當(dāng)然,限流有許多種實(shí)現(xiàn)的方式,Redis具有很強(qiáng)大的功能,我用Redis實(shí)踐了三種的實(shí)現(xiàn)方式,可以較為簡單的實(shí)現(xiàn)其方式。
    的頭像 發(fā)表于 02-22 09:52 ?1138次閱讀

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

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

    限流電阻和分壓電阻的區(qū)別

    限流電阻和分壓電阻的區(qū)別? 限流電阻和分壓電阻是電路中常用的兩種電阻,雖然它們都是電阻,但在實(shí)際應(yīng)用中,兩者存在較大的區(qū)別。本文將從定位、功能、應(yīng)用等角度對(duì)限流電阻和分壓電阻進(jìn)行詳盡、
    的頭像 發(fā)表于 09-14 16:48 ?2935次閱讀

    限流器是啥 常見的限流

    限流器通常會(huì)根據(jù)特定條件對(duì)電流進(jìn)行調(diào)整。當(dāng)電流超過設(shè)定的閾值時(shí),限流器將引入額外的電阻或其他形式的阻抗,以限制電流的流動(dòng)。
    的頭像 發(fā)表于 02-06 13:51 ?4031次閱讀

    Redis實(shí)現(xiàn)分布式多規(guī)則限流方式介紹

    市面上很多介紹 Redis 如何實(shí)現(xiàn)限流的,但是大部分都有一個(gè)缺點(diǎn),就是只能實(shí)現(xiàn)單一的限流,比如 1 分鐘訪問 1 次或者 60 分鐘訪問 10 次這種,但是如果想一個(gè)接口兩種規(guī)則都需要滿足呢,我們的項(xiàng)目又是分布式項(xiàng)目,應(yīng)該如何解決,下面就介紹一下 Redis 實(shí)現(xiàn)分布式
    的頭像 發(fā)表于 02-26 10:07 ?576次閱讀
    Redis實(shí)現(xiàn)分布式多規(guī)則<b class='flag-5'>限流</b>的<b class='flag-5'>方式</b>介紹

    限流電阻怎么接入電路_限流電阻有正負(fù)極嗎

    限流電阻的接入電路方式主要取決于具體的應(yīng)用場景和電路要求。以下是一些常見的接入方法:   一、串聯(lián)接入電路   基本串聯(lián)方式:   將限流電阻直接串聯(lián)在需要
    的頭像 發(fā)表于 10-24 17:03 ?1646次閱讀