对高并发流量控制的一点思考推荐
前言 在實(shí)際項(xiàng)目中,曾經(jīng)遭遇過(guò)線上5W+QPS的峰值,也在壓測(cè)狀態(tài)下經(jīng)歷過(guò)10W+QPS的大流量請(qǐng)求,本篇博客的話題主要就是自己對(duì)高并發(fā)流量控制的一點(diǎn)思考。 應(yīng)對(duì)大流量的一些思路 首先,我們來(lái)說(shuō)一下什么是大流量? 大流量,我們很可能會(huì)冒出:TPS(每秒事務(wù)量),QPS(每秒請(qǐng)求量),1W+,5W+,10W+,100W+...。其實(shí)并沒(méi)有一個(gè)絕對(duì)的數(shù)字,如果這個(gè)量造成了系統(tǒng)的壓力,影響了系統(tǒng)的性能,那么這個(gè)量就可以稱之為大流量了。 其次,應(yīng)對(duì)大流量的一些常見(jiàn)手段是什么? 緩存:說(shuō)白了,就是讓數(shù)據(jù)盡早進(jìn)入緩存,離程序近一點(diǎn),不要大量頻繁的訪問(wèn)DB。 降級(jí):如果不是核心鏈路,那么就把這個(gè)服務(wù)降級(jí)掉。打個(gè)比喻,現(xiàn)在的APP都講究千人千面,拿到數(shù)據(jù)后,做個(gè)性化排序展示,如果在大流量下,這個(gè)排序就可以降級(jí)掉! 限流:大家都知道,北京地鐵早高峰,地鐵站都會(huì)做一件事情,就是限流了!想法很直接,就是想在一定時(shí)間內(nèi)把請(qǐng)求限制在一定范圍內(nèi),保證系統(tǒng)不被沖垮,同時(shí)盡可能提升系統(tǒng)的吞吐量。 注意到,有些時(shí)候,緩存和降級(jí)是解決不了問(wèn)題的,比如,電商的雙十一,用戶的購(gòu)買,下單等行為,是涉及到大量寫操作,而且是核心鏈路,無(wú)法降級(jí)的,這個(gè)時(shí)候,限流就比較重要了。 那么接下來(lái),我們重點(diǎn)說(shuō)一下,限流。 限流的常用方式 限流的常用處理手段有:計(jì)數(shù)器、滑動(dòng)窗口、漏桶、令牌。 計(jì)數(shù)器 計(jì)數(shù)器是一種比較簡(jiǎn)單的限流算法,用途比較廣泛,在接口層面,很多地方使用這種方式限流。在一段時(shí)間內(nèi),進(jìn)行計(jì)數(shù),與閥值進(jìn)行比較,到了時(shí)間臨界點(diǎn),將計(jì)數(shù)器清0。
這里需要注意的是,存在一個(gè)時(shí)間臨界點(diǎn)的問(wèn)題。舉個(gè)栗子,在12:01:00到12:01:58這段時(shí)間內(nèi)沒(méi)有用戶請(qǐng)求,然后在12:01:59這一瞬時(shí)發(fā)出100個(gè)請(qǐng)求,OK,然后在12:02:00這一瞬時(shí)又發(fā)出了100個(gè)請(qǐng)求。這里你應(yīng)該能感受到,在這個(gè)臨界點(diǎn)可能會(huì)承受惡意用戶的大量請(qǐng)求,甚至超出系統(tǒng)預(yù)期的承受。 滑動(dòng)窗口 由于計(jì)數(shù)器存在臨界點(diǎn)缺陷,后來(lái)出現(xiàn)了滑動(dòng)窗口算法來(lái)解決。
滑動(dòng)窗口的意思是說(shuō)把固定時(shí)間片,進(jìn)行劃分,并且隨著時(shí)間的流逝,進(jìn)行移動(dòng),這樣就巧妙的避開(kāi)了計(jì)數(shù)器的臨界點(diǎn)問(wèn)題。也就是說(shuō)這些固定數(shù)量的可以移動(dòng)的格子,將會(huì)進(jìn)行計(jì)數(shù)判斷閥值,因此格子的數(shù)量影響著滑動(dòng)窗口算法的精度。 漏桶 雖然滑動(dòng)窗口有效避免了時(shí)間臨界點(diǎn)的問(wèn)題,但是依然有時(shí)間片的概念,而漏桶算法在這方面比滑動(dòng)窗口而言,更加先進(jìn)。 有一個(gè)固定的桶,進(jìn)水的速率是不確定的,但是出水的速率是恒定的,當(dāng)水滿的時(shí)候是會(huì)溢出的。
令牌桶 注意到,漏桶的出水速度是恒定的,那么意味著如果瞬時(shí)大流量的話,將有大部分請(qǐng)求被丟棄掉(也就是所謂的溢出)。為了解決這個(gè)問(wèn)題,令牌桶進(jìn)行了算法改進(jìn)。
生成令牌的速度是恒定的,而請(qǐng)求去拿令牌是沒(méi)有速度限制的。這意味,面對(duì)瞬時(shí)大流量,該算法可以在短時(shí)間內(nèi)請(qǐng)求拿到大量令牌,而且拿令牌的過(guò)程并不是消耗很大的事情。(有一點(diǎn)生產(chǎn)令牌,消費(fèi)令牌的意味) 不論是對(duì)于令牌桶拿不到令牌被拒絕,還是漏桶的水滿了溢出,都是為了保證大部分流量的正常使用,而犧牲掉了少部分流量,這是合理的,如果因?yàn)闃O少部分流量需要保證的話,那么就可能導(dǎo)致系統(tǒng)達(dá)到極限而掛掉,得不償失。
限流神器:Guava RateLimiter Guava不僅僅在集合、緩存、異步回調(diào)等方面功能強(qiáng)大,而且還給我們封裝好了限流的API! Guava RateLimiter基于令牌桶算法,我們只需要告訴RateLimiter系統(tǒng)限制的QPS是多少,那么RateLimiter將以這個(gè)速度往桶里面放入令牌,然后請(qǐng)求的時(shí)候,通過(guò)tryAcquire()方法向RateLimiter獲取許可(令牌)。
分布式場(chǎng)景下的限流 上面所說(shuō)的限流的一些方式,都是針對(duì)單機(jī)而言的,其實(shí)大部分的場(chǎng)景,單機(jī)的限流已經(jīng)足夠了。分布式下限流的手段常常需要多種技術(shù)相結(jié)合,比如Nginx+Lua,Redis+Lua等去做。本文主要討論的是單機(jī)的限流,這里就不在詳細(xì)介紹分布式場(chǎng)景下的限流了。 一句話,讓系統(tǒng)的流量,先到隊(duì)列中排隊(duì)、限流,不要讓流量直接打到系統(tǒng)上。 如果你也想在IT行業(yè)拿高薪,可以參加我們的訓(xùn)練營(yíng)課程,選擇最適合自己的課程學(xué)習(xí),技術(shù)大牛親授,7個(gè)月后,進(jìn)入名企拿高薪。我們的課程內(nèi)容有:Java工程化、高性能及分布式、高性能、深入淺出。高架構(gòu)。性能調(diào)優(yōu)、Spring,MyBatis,Netty源碼分析和大數(shù)據(jù)等多個(gè)知識(shí)點(diǎn)。如果你想拿高薪的,想學(xué)習(xí)的,想就業(yè)前景好的,想跟別人競(jìng)爭(zhēng)能取得優(yōu)勢(shì)的,想進(jìn)阿里面試但擔(dān)心面試不過(guò)的,你都可以來(lái),群號(hào)為: 454377428 注:加群要求 1、具有1-5工作經(jīng)驗(yàn)的,面對(duì)目前流行的技術(shù)不知從何下手,需要突破技術(shù)瓶頸的可以加。 2、在公司待久了,過(guò)得很安逸,但跳槽時(shí)面試碰壁。需要在短時(shí)間內(nèi)進(jìn)修、跳槽拿高薪的可以加。 3、如果沒(méi)有工作經(jīng)驗(yàn),但基礎(chǔ)非常扎實(shí),對(duì)java工作機(jī)制,常用設(shè)計(jì)思想,常用java開(kāi)發(fā)框架掌握熟練的,可以加。 4、覺(jué)得自己很牛B,一般需求都能搞定。但是所學(xué)的知識(shí)點(diǎn)沒(méi)有系統(tǒng)化,很難在技術(shù)領(lǐng)域繼續(xù)突破的可以加。 5.阿里Java高級(jí)大牛直播講解知識(shí)點(diǎn),分享知識(shí),多年工作經(jīng)驗(yàn)的梳理和總結(jié),帶著大家全面、科學(xué)地建立自己的技術(shù)體系和技術(shù)認(rèn)知! 6.小號(hào)或者小白之類加群一律不給過(guò),謝謝。 目標(biāo)已經(jīng)有了,下面就看行動(dòng)了!記住:學(xué)習(xí)永遠(yuǎn)是自己的事情,你不學(xué)時(shí)間也不會(huì)多,你學(xué)了有時(shí)候卻能夠使用自己學(xué)到的知識(shí)換得更多自由自在的美好時(shí)光!時(shí)間是生命的基本組成部分,也是萬(wàn)物存在的根本尺度,我們的時(shí)間在那里我們的生活就在那里!我們價(jià)值也將在那里提升或消弭!Java程序員,加油吧
總結(jié)
以上是生活随笔為你收集整理的对高并发流量控制的一点思考推荐的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通过反射创建动态代理对象(三)
- 下一篇: cookies和session