目錄
QPS和連接數控制
傳輸速率
黑白名單
分散式環境
令牌桶演算法
滑動視窗
#合法性驗證限流
Guawa限流
網關層限流
從架構維度考慮限流設計
首頁 常見問題 十分鐘搞懂限流及常見方案!

十分鐘搞懂限流及常見方案!

Aug 15, 2023 pm 04:15 PM
限流

最近,收到幾位網友的面試回饋,都在面試中被問到限流相關問題,咱們今天就來聊聊我們專案中的各種限流解決方案。

限流基本概念

#對一般的限流場景來說它具有兩個維度的訊息:

  • 時間限流是基於某段時間範圍或某個時間點,也就是我們常說的“時間視窗”,例如對每分鐘、每秒鐘的時間視窗做限定
  • 資源是基於可用資源的限制,例如設定最大存取次數,或最高可用連線數

上面兩個維度結合起來看,限流就是在某個時間視窗對資源存取做限制,例如設定每秒最多100個存取請求。但在真正的場景裡,我們不只設定一種限流規則,而是會設定多個限流規則共同作用,主要的幾種限流規則如下:

QPS和連接數控制

對於(連線數QPS)限流來說,我們可設定IP維度的限流,也可以設定基於單一伺服器的限流。

十分鐘搞懂限流及常見方案!
圖片

在真實環境中通常會設定多個維度的限流規則,例如設定同一個IP每秒存取頻率小於10,連接數小於5,再設定每台機器QPS最高1000,連線數最大保持200。更進一步,我們可以把某個伺服器群組或整個機房的伺服器當做一個整體,設定更high-level的限流規則,這些所有限流規則都會共同作用於流量控制。

傳輸速率

對於「傳輸速率」大家都不會陌生,例如資源的下載速度。有的網站在這方面的限流邏輯做的更細緻,例如一般註冊用戶下載速度為100k/s,購買會員後是10M/s,這背後就是基於用戶組或用戶標籤的限流邏輯。

黑白名單

黑白名單是各個大型企業應用裡很常見的限流和放行手段,黑白名單往往是動態變化的。舉個例子,如果某個IP在一段時間的訪問次數過於頻繁,被系統識別為機器人用戶或流量攻擊,那麼這個IP就會被加入到黑名單,從而限制其對系統資源的訪問,這就是我們俗稱的「封IP」。

我們平常見到的爬蟲程序,比如說爬知乎上的美女圖片,或者爬券商系統的股票分時信息,這類爬蟲程序都必須實現更換IP的功能,以防被加入黑名單。

有時我們也會發現公司的網路無法存取12306這類大型公共網站,這也是因為某些公司的出網IP是同一個位址,因此在訪問量過高的情況下,這個IP地址就被對方系統識別,進而被加到了黑名單。使用家庭寬頻的同學應該知道,大部分網路業者都會將使用者指派到不同出網IP段,或是時不時動態更換使用者的IP位址。

白名單就更好理解了,相當於禦賜金牌在身,可以自由穿梭在各種限流規則裡,暢行無阻。例如某些電商公司會將超大賣家的帳號加入白名單,因為這類賣家往往有自己的一套運維繫統,需要對接公司的IT系統做大量的商品發布、補貨等等操作。另外,搜尋公眾號程式設計技術圈後台回覆“Java”,取得一份驚喜禮包。

分散式環境

分散式區別於單機限流的場景,它把整個分散式環境中所有伺服器當作一個整體來考慮。比方說針對IP的限流,我們限制了1個IP每秒最多10個訪問,不管來自這個IP的請求落在了哪台機器上,只要是訪問了集群中的服務節點,那麼都會受到限流規則的製約。

我們最好將限流資訊保存在一個「中心化」的元件上,這樣它就可以取得到叢集中所有機器的存取狀態,目前有兩個比較主流的限流方案:

  • 網關層限流將限流規則應用在所有流量的入口處
  • 中間件限流將限流資訊儲存在分散式環境中某個中間件裡(例如Redis快取),每個元件都可以從這裡取得到當下時刻的流量統計,從而決定是拒絕服務還是放行流量
  • sentinel, springcloud生態圈為微服務量身打造的一款用於分散式限流、熔斷降級等元件

限流方案常用演算法

令牌桶演算法

Token Bucket令牌桶演算法是目前應用最廣泛的限流演算法,顧名思義,它有以下兩個關鍵角色:

  • 令牌取得到令牌的Request才會被處理,其他Requests要麼排隊要麼被直接丟棄
  • ##桶用來裝令牌的地方,所有Request都從這個桶裡面取得令牌主要涉及到2個過程:
  • #令牌產生
