FA2# 集群流控使用場景和實現(xiàn)原理
前言
資源是有限的,預(yù)測是必要的,然而意外也是可能發(fā)生的。我們可以看到一些重大生產(chǎn)事故往往是被突發(fā)的流量沖跨的,對流量的治理和防護就尤為重要。防患于未然,保障服務(wù)高可用,需要引起重視。另外我們也需要對標行業(yè)一流治理能力,本文介紹下高可用中另外一個成員,集群限流。
場景一 需要控制調(diào)用總量
某些場景下,需要對APP應(yīng)用某些資源(接口)的調(diào)用總量設(shè)置限制。例如:該APP由于依賴了第三方提供服務(wù),第三方流量有限制,需要對總量進行管控。部署的節(jié)點可能擴縮容,這種單純通過單機限流措施難以湊效。

場景二 單機流量不均衡
應(yīng)用APP部署了10個節(jié)點,總流量為2000QPS,每個節(jié)點200。這事理想狀態(tài),實際可能由于負載均衡造成流量傾斜。有的節(jié)點流量高、有的節(jié)點流量低。如果只從單機限流角度限流,可能會出現(xiàn)一個APP應(yīng)用中有的節(jié)點已經(jīng)發(fā)生限流,有的負載還很低的情況。

場景三 部署節(jié)點配置不同
應(yīng)用APP部署了10個節(jié)點,有的節(jié)點2C4G,有的節(jié)點8C16G。這種混合部署的場景,如果只從單機設(shè)置限流閾值,只能以配置低的壓測值作為設(shè)置閾值,高配置節(jié)點會造成資源浪費。

備注:通過集群流控配合單機限流更好的應(yīng)對不同場景流量防護,是流量防護中比較好的實踐。
實現(xiàn)集群流控,需要統(tǒng)計請求的調(diào)用總量。我們采用在應(yīng)用內(nèi)部選一臺機器作為Token Server,用于流量的統(tǒng)計和token的發(fā)放。
請求流程
如下圖所示,在請求鏈路中當服務(wù)A發(fā)起的請求調(diào)用B服務(wù)時,B服務(wù)開啟了集群流控,其中一個節(jié)點作為Token Server,其他節(jié)點均為Token Client。流程如下:
當請求到達節(jié)點時會向Token Server發(fā)起token請求 Token Server根據(jù)是否達到閾值決定是否發(fā)放token 承接請求的節(jié)點獲取token后向下游調(diào)用,超過限流閾值Token Server未發(fā)放token,請求被拒絕

實現(xiàn)原理
集群流控的實現(xiàn)依然基于令牌桶實現(xiàn)的,下面為示意圖:

工作過程
請求流量從令牌桶中獲取令牌,持有令牌放行,否則被拒 假如設(shè)置閾值每秒允許100個請求通過,則請求發(fā)送速率r=100/s 需要令牌生產(chǎn)速率為1/r,即1/100每10毫秒產(chǎn)生一個令牌 令牌桶容量為b已滿多余的令牌將被丟棄 令牌桶為空請求被拒 允許突發(fā)流量最大突發(fā)流量為令牌桶容量b 請求通過相應(yīng)的令牌從令牌桶中移除
動態(tài)選主
我們的服務(wù)有發(fā)布、有擴縮容,原來被選為Token Server的節(jié)點可能會下線等,我們采取了基于分布式鎖(公平鎖)的方式來動態(tài)選主。
使用公平鎖主要避免獨占鎖帶來的羊群效益。
閾值設(shè)置
集群閾值的設(shè)置有兩種類型:全局閾值和單機均攤
全局閾值表示整個集群能承受的總閾值流量,不隨節(jié)點的變化而變化 例如:全局閾值設(shè)置為500,無論該應(yīng)用部署了多少節(jié)點,總的流量閾值保持500不變
單機均攤指每個節(jié)點能承受的閾值,隨著節(jié)點的增減Token Server的閾值會動態(tài)變化 例如:單機均攤設(shè)置為100,3個節(jié)點集群流控總閾值為300;擴容了兩個節(jié)點后,總閾值則為500
