對高并發流量控制的一點思考

前言

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


應對大流量的一些思路

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

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

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

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

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

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

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

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


限流的常用方式

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

計數器

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

計數器思想

代碼實例

計數器代碼實現

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

滑動窗口

由于計數器存在臨界點缺陷,后來出現了滑動窗口算法來解決。


滑動窗口原理圖

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

漏桶

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

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


漏桶算法思想

代碼實現

漏桶代碼實現

令牌桶

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

令牌桶原理

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

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

代碼實現

令牌桶代碼實現


限流神器:Guava RateLimiter

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

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

代碼示例

RateLimiter


分布式場景下的限流

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

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


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

早安!

美好的一天開始了,上班咯!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容

  • 最近一直都在研究壓力測試客戶端的問題,如果突破客戶端壓力測試線程,端口等問題,如果服務器端處理網絡請求處理不過來,...
    望月成三人閱讀 8,667評論 1 25
  • 聊聊高并發系統限流特技-1來自開濤的博客 在開發高并發系統時有三把利器用來保護系統:緩存、降級和限流。緩存的目的是...
    meng_philip123閱讀 6,668評論 1 20
  • 摘要:在開發高并發系統時有三把利器用來保護系統:緩存、降級和限流。而有些場景并不能用緩存和降級來解決,因此需有一種...
    落羽成霜丶閱讀 2,168評論 0 18
  • 曾經在一個大神的blog里看到這樣一句話:在開發高并發系統時,有三把利器用來保護系統:緩存、降級和限流。那么何為限...
    Johnsonxu閱讀 1,996評論 0 4
  • 這個年終總結是有些晚了,2016對我來說,是特殊的一年,不是2015也不是2014。2016的上半年,我經歷了可以...
    愛丟丟的草莓閱讀 201評論 2 1