#這個流程涉及到令牌產生器和令牌桶,前面我們提到過令牌桶是一個裝令牌的地方,既然是個桶那麼必然有一個容量,也就是說令牌桶所能容納的令牌數量是一個固定的數值。

對於令牌產生器來說,它會根據一個預定的速率向桶中添加令牌,例如我們可以設定讓它以每秒100個請求的速率發放令牌,或每分鐘50個。注意這裡的發放速度是勻速,也就是說這50個令牌並非是在每個時間窗口剛開始的時候一次性發放,而是會在這個時間窗口內勻速發放。

在令牌發放器就是一個水龍頭,假如在下面接水的桶子滿了,那麼自然這個水(令牌)就流到了外面。在令牌發放過程中也一樣,令牌桶的容量是有限的,如果目前已經放滿了額定容量的令牌,那麼新來的令牌就會被丟棄掉。

  • 令牌取得
#每個存取請求到來後,必須取得到一個令牌才能執行後面的邏輯。假如令牌的數量少,而存取請求較多的情況下,一部分請求自然無法取得到令牌,那麼這個時候我們可以設定一個「緩衝佇列」來暫存這些多餘的令牌。

緩衝佇列其實是一個可選的選項,並不是所有應用了令牌桶演算法的程式都會實作佇列。當有快取佇列存在的情況下,那些暫時沒有取得到令牌的請求將會被放到這個佇列中排隊,直到新的令牌產生後,再從佇列頭部拿出一個請求來符合令牌。

當佇列已滿的情況下,這部分存取請求將會被丟棄。在實際應用中我們也可以為這個佇列加一系列的特效,例如設定佇列中要求的存活時間,或是將佇列改造為PriorityQueue,依照某種優先權排序,而不是先進先出。

漏桶演算法

Leaky Bucket,又是個桶,限流演算法是跟桶槓上了,那麼漏桶和令牌桶有什麼不同呢,

漏桶演算法的前半段和令牌桶類似,但是操作的物件不同,令牌桶是將令牌放入桶裡,而漏桶是將存取請求的資料包放到桶裡。同樣的是,如果桶滿了,那麼後面新來的資料包將被丟棄。

漏桶演算法的後半程是有鮮明特色的,它永遠只會以一個恆定的速率將封包從桶內流出。打個比方,如果我設定了漏桶可以存放100個資料包,然後流出速度是1s一個,那麼不管資料包以什麼速率流入桶裡,也不管桶裡有多少資料包,漏桶能保證這些數據包永遠以1s一個的恆定速度被處理。另外,搜尋公眾號後端架構師後台回覆“架構整潔”,獲取一份驚喜禮包。

  • 漏桶vs 令牌桶的差異

#根據它們各自的特徵不難看出來,這兩種演算法都有一個「恆定」的速率和「不定」的速率。令牌桶是以恆定速率創建令牌,但是訪問請求獲取令牌的速率“不定”,反正有多少令牌發多少,令牌沒了就乾等。而漏桶是以「恆定」的速率處理請求,但是這些請求流入桶的速率是「不定」的。

從這兩個特點來說,漏桶的天然特性決定了它不會發生突發流量,就算每秒1000個請求到來,那麼它對後台服務輸出的存取速率永遠恆定。而令牌桶則不同,其特性可以「預存」一定量的令牌,因此在應對突發流量的時候可以在短時間消耗所有令牌,其突發流量處理效率會比漏桶高,但是導向後台系統的壓力也會隨之增加。

滑動視窗

比如說,我們在每一秒內有5個用戶訪問,第5秒內有10個用戶訪問,那麼在0到5秒這個時間窗口內訪問量就是15。如果我們的介面設定了時間窗口內訪問上限是20,那麼當時間到第六秒的時候,這個時間窗口內的計數總和就變成了10,因為1秒的格子已經退出了時間窗口,因此在第六秒內可以接收的訪問量就是20-10=10個。

滑動視窗其實也是計算器演算法,它有一個顯著特點,當時間視窗的跨度越長時,限流效果就越平滑。打個比方,如果當前時間窗口只有兩秒,而訪問請求全部集中在第一秒的時候,當時間向後滑動一秒後,當前窗口的計數量將發生較大的變化,拉長時間窗口可以降低這種情況的發生機率

常用的限流方案

