搜尋
首頁常見問題十分鐘搞懂限流及常見方案!

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

限流基本概念

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

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

上面兩個維度結合起來看,限流就是在某個時間視窗對資源存取做限制,例如設定每秒最多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來做,只能獨立控制每台機器的訪問量

儘管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中文網其他相關文章!

陳述
本文轉載於:Java后端技术全栈。如有侵權,請聯絡admin@php.cn刪除
视频号直播不推流的原因是什么?被限流如何解决?视频号直播不推流的原因是什么?被限流如何解决?Mar 07, 2024 pm 02:04 PM

开头:随着社交媒体的快速发展,视频直播成为了人们分享生活、传递信息的重要方式之一。然而,有时候我们在使用视频号直播功能时可能会遇到无法推流的情况,那么这是什么原因造成的呢?一、视频号直播不推流的原因是什么?网络问题是视频号直播不推流的主要原因之一,尤其是网络连接不稳定。当网络信号不稳定时,视频流无法顺利传输到服务器,导致直播无法正常推流。网络连接的不稳定性可能会导致直播画面卡顿、断流或者延迟,影响用户的观看体验。因此,稳定的网络连接对于视频直播的顺畅进行至关重要。要解决这个问题,可以尝试改善网络

抖音限流了怎么养号?它养号需要哪些技巧?抖音限流了怎么养号?它养号需要哪些技巧?Mar 21, 2024 pm 09:10 PM

抖音作为全球最受欢迎的短视频平台之一,吸引了无数用户在此分享自己的生活、才艺和创意。随着用户数量的增加,抖音上的竞争也越来越激烈。一些用户可能会遇到抖音限流的问题,导致自己的视频播放量、点赞量和粉丝增长受到影响。本文将探讨抖音限流后如何养号,以及抖音养号需要掌握的技巧。一、抖音限流了怎么养号?如果你发现自己的抖音账号被限流了,可以采取以下措施来养号:审查视频内容:仔细检查最近发布的视频,确保符合抖音的推荐标准。如发现任何违规、低俗或重复内容,要立即删除。2.提高内容质量:在创作视频时,注重内容质

抖音直播带货没流量怎么办?直播间被限流的原因抖音直播带货没流量怎么办?直播间被限流的原因Mar 27, 2024 pm 10:51 PM

随着互联网的发展,直播带货成为了电商行业的一种新型营销方式。而在诸多直播平台中,抖音直播因其庞大的用户群体和强大的社交传播效应而备受关注。然而,在进行抖音直播带货时,有些主播却面临着一个尴尬的问题:直播间没有流量,商品无人问津。那么,当抖音直播带货没有流量时,我们该如何解决这个问题呢?一、抖音直播带货没流量怎么办?提升内容质量:直播间的内容是吸引用户的关键。主播可以从产品介绍、品牌故事、互动环节等方面入手,提升直播内容的质量和吸引力,使用户产生购买欲望。为了吸引更多受众并满足其需求与兴趣,通过直

不能投抖加等于被限流吗?不能投抖加的作品怎么处理?不能投抖加等于被限流吗?不能投抖加的作品怎么处理?Mar 21, 2024 pm 09:47 PM

在抖音这个日活跃用户超过亿万的短视频平台上,越来越多的内容创作者希望通过投抖加来提升作品的曝光度和影响力。也有一些人发现,自己的作品即使没有投抖加,也似乎被限流了。那么,不能投抖加真的等于被限流吗?本文将围绕这一问题展开探讨,并给出应对策略。一、不能投抖加等于被限流吗?首先,我们需要明确一个概念,即“限流”。在抖音平台上,限流是指平台通过调整算法控制内容的曝光度,从而降低某些内容被展示给用户的频率。限流并非意味着内容会被完全屏蔽,而是减少了它们在用户视野中出现的机会。不使用抖加并不直接导致限流。

抖音限流怎么恢复流量数据?它被限流后,有没有其他方法可以加快账号恢复的速度?抖音限流怎么恢复流量数据?它被限流后,有没有其他方法可以加快账号恢复的速度?Apr 01, 2024 pm 12:21 PM

抖音作为全球最受欢迎的短视频平台之一,拥有庞大的用户群体和内容创作者。一些用户可能会遇到抖音账号被限流的问题,导致流量数据下降。那么,抖音限流怎么恢复流量数据呢?本文将详细介绍抖音限流后如何恢复流量数据,以及有没有其他方法可以加快账号恢复的速度。一、抖音限流怎么恢复流量数据?首先,需要分析原因:账号被限流的原因可能是因为违反了平台规定、内容质量不佳或者异常行为等。了解原因后,可以针对性地进行改进。优化内容:提升内容质量和创意,确保内容符合抖音的用户喜好和平台规定。可以尝试发布多样化的内容,寻找用

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

最近,收到几位网友的面试反馈,都在面试中被问到限流相关问题,咱们今天就来聊聊我们项目中的各种限流解决方案。

小红书怎么判断被限流了?怎么解除?小红书怎么判断被限流了?怎么解除?Mar 07, 2024 pm 12:04 PM

小红书是一个非常受欢迎的社交电商平台,用户可以在上面分享心得体验、购买商品等。然而,由于平台的庞大用户数量和日益扩大的规模,为了保证正常运行并防止滥用,小红书采取了限流措施来控制用户活动。那么,如何判断自己是否被限流呢?一、小红书怎么判断被限流了?当你发现小红书动态推荐明显减少时,可能是因为被限流。限流会导致首页内容减少,这是系统根据用户活跃度和操作习惯进行推送的结果。当你发现自己的关注人数增长速度明显减缓或停滞不前时,可能是平台对你的账号进行限制的表现。小红书可能会限制你的关注人数,以减少活动

抖音被限流多久能恢复正常?需要停播吗?抖音被限流多久能恢复正常?需要停播吗?Mar 07, 2024 pm 01:28 PM

近年来,短视频平台抖音以其丰富的内容和便捷的分享方式,受到了全球范围内广大用户的喜爱。然而,由于一些违规行为的出现,抖音不可避免地陷入了限流的局面。那么,当抖音被限流后,需要多长时间才能恢复正常呢?一、抖音被限流多久能恢复正常?抖音被限流恢复正常涉及多种因素,具体时长并非固定。恢复时间取决于限流原因。如果限流是由于恶意行为,如刷量或发布违禁内容,恢复时间可能较长。限流的强度会直接影响恢复时间。若限流仅影响部分功能或操作,恢复速度或许会较快。然而,若整个平台遭受全面限流,恢复所需时间将更长,需要更

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。