<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>

          關(guān)于服務(wù)限速的那些事……

          共 1873字,需瀏覽 4分鐘

           ·

          2021-11-03 22:56

          前言

          前天,我們分享了guava工具包中的一個限速組件——RateLimiter,由于當(dāng)時說后續(xù)要繼續(xù)分享微服務(wù)限速的內(nèi)容,所以我又專門梳理微服務(wù)限速相關(guān)的解決方案,今天抽時間來做一個梳理。

          限流算法

          關(guān)于限速這塊的解決方案,從部署方面來說,主要分為兩大塊:

          一塊是單體應(yīng)用限速,我們之前說的RateLimiterSemaphore都屬于此類;

          另一塊是針對分布式服務(wù)的限流(集群部署),這一塊的解決方案也可應(yīng)用于單體服務(wù),其中絕大多數(shù)都是基于Redis這樣的緩存實現(xiàn)的,另外還有基于Nginx實現(xiàn)的。

          限流算法大致分為三類:計數(shù)器、漏桶和令牌桶。

          計數(shù)器算法

          計數(shù)器屬于比較常用的限流算法,計數(shù)器算法的原理是通過限制在一段時間內(nèi)接口被調(diào)用的次數(shù),來控制接口流量。比如釘釘消息接口的限流,一個第三方企業(yè)一分鐘只能發(fā)送3000條消息(具體數(shù)量我記不清楚),超過3000條的部分只能等一分鐘之后發(fā)送,這樣的場景就可以通過計數(shù)器算法來實現(xiàn)。

          實現(xiàn)原理

          實現(xiàn)方式也很簡單,可以通過緩存來實現(xiàn),我的思路是:在接口內(nèi)部最開始的地方,設(shè)置調(diào)用方的計數(shù)器(key為調(diào)用方唯一的身份信息),第一次調(diào)用時將其值設(shè)置為1并放進(jìn)緩存中,同時緩存設(shè)置過期時間,有效期內(nèi)每次調(diào)用計數(shù)器+1,時間過期,緩存會自動刪除??梢园严嚓P(guān)邏輯封裝成自定義注解,搞成通用組件,這樣只需要在需要限速的接口上加上對應(yīng)的的注解即可,明天我們可以來實現(xiàn)下。

          優(yōu)缺點

          這種算法優(yōu)點是算法簡單,易于實現(xiàn),但是缺點也很明顯:因為是時間段控制,所以流量本身并不是平衡的,很有可能一個時間段流量特別高,而其他時間點又沒有請求,這樣還是會存在宕機的可能性。比如你限制接口一分鐘只能調(diào)用1000次,那很有可能在第一秒的時候直接被調(diào)用1000次,而之后沒有請求,這樣你的服務(wù)很有可能在第一秒的時候就掛掉。

          漏桶算法

          關(guān)于漏桶算法,我們先看一張圖:

          上面這張圖就可以很形象地說明漏桶算法的原理:首先我們需要定義一個容量固定的漏桶,因為外部請求數(shù)量是不確定的,所以我們要通過漏桶的容量來控制請求數(shù)量。同時要確定漏桶釋放請求的速率(出口),我們通過出口的速率,控制接口服務(wù)被調(diào)用的頻速。當(dāng)漏桶中的請求數(shù)達(dá)到上限時,所有申請加入漏桶的請求都會被丟棄掉。

          這樣的應(yīng)用場景在日常生活中也有很多,比如節(jié)假日地鐵限流、景點限流等,都是這樣的操作。

          和前面的計數(shù)器限速,這里的限速模式就更合理,同時也更復(fù)雜,關(guān)于它的具體實現(xiàn),我們最近也會有相關(guān)實例分享。

          令牌桶算法

          我們先看下令牌算法的原理圖:

          在令牌桶算法中,令牌生產(chǎn)算法以恒定速率不斷生成新的令牌放進(jìn)令牌桶中,當(dāng)數(shù)量達(dá)到令牌桶的上線時,生成的新令牌會被丟棄掉。對客戶端請求來說,每次請求處理前,先要從令牌桶中獲取令牌,如果獲取到令牌,則進(jìn)出接口服務(wù)處理相關(guān)請求,否則請求被拒絕。

          令牌桶和漏桶算法有點像,但是他們的實現(xiàn)原理是有區(qū)別的,首先在漏桶算法中是由漏桶來控制請求速率的,而在令牌桶的算法中,是由令牌生成算法控制請求速率的,令牌桶只是充當(dāng)了容器。

          令牌桶在日常生活中也有很多的應(yīng)用,比如陜西歷史博物館每日定量發(fā)票參觀。另外,在實際限流應(yīng)用開發(fā)中,令牌桶也有著很典型的應(yīng)用場景,比如guavaRateLimter就采用了令牌桶算法。

          知識擴展

          這里我們再分享一些常見的限流組件,后續(xù)我們會進(jìn)一步剖析這些框架,今天知識簡單的羅列,也算是梳理后期內(nèi)容的更新方向:

          • Sentinel:面向分布式服務(wù)架構(gòu)的流量控制組件,主要以流量為切入點,從流量控制、熔斷降級、系統(tǒng)自適應(yīng)保護等多個維度來幫助您保障微服務(wù)的穩(wěn)定性。
          • concurrency-limits:奈飛公司出品的限流解決方案,我也是今天才檢索到,它是一款自適應(yīng)限流神器,后面抽時間學(xué)下
          • Hystrix:這也是奈飛公司出品的一款斷路器工具,之前我們有分享過Hystrix在服務(wù)熔斷方面的應(yīng)用,昨天我又專門重新發(fā)了下,感興趣的小伙伴可以去看下,后面還要再學(xué)習(xí)下這款組件在資源隔離、服務(wù)降級等方面的應(yīng)用。

          結(jié)語

          好了,關(guān)于限流解決方案這塊我們暫時先說這么多,算法這塊網(wǎng)上資源也比較豐富,有興趣的小伙伴可以檢索更詳細(xì)的內(nèi)容,后續(xù)我們會逐步來分享更詳細(xì)的demo實踐過程,希望能通過整個過程,對服務(wù)限流這塊有更深入的認(rèn)知和理解。

          - END -


          瀏覽 63
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  麻豆三级av | 天天撸免费视频播放 | 日韩黄色电影院 | 免费黄色在线观看国产 | 婷婷成人免费视频 |