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

前言

在實際項目中,曾經遭遇過線上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不僅僅在集合、緩存、異步回調等方面功能強大,而且還給我們封裝好了限流的API!

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

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

分布式場景下的限流

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

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


本文轉自zfz_linux_boy 51CTO博客,原文鏈接:http://blog.51cto.com/zhangfengzhe/2066683,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256636.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256636.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256636.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ndk學習19: 使用Eclipse調試so

1. 設置調試選項在AndroidManifest文件加入允許調試android:debuggable"true" 此時編譯項目會多出:2. 配置調試代碼把需要調試的代碼,放如按鈕事件中,如果放在OnCreate會導致連接調試器時,代碼已經跑完了Button btnTest (Button)findViewById(R.id.button1);btnT…

Inside the C++ Object Model | Outline

《Inside the C Object Model(C對象模型)》,這是一本灰常不錯的書! CSDN下載頁面(中文,侯捷譯) 豆瓣評論 讀書筆記目錄如下(不定時更新): 轉載于:https://www…

最優化課程筆記07——約束問題的非線性規劃方法(重點:拉格朗日乘子法和懲罰函數法)

7.1 間接法:約束轉化為無約束問題(含一個重點:拉格朗日乘子法) 當維數多的時候不適用 7.1.2拉格朗日乘子法(重點) 7.1.2.1 等式約束問題 7.1.2.2 不等式約束問題 7.1.3 懲罰函數法(內懲罰函數法…

工業相機:傳感器尺寸與像元尺寸的關系

相同分辨率的工業相機,傳感器面積越大,則其單位像素的面積也越大,成像質量也會越好。同樣的500萬像素的工業相機,2/3”的傳感器成像質量就要優于1/2”的。一般來說,工業相機的靶面大小,如果要求不是太嚴格&…

macOS下安裝ipython

macOS下sudo安裝ipython,會提示限錯誤: [Errno 1] Operation not permitted: /tmp/pip-Elrhse-uninstall/System/Library... 解決方法: pip install ipython --user -U 參考: http://chaishiwei.com/blog/994.html 本文轉自 h2app…

結構化查詢語言包含哪些方面?

結構化查詢語言SQL(STRUCTURED QUERY LANGUAGE)是最重要的關系數據庫操作語言,并且它的影響已經超出數據庫領域,得到其他領域的重視和采用,如人工智能領域的數據檢索,第四代軟件開發工具中嵌入SQL的語言等。…

Opencv 找輪廓并畫出相應的矩形

找輪廓參考以下大神的,對于里面的方法和結果存儲解釋的很清楚; http://blog.csdn.net/gubenpeiyuan/article/details/44922413 缺少的是畫相應包圍矩形的,其中找矩形用最小外接矩形函數cvMinAreaRect2 。 CvBox2D rect; CvPoint2D32f Corner…

C# 圖片識別(支持21種語言)

圖片識別的技術到幾天已經很成熟了,只是相關的資料很少,為了方便在此匯總一下(C#實現),方便需要的朋友查閱,也給自己做個記號。 圖片識別的用途:很多人用它去破解網站的驗證碼,用于達…

搭建Git Server - Centos+Gitosis

參考并部分轉載自:http://www.pfeng.org/archives/757 1. 安裝依賴 yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel git python python-setuptools2. 安裝gitosis git clone git://github.com/res0nat0r/gitosis.git cd…

php中rsa加密及解密和簽名及驗簽

加密的內容長度限制為密鑰長度少11位,如128位的密鑰最多加密的內容為117個長度。 公鑰加密    $public_contentfile_get_contents(公鑰路徑);    $public_keyopenssl_get_publickey($public_content);        $original_str待加密的內容;    $original_arr…

Opencv ---像素坐標轉世界坐標(已知外參)

只能求取已知外參的世界坐標平面上的世界坐標,具體公式如圖片所示! PS:字丑請諒解!

最優化5-8章重點(考試點全)

10道題,每道題10分,5-8章大概4題左右,后面的章節主要考的是概念題

多對多關聯映射(雙向)

關聯映射方面的最后一篇了,我覺得映射文件的編寫是使用hibernate的基礎,而關聯映射又是基礎的基礎,所以這方面分的細一些,羅嗦一些,說明白就好,呵呵。多對多關聯(雙向),相對單向,在實…

sort-排座椅

題目描述 Description上課的時候總有一些同學和前后左右的人交頭接耳,這是令小學班主任十分頭疼的一件事情。不過,班主任小雪發現了一些有趣的現象,當同學們的座次確定下來之后,只有有限的D對同學上課時會交頭接耳。同學們在教室中…

JSONModel的基本使用

JSONModel 是一個庫,它能智能并且快速的創建出數據 model,你可以在你的 iOS 項目或者 OSX 項目上使用它。 使用前準備 添加 JSONModel 到你的工程中 1、需要的環境: ARC,iOS 5.0 / OSX 10.7 引入框架SystemConfiguration.framework2、獲取途徑: 1)、通過…

圖像處理 伽瑪校正

http://blog.csdn.net/lichengyu/article/details/20840135 本質上是關于灰度的一個冪函數,當系數gamma大于1時,低灰度值的動態范圍減小,高灰度值的動態范圍增大,整體的灰度值減小;gamma小于1時則相反; 人…

matlab常用工具箱的調用指令

轉自:http://blog.sina.com.cn/s/blog_86186c970102va9g.html Matlab常用工具箱的調用命令 1. 優化工具箱?? 用途:優化問題 調用命令:在Command Window輸入“optimtool”?,其窗口如下 圖1 Optimization Tool? 2. 神經網絡工具箱? 用途:數據擬合、模式識別和分類…

tomcat起不來的問題已經解決

tomcat 起不來的問題:\apache-tomcat-6.0.10\bin 中startup.bat 起不來,一閃就沒了。說明:環境變量沒有配置好。解決辦法:配置環境變量:JAVA_HOME C:\Program Files\Java\jdk1.6.0_03就可以解決問題了本文轉自 yuwenhu 51CTO博客…

js寫法【3】

var m[];m[m.length]xx;//相當于push 對Repeat方法提供了8種寫法做比較,這一點還是不錯的。轉載于:https://www.cnblogs.com/baozhu/p/4862242.html