1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【119期】談談在項目中,如何應對高并發(fā)流量

        共 2188字,需瀏覽 5分鐘

         ·

        2021-01-16 00:13

        程序員的成長之路
        互聯(lián)網/程序員/技術/資料共享?
        關注


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

        來自:網絡

        前言

        在實際項目中,曾經遭遇過線上5W+QPS的峰值,也在壓測狀態(tài)下經歷過10W+QPS的大流量請求,本篇博客的話題主要就是自己對高并發(fā)流量控制的一點思考。

        應對大流量的一些思路

        首先,我們來說一下什么是大流量?

        大流量,我們很可能會冒出:TPS(每秒事務量),QPS(每秒請求量),1W+,5W+,10W+,100W+...。其實并沒有一個絕對的數(shù)字,如果這個量造成了系統(tǒng)的壓力,影響了系統(tǒng)的性能,那么這個量就可以稱之為大流量了。


        其次,應對大流量的一些常見手段是什么?

        緩存:說白了,就是讓數(shù)據(jù)盡早進入緩存,離程序近一點,不要大量頻繁的訪問DB。

        降級:如果不是核心鏈路,那么就把這個服務降級掉。打個比喻,現(xiàn)在的APP都講究千人千面,拿到數(shù)據(jù)后,做個性化排序展示,如果在大流量下,這個排序就可以降級掉!

        限流:大家都知道,北京地鐵早高峰,地鐵站都會做一件事情,就是限流了!想法很直接,就是想在一定時間內把請求限制在一定范圍內,保證系統(tǒng)不被沖垮,同時盡可能提升系統(tǒng)的吞吐量。


        注意到,有些時候,緩存和降級是解決不了問題的,比如,電商的雙十一,用戶的購買,下單等行為,是涉及到大量寫操作,而且是核心鏈路,無法降級的,這個時候,限流就比較重要了。

        那么接下來,我們重點說一下,限流。

        限流的常用方式

        限流的常用處理手段有:計數(shù)器、滑動窗口、漏桶、令牌。

        計數(shù)器

        計數(shù)器是一種比較簡單的限流算法,用途比較廣泛,在接口層面,很多地方使用這種方式限流。在一段時間內,進行計數(shù),與閥值進行比較,到了時間臨界點,將計數(shù)器清0。

        計數(shù)器思想
        代碼實例
        計數(shù)器代碼實現(xiàn)

        這里需要注意的是,存在一個時間臨界點的問題。舉個栗子,在12:01:00到12:01:58這段時間內沒有用戶請求,然后在12:01:59這一瞬時發(fā)出100個請求,OK,然后在12:02:00這一瞬時又發(fā)出了100個請求。這里你應該能感受到,在這個臨界點可能會承受惡意用戶的大量請求,甚至超出系統(tǒng)預期的承受。

        滑動窗口

        **由于計數(shù)器存在臨界點缺陷,后來出現(xiàn)了滑動窗口算法來解決。

        **

        滑動窗口原理圖

        滑動窗口的意思是說把固定時間片,進行劃分,并且隨著時間的流逝,進行移動,這樣就巧妙的避開了計數(shù)器的臨界點問題。也就是說這些固定數(shù)量的可以移動的格子,將會進行計數(shù)判斷閥值,因此格子的數(shù)量影響著滑動窗口算法的精度。

        漏桶

        雖然滑動窗口有效避免了時間臨界點的問題,但是依然有時間片的概念,而漏桶算法在這方面比滑動窗口而言,更加先進。

        有一個固定的桶,進水的速率是不確定的,但是出水的速率是恒定的,當水滿的時候是會溢出的。

        漏桶算法思想
        代碼實現(xiàn)
        漏桶代碼實現(xiàn)
        令牌桶

        注意到,漏桶的出水速度是恒定的,那么意味著如果瞬時大流量的話,將有大部分請求被丟棄掉(也就是所謂的溢出)。為了解決這個問題,令牌桶進行了算法改進。

        令牌桶原理

        生成令牌的速度是恒定的,而請求去拿令牌是沒有速度限制的。這意味,面對瞬時大流量,該算法可以在短時間內請求拿到大量令牌,而且拿令牌的過程并不是消耗很大的事情。(有一點生產令牌,消費令牌的意味)

        不論是對于令牌桶拿不到令牌被拒絕,還是漏桶的水滿了溢出,都是為了保證大部分流量的正常使用,而犧牲掉了少部分流量,這是合理的,如果因為極少部分流量需要保證的話,那么就可能導致系統(tǒng)達到極限而掛掉,得不償失。

        代碼實現(xiàn)
        令牌桶代碼實現(xiàn)

        限流神器:Guava RateLimiter

        Guava不僅僅在集合、緩存、異步回調等方面功能強大(可以參考博主的《使用Google Guava快樂編程》),而且還給我們封裝好了限流的API!

        Guava RateLimiter基于令牌桶算法,我們只需要告訴RateLimiter系統(tǒng)限制的QPS是多少,那么RateLimiter將以這個速度往桶里面放入令牌,然后請求的時候,通過tryAcquire()方法向RateLimiter獲取許可(令牌)。

        代碼示例
        RateLimiter

        分布式場景下的限流

        上面所說的限流的一些方式,都是針對單機而言的,其實大部分的場景,單機的限流已經足夠了。分布式下限流的手段常常需要多種技術相結合,比如Nginx+Lua,Redis+Lua等去做。本文主要討論的是單機的限流,這里就不在詳細介紹分布式場景下的限流了。

        一句話,讓系統(tǒng)的流量,先到隊列中排隊、限流,不要讓流量直接打到系統(tǒng)上。

        好了,到這里,本文就結束了!

        推薦閱讀:

        【118期】面試官:你真的清楚 i = i++和 i = ++i 的區(qū)別嗎?

        【117期】面試官:熟悉JVM嗎?為什么新生代內存需要有兩個Survivor區(qū)?

        【116期】MySQL索引優(yōu)缺點、何時需要/不需要創(chuàng)建索引、索引及sql語句的優(yōu)化

        5T技術資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內回復「2048」,即可免費獲?。?!

        微信掃描二維碼,關注我的公眾號

        朕已閱?

        瀏覽 51
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产婷婷色一区二区三区在线 | 啊灬啊灬啊灬快灬高潮女女同文 | 国产真实伦视频 | 99r在线免费观看 | 强势粗暴h疼哭np | 一级黄色毛片视频 | 91啊啊啊| 小婊孑啊轻点灬太粗太长了的视频 | 被主人抽b打x羞辱 | 久艹视频在线 |