<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          簡(jiǎn)析限流算法

          共 1865字,需瀏覽 4分鐘

           ·

          2022-07-04 19:48

          程序員的成長(zhǎng)之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
          關(guān)注


          閱讀本文大概需要 2.8 分鐘。

          來(lái)自:http://gwrld.cn/UG48Q

          # 簡(jiǎn)介


          限流顧名思義是限制流量,限制流量的目的是為了保障服務(wù)穩(wěn)定運(yùn)行,避免服務(wù)被流量沖垮。當(dāng)流量超出服務(wù)處理能力時(shí),部分請(qǐng)求將會(huì)被限流組件攔截。


          被攔截的請(qǐng)求可能會(huì)被丟棄,如果是 C 端請(qǐng)求,那么這個(gè)請(qǐng)求可能會(huì)被導(dǎo)向指定的錯(cuò)誤頁(yè)上,而不是生硬的拒絕。這里我們丟棄掉一部分請(qǐng)求,以保證大部分請(qǐng)求可以正常響應(yīng)。


          如果我們不這樣做,那么服務(wù)崩潰后,所有請(qǐng)求都將無(wú)法響應(yīng)了。當(dāng)一臺(tái)機(jī)器崩潰后,該機(jī)器的所有流量將由其他機(jī)器承擔(dān),這樣就會(huì)造成剩余機(jī)器壓力增大,進(jìn)而導(dǎo)致奔潰,最后形成雪崩。


          除此之外,服務(wù)崩潰還會(huì)造成數(shù)據(jù)不一致的嚴(yán)重問(wèn)題,特別是一些敏感數(shù)據(jù)。比如對(duì)于電商網(wǎng)站,如果后臺(tái)服務(wù)準(zhǔn)備將某筆訂單數(shù)據(jù)存入數(shù)據(jù)庫(kù)時(shí),服務(wù)突然崩潰,導(dǎo)致數(shù)據(jù)沒(méi)有落庫(kù)。這個(gè)時(shí)候,開(kāi)發(fā)同學(xué)就要想辦法修訂數(shù)據(jù)了。



          綜上,我們可以看出來(lái)限流的重要性。接下來(lái),我將向大家介紹三種常用的限流算法,分別是計(jì)數(shù)器、漏桶算法和令牌桶算法。下面我們從最簡(jiǎn)單的計(jì)數(shù)器開(kāi)始說(shuō)起。

          # 限流算法


          計(jì)數(shù)器


          計(jì)數(shù)器算法的思想很簡(jiǎn)單,每當(dāng)一個(gè)請(qǐng)求到來(lái)時(shí),我們就將計(jì)數(shù)器加一,當(dāng)計(jì)數(shù)器數(shù)值超過(guò)閾值后,就拒絕余下請(qǐng)求。一秒鐘后,我們將計(jì)數(shù)器清零,開(kāi)始新一輪的計(jì)數(shù)。計(jì)數(shù)器算法簡(jiǎn)單粗暴,易于實(shí)現(xiàn)。但是缺點(diǎn)也是有的,也就是所謂的"突刺現(xiàn)象"。


          舉例說(shuō)明一下,假如我們給計(jì)數(shù)器設(shè)置的閾值為100。系統(tǒng)瞬間內(nèi)(比如10毫秒內(nèi))有200個(gè)請(qǐng)求到來(lái),這個(gè)時(shí)候計(jì)數(shù)器只能放過(guò)其中的100個(gè)請(qǐng)求,余下的100個(gè)請(qǐng)求全部被拒絕掉。如果第二秒內(nèi)沒(méi)有請(qǐng)求到來(lái),那么系統(tǒng)就處于空閑狀態(tài)。也就是上一秒忙的要死,這一秒又閑的要死。


          如果我們能用一個(gè)容器將剩余的100個(gè)請(qǐng)求緩存起來(lái),待計(jì)數(shù)器重置后再將這些請(qǐng)求放出來(lái)。這樣系統(tǒng)在這兩秒內(nèi)的吞吐量就由100變成了200,提升了一倍。基于這個(gè)思考,下面我們?cè)賮?lái)看看漏桶算法。


          漏桶算法


          漏桶算法由流量容器、流量入口和出口組成。其中流量出口流速即為我們期望的限速值,比如 100 QPS。漏桶算法除了具備限流能力,還具備流量整型功能。下面我們通過(guò)一張圖來(lái)了解漏桶算法。



          如上圖,流入漏桶流量的流速是不恒定的,經(jīng)過(guò)漏桶限速后,流出流量的速度是恒定的。需要說(shuō)明的是,漏桶的容量是有限的,一旦流入流量超出漏桶容量,這部分流量只能被丟棄了。


          漏桶是一個(gè)比較好的限流整型工具,不過(guò)漏桶不能處理突發(fā)流量,一些觀(guān)點(diǎn)認(rèn)為這是它的一個(gè)缺點(diǎn)。不過(guò)如果較起真來(lái),我覺(jué)得這個(gè)缺點(diǎn)是不成立的。畢竟漏桶本就是用來(lái)平滑流量的,如果支持突發(fā),那么輸出流量反而不平滑了。如果要找一種能夠支持突發(fā)流量的限流算法,那么令牌桶算法可以滿(mǎn)足需求。


          令牌桶算法


          令牌桶和漏桶頗有幾分相似,只不過(guò)令牌通里存放的是令牌。它的運(yùn)行過(guò)程是這樣的,一個(gè)令牌工廠(chǎng)按照設(shè)定值定期向令牌桶發(fā)放令牌。當(dāng)令牌桶滿(mǎn)了后,多出的令牌會(huì)被丟棄掉。每當(dāng)一個(gè)請(qǐng)求到來(lái)時(shí),該請(qǐng)求對(duì)應(yīng)的線(xiàn)程會(huì)從令牌桶中取令牌。

          初期由于令牌桶中存放了很多個(gè)令牌,因此允許多個(gè)請(qǐng)求同時(shí)取令牌。當(dāng)桶中沒(méi)有令牌后,無(wú)法獲取到令牌的請(qǐng)求可以丟棄,或者重試。

          下面我們來(lái)看一下的令牌桶示意圖:



          盡管令牌桶允許突發(fā)流量,但突發(fā)流量速率 R1 + 限流速率 R2 不能超過(guò)系統(tǒng)最大的處理能力 Rt,即 R1 + R2 ≤ Rt,否則會(huì)沖垮系統(tǒng)。


          # 總結(jié)


          以上就是本篇文章的全部?jī)?nèi)容。本篇文章簡(jiǎn)單分析幾種常見(jiàn)限流算法的運(yùn)行過(guò)程,限于能力原因,文章若有錯(cuò)誤不妥之處還請(qǐng)指明。除了文字性描述,這里也把三種算法的簡(jiǎn)單實(shí)現(xiàn)代碼貼出來(lái) RateLimiter,有興趣的同學(xué)自取。

          好了,本篇文章到這里就結(jié)束了,感謝大家的閱讀。

          <END>

          推薦閱讀:

          為防止被00后整頓,一公司招聘要求員工不能起訴公司

          如何防止你的 jar 被反編譯?

          互聯(lián)網(wǎng)初中高級(jí)大廠(chǎng)面試題(9個(gè)G)

          內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬(wàn)并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!

          ?戳閱讀原文領(lǐng)取!                                  朕已閱 

          瀏覽 24
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲一区二区三区导航 | 插逼丝袜视频 | 成人网站视频免费在线观看 | 禁片网址| 综合色色婷婷 |