關(guān)于服務(wù)限速的那些事……

前言
前天,我們分享了guava工具包中的一個限速組件——RateLimiter,由于當(dāng)時說后續(xù)要繼續(xù)分享微服務(wù)限速的內(nèi)容,所以我又專門梳理微服務(wù)限速相關(guān)的解決方案,今天抽時間來做一個梳理。
限流算法
關(guān)于限速這塊的解決方案,從部署方面來說,主要分為兩大塊:
一塊是單體應(yīng)用限速,我們之前說的RateLimiter、Semaphore都屬于此類;
另一塊是針對分布式服務(wù)的限流(集群部署),這一塊的解決方案也可應(yīng)用于單體服務(wù),其中絕大多數(shù)都是基于Redis這樣的緩存實現(xiàn)的,另外還有基于Nginx實現(xiàn)的。
限流算法大致分為三類:計數(shù)器、漏桶和令牌桶。
計數(shù)器算法
計數(shù)器屬于比較常用的限流算法,計數(shù)器算法的原理是通過限制在一段時間內(nèi)接口被調(diào)用的次數(shù),來控制接口流量。比如釘釘消息接口的限流,一個第三方企業(yè)一分鐘只能發(fā)送3000條消息(具體數(shù)量我記不清楚),超過3000條的部分只能等一分鐘之后發(fā)送,這樣的場景就可以通過計數(shù)器算法來實現(xiàn)。
實現(xiàn)原理
實現(xiàn)方式也很簡單,可以通過緩存來實現(xiàn),我的思路是:在接口內(nèi)部最開始的地方,設(shè)置調(diào)用方的計數(shù)器(key為調(diào)用方唯一的身份信息),第一次調(diào)用時將其值設(shè)置為1并放進(jìn)緩存中,同時緩存設(shè)置過期時間,有效期內(nèi)每次調(diào)用計數(shù)器+1,時間過期,緩存會自動刪除??梢园严嚓P(guān)邏輯封裝成自定義注解,搞成通用組件,這樣只需要在需要限速的接口上加上對應(yīng)的的注解即可,明天我們可以來實現(xiàn)下。
優(yōu)缺點
這種算法優(yōu)點是算法簡單,易于實現(xiàn),但是缺點也很明顯:因為是時間段控制,所以流量本身并不是平衡的,很有可能一個時間段流量特別高,而其他時間點又沒有請求,這樣還是會存在宕機的可能性。比如你限制接口一分鐘只能調(diào)用1000次,那很有可能在第一秒的時候直接被調(diào)用1000次,而之后沒有請求,這樣你的服務(wù)很有可能在第一秒的時候就掛掉。
漏桶算法
關(guān)于漏桶算法,我們先看一張圖:

上面這張圖就可以很形象地說明漏桶算法的原理:首先我們需要定義一個容量固定的漏桶,因為外部請求數(shù)量是不確定的,所以我們要通過漏桶的容量來控制請求數(shù)量。同時要確定漏桶釋放請求的速率(出口),我們通過出口的速率,控制接口服務(wù)被調(diào)用的頻速。當(dāng)漏桶中的請求數(shù)達(dá)到上限時,所有申請加入漏桶的請求都會被丟棄掉。
這樣的應(yīng)用場景在日常生活中也有很多,比如節(jié)假日地鐵限流、景點限流等,都是這樣的操作。
和前面的計數(shù)器限速,這里的限速模式就更合理,同時也更復(fù)雜,關(guān)于它的具體實現(xiàn),我們最近也會有相關(guān)實例分享。
令牌桶算法
我們先看下令牌算法的原理圖:

在令牌桶算法中,令牌生產(chǎn)算法以恒定速率不斷生成新的令牌放進(jìn)令牌桶中,當(dāng)數(shù)量達(dá)到令牌桶的上線時,生成的新令牌會被丟棄掉。對客戶端請求來說,每次請求處理前,先要從令牌桶中獲取令牌,如果獲取到令牌,則進(jìn)出接口服務(wù)處理相關(guān)請求,否則請求被拒絕。
令牌桶和漏桶算法有點像,但是他們的實現(xiàn)原理是有區(qū)別的,首先在漏桶算法中是由漏桶來控制請求速率的,而在令牌桶的算法中,是由令牌生成算法控制請求速率的,令牌桶只是充當(dāng)了容器。
令牌桶在日常生活中也有很多的應(yīng)用,比如陜西歷史博物館每日定量發(fā)票參觀。另外,在實際限流應(yīng)用開發(fā)中,令牌桶也有著很典型的應(yīng)用場景,比如guava的RateLimter就采用了令牌桶算法。
知識擴展
這里我們再分享一些常見的限流組件,后續(xù)我們會進(jìn)一步剖析這些框架,今天知識簡單的羅列,也算是梳理后期內(nèi)容的更新方向:
Sentinel:面向分布式服務(wù)架構(gòu)的流量控制組件,主要以流量為切入點,從流量控制、熔斷降級、系統(tǒng)自適應(yīng)保護等多個維度來幫助您保障微服務(wù)的穩(wěn)定性。concurrency-limits:奈飛公司出品的限流解決方案,我也是今天才檢索到,它是一款自適應(yīng)限流神器,后面抽時間學(xué)下Hystrix:這也是奈飛公司出品的一款斷路器工具,之前我們有分享過Hystrix在服務(wù)熔斷方面的應(yīng)用,昨天我又專門重新發(fā)了下,感興趣的小伙伴可以去看下,后面還要再學(xué)習(xí)下這款組件在資源隔離、服務(wù)降級等方面的應(yīng)用。
結(jié)語
好了,關(guān)于限流解決方案這塊我們暫時先說這么多,算法這塊網(wǎng)上資源也比較豐富,有興趣的小伙伴可以檢索更詳細(xì)的內(nèi)容,后續(xù)我們會逐步來分享更詳細(xì)的demo實踐過程,希望能通過整個過程,對服務(wù)限流這塊有更深入的認(rèn)知和理解。