#合法性驗證限流

例如驗證碼、IP 黑名單等,這些手段可以有效的防止惡意攻擊和爬蟲採集;

Guawa限流

在限流領域中,Guava在其多線程模組下提供了以RateLimiter為首的幾個限流支援類,但是作用範圍僅限於「目前」這台伺服器,也就是說Guawa的限流是單機的限流,跨了機器或者jvm進程就無能為力了比如說,目前我有2台伺服器[Server 1Server 2],這兩台伺服器都部署了一個登陸服務,假如我希望對這兩台機器的流量進行控制,例如將兩台機器的訪問量總和控制在每秒20以內,如果用Guava來做,只能獨立控制每台機器的訪問量<=10。

儘管Guava不是面對分散式系統的解決方案,但其作為一個簡單輕量級的客戶端限流元件,非常適合來講解限流演算法

網關層限流

服務網關,作為整個分散式連結中的第一道關卡,承接了所有使用者造訪請求,因此在網關層面進行限流是一個很好的切入點上到下的路徑依次是:

  1. 使用者流量從網關層轉送至後台服務
  2. 後台服務承接流量,呼叫快取取得資料
  3. 快取中無數據,則存取資料庫

流量自上而下是逐層遞減的,在網關層聚集了最多最密集的使用者存取請求,其次是後台服務。

然後經過後台服務的驗證邏輯之後,刷掉了一部分錯誤請求,剩下的請求落在快取上,如果快取中沒有資料才會請求漏斗最下方的資料庫,因此資料庫層級請求數量最小(相比較其他元件來說資料庫往往是並發量能力最差的一環,阿里系的MySQL即便經過了大量改造,單機並發量也無法和Redis、Kafka之類的元件相比)

目前主流的閘道層有以軟體為代表的Nginx,還有Spring Cloud中的Gateway和Zuul這類網關層元件

Nginx限流

#在系統架構中,Nginx的代理與路由轉送是其作為網關層的一個很重要的功能,由於Nginx天生的輕量級和優秀的設計,讓它成為眾多公司的首選,Nginx從網關這一層面考慮,可以作為最前置的網關,抵擋大部分的網路流量,因此使用Nginx進行限流也是一個很好的選擇,在Nginx中,也提供了常用的基於限流相關的策略配置.

Nginx 提供了兩種限流方法:一種是控制速率,另一種是控制並發連線數。

控制速率

我們需要使用limit_req_zone 用來限制單位時間內的請求數,也就是速率限制,

#因為Nginx的限流統計是基於毫秒的,我們設定的速度是2r/s,轉換一下就是500毫秒內單一IP只允許通過1個請求,從501ms開始才允許通過第2個請求。

  • 控制速率優化版

#上面的速率控制雖然很精準但是在生產環境未免太苛刻了,實際情況下我們應該控制一個IP單位總時間內的總訪問次數,而不是像上面那樣精確到毫秒,我們可以使用burst 關鍵字開啟此設定

burst=4意思是每個IP最多允許4個突發請求

#控制並發數

利用limit_conn_zone limit_conn 兩個指令即可控制並發數

其中limit_conn perip 10 表示限制單一IP 同時最多能持有10 個連線;limit_conn perserver 100 表示server 同時能處理並發連線的總數為100 個。

注意:只有當 request header 被後端處理後,這個連線才會進行計數。

中間件限流

對於分散式環境來說,無非是需要一個類似中心節點的地方儲存限流資料。打個比方,如果我希望控制介面的存取速率為每秒100個請求,那麼我就需要將當前1s內已經接收到的請求的數量保存在某個地方,並且可以讓叢集環境中所有節點都能訪問。那我們可以用什麼技術來儲存這個臨時資料呢?

那麼想必大家都能想到,必然是redis了,利用Redis過期時間特性,我們可以輕鬆設定限流的時間跨度(比如每秒10個請求,或者每10秒10個請求)。同時Redis還有一個特殊技能–腳本編程,我們可以將限流邏輯編寫成一段腳本植入到Redis中,這樣就將限流的重任從服務層完全剝離出來,同時Redis強大的並發量特性以及高可用叢集架構也可以很好的支援龐大叢集的限流存取(reids lua)。

限流元件

除了上面介紹的幾種方式以外,目前也有一些開源元件提供了類似的功能,例如Sentinel就是一個不錯的選擇。 Sentinel是阿里出品的開源元件,並且包含在了Spring Cloud Alibaba元件庫中,Sentinel提供了相當豐富的用於限流的API以及可視化管控台,可以很方便的幫助我們對限流進行治理

從架構維度考慮限流設計

在真實的專案裡,不會只使用一種限流手段,往往是幾種方式互相搭配使用,讓限流策略有一種層次感,達到資源的最大使用率。在這個過程中,限流策略的設計也可以參考前面提到的漏斗模型,上寬下緊,漏斗不同部位的限流方案設計要盡量注意目前組件的高可用性。

以我參與的實際專案為例,比如說我們研發了一個商品詳情頁的接口,透過手機淘寶導流,app端的存取請求首先會經過阿里的mtop網關,在網關層我們的限流會做的比較寬鬆,等到請求通過網關抵達後台的商品詳情頁服務之後,再利用一系列的中間件限流組件,對服務進行更加細緻的限流控制

##具體的實作限流的手段

1)Tomcat 使用maxThreads來實現限流。

2)Nginx的

limit_req_zone和 burst來實現速率限流。

3)Nginx的

limit_conn_zonelimit_conn兩個指令控制並發連接的總數。

4)時間窗口演算法借助 Redis的有序集合可以實現。

5)漏桶演算法可以使用Redis-Cell來實作。

6)令牌演算法可以解決Google的guava套件來實現。

需要注意的是藉助Redis實現的限流方案可用於分散式系統,而guava實現的限流只能應用於單機環境。如果你覺得伺服器端限流麻煩,可以在不改任何程式碼的情況下直接使用容器限流(Nginx或Tomcat),但前提是能滿足專案中的業務需求。

Tomcat限流

Tomcat 8.5 版本的最大執行緒數在

conf/server.xml 配置中,maxThreads 就是Tomcat 的最大執行緒數,當請求的並發大於此值(maxThreads)時,請求就會排隊執行,這樣就完成了限流的目的。

注意:

maxThreads 的值可以適當的調大一些,Tomcat預設為150(Tomcat 版本8.5),但這個值也不是越大越好,要看具體的伺服器配置,需要注意的是每開啟一個線程需要耗用1MB 的JVM 記憶體空間作為執行緒棧之用,且執行緒越多GC 的負擔越重。

最後要注意一下,作業系統對於行程中的執行緒數有一定的限制,Windows 每個行程中的執行緒數不允許超過2000,Linux 每個行程中的執行緒數不允許超過1000。

以上是十分鐘搞懂限流及常見方案!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
<🎜>掩蓋:探險33-如何獲得完美的色度催化劑
2 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1430
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
視訊號直播不推流的原因是什麼?被限流如何解決? 視訊號直播不推流的原因是什麼?被限流如何解決? Mar 07, 2024 pm 02:04 PM

開頭:隨著社群媒體的快速發展,視訊直播成為了人們分享生活、傳遞訊息的重要方式之一。然而,有時候我們在使用視訊號直播功能時可能會遇到無法推流的情況,那麼這是什麼原因造成的呢?一、視訊號直播不推流的原因是什麼?網路問題是視訊號直播不推流的主要原因之一,尤其是網路連線不穩定。當網路訊號不穩定時,視訊串流無法順利傳輸到伺服器,導致直播無法正常推流。網路連線的不穩定性可能會導致直播畫面卡頓、斷流或延遲,影響用戶的觀看體驗。因此,穩定的網路連線對於視訊直播的順暢進行至關重要。要解決這個問題,可以嘗試改善網絡

抖音直播帶貨沒流量怎麼辦?直播間被限流的原因 抖音直播帶貨沒流量怎麼辦?直播間被限流的原因 Mar 27, 2024 pm 10:51 PM

隨著網路的發展,直播帶貨成為了電商產業的一種新型行銷方式。而在許多直播平台中,抖音直播因其龐大的用戶群和強大的社交傳播效應而備受關注。然而,在進行抖音直播帶貨時,有些主播卻面臨著一個尷尬的問題:直播間沒有流量,商品無人問津。那麼,當抖音直播帶貨沒有流量時,我們該如何解決這個問題呢?一、抖音直播帶貨沒流量怎麼辦?提升內容品質:直播間的內容是吸引使用者的關鍵。主播可以從產品介紹、品牌故事、互動環節等方面入手,提升直播內容的品質與吸引力,使用戶產生購買慾望。為了吸引更多受眾並滿足其需求與興趣,透過直

抖音限流了怎麼養號?它養號需要哪些技巧? 抖音限流了怎麼養號?它養號需要哪些技巧? Mar 21, 2024 pm 09:10 PM

抖音作為全球最受歡迎的短影片平台之一,吸引了無數用戶在此分享自己的生活、才華和創意。隨著使用者數量的增加,抖音上的競爭也越來越激烈。有些用戶可能會遇到抖音限流的問題,導致自己的影片播放量、按讚量和粉絲成長受到影響。本文將探討抖音限流後如何養號,以及抖音養號需要掌握的技巧。一、抖音限流了怎麼養號?如果你發現自己的抖音帳號被限流了,可以採取以下措施來養號:審查視頻內容:仔細檢查最近發布的視頻,確保符合抖音的推薦標準。如發現任何違規、低俗或重複內容,請立即刪除。 2.提升內容品質:創作影片時,專注於內容質

不能投抖加等於被限流嗎?不能投抖加的作品怎麼處理? 不能投抖加等於被限流嗎?不能投抖加的作品怎麼處理? Mar 21, 2024 pm 09:47 PM

在抖音這個日活躍用戶超過億萬的短片平台上,越來越多的內容創作者希望透過投抖加來提升作品的曝光度和影響力。也有一些人發現,自己的作品即使沒有投抖加,也似乎被限流了。那麼,不能投抖加真的等於被限流嗎?本文將圍繞此問題展開探討,並給予因應策略。一、不能投抖加等於被限流嗎?首先,我們需要明確一個概念,即「限流」。在抖音平台上,限流是指平台透過調整演算法控制內容的曝光度,進而降低某些內容被展示給使用者的頻率。限流並非意味著內容會被完全屏蔽,而是減少了它們在使用者視野中出現的機會。不使用抖加並不直接導​​致限流。

抖音限流怎麼恢復流量資料?它被限流後,有沒有其他方法可以加快帳號恢復的速度? 抖音限流怎麼恢復流量資料?它被限流後,有沒有其他方法可以加快帳號恢復的速度? Apr 01, 2024 pm 12:21 PM

抖音作為全球最受歡迎的短影片平台之一,擁有龐大的用戶群和內容創作者。有些用戶可能會遇到抖音帳號被限流的問題,導致流量資料下降。那麼,抖音限流要怎麼恢復流量資料呢?本文將詳細介紹抖音限流後如何恢復流量數據,以及有沒有其他方法可以加快帳號恢復的速度。一、抖音限流怎麼恢復流量資料?首先,需要分析原因:帳號被限流的原因可能是因為違反了平台規定、內容品質不佳或異常行為等。了解原因後,可以針對性地進行改進。優化內容:提升內容品質和創意,確保內容符合抖音的使用者喜好和平台規定。可以嘗試發布多樣化的內容,尋找用

十分鐘搞懂限流及常見方案! 十分鐘搞懂限流及常見方案! Aug 15, 2023 pm 04:15 PM

最近,收到幾位網友的面試回饋,都在面試中被問到限流相關問題,咱們今天就來聊聊我們專案中的各種限流解決方案。

在ThinkPHP6中使用Redis實現限流 在ThinkPHP6中使用Redis實現限流 Jun 21, 2023 pm 03:22 PM

隨著網路應用的廣泛使用,如何有效地控制流量成為了一個重要的問題。針對流量控制的具體實現,目前有多種方法。其中一種方法是透過使用Redis來實現限流。本文將介紹如何在ThinkPHP6中使用Redis實現限流。一、什麼是限流限流是一種透過對存取流量進行某種程度的控制,以確保業務系統能夠穩定運作的一種手段。限流的實作方式有多種,比較常用的有漏桶演算法和令牌桶演算法。

小紅書怎麼判斷被限流了?怎麼解除? 小紅書怎麼判斷被限流了?怎麼解除? Mar 07, 2024 pm 12:04 PM

小紅書是一個非常受歡迎的社群電商平台,使用者可以在上面分享心得體驗、購買商品等。然而,由於平台的龐大用戶數量和日益擴大的規模,為了確保正常運作並防止濫用,小紅書採取了限流措施來控制用戶活動。那麼,要如何判斷自己是否被限流呢?一、小紅書怎麼判斷被限流了?當你發現小紅書動態推薦明顯減少時,可能是因為被限流。限流會導致首頁內容減少,這是系統根據使用者活躍度和操作習慣進行推播的結果。當你發現自己的追蹤人數成長速度明顯減緩或停滯不前時,可能是平台對你的帳號進行限制的表現。小紅書可能會限制你的追蹤人數,以減少活動