令牌桶 漏斗 冷啟動限流在sentinel的應用

2022-03-26 12:53:29 字數 2132 閱讀 3386

分布式系統為了保證系統穩定性,在服務治理的限流中會根據不同場景進行限流操作,常見的限流演算法有:

在分析sentinel限流之前,我們先看下sentinel是什麼,官網說明如下:

隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。sentinel 是面向分布式服務架構的流量控制項,主要以流量為切入點,從流量控制、熔斷降級、系統自適應保護等多個維度來幫助您保障微服務的穩定性。

從限流角度來看,sentinel的限流有2種控制維度,乙個是qps,乙個是併發數。

qps這個很好理解,也就是每秒處理請求量,當超過設定閾值時,會進行流控,策略有如下幾種:拒絕、排隊(一定時長)等。

併發數這個就是當前執行緒執行數,類似於hystrix,只不過sentinel是進行執行緒個數統計判斷是否達到執行緒設定值,而hystrix是根據不同執行緒池來做的。

sentinel中處理流程是乙個責任鏈,不同功能的邏輯抽象成不同的processorslot組合在一起,比如有限流的flowslot、打日誌的logsot、資料統計的statisticslot。下面重點看限流的com.alibaba.csp.sentinel.slots.block.flow.flowslot

boolean prioritized, object... args) throws throwable

context context, defaultnode node, int count, boolean prioritized) throws blockexception

}}// canpasscheck -> passlocalcheck

private static boolean passlocalcheck(flowrule rule, context context, defaultnode node, int acquirecount,

boolean prioritized)

canpass校驗目前有以下幾種實現類:

這幾個實現類分別使用了如下幾種限流演算法:

sentinel中統計資訊,比如qps、pass、block等資訊都是在滑動時間視窗中維護的,比如時間戳是910時,統計資訊會往對應800-1000的時間視窗更新,當時間戳是1001時,由於時間視窗只有5個(每個200ms),因此會復用第乙個時間視窗,在使用前會先進行初始化該視窗統計值。

對於預設的流控實現defaultcontroller,其是根據時間視窗的統計值是否達到了限流值來決定是否限流的,這也是把它歸為令牌桶演算法的原因。漏斗演算法實現ratelimitercontroller,會記錄上一次正常通過的時間戳資訊(latestpassedtime),當判斷是否限流時,會根據當前時間-latestpassedtime是否大於間隔值,大於的話表示可以正常通過,小於的話表示剛剛已經有流程正常通過,此次需要排隊等待,等待時間為期望時間戳-當前時間戳,併發場景下,多個執行緒可能都會走到等待這裡,因此需要(cas操作)判斷當前需等待時間是否大於某個值,大於的話直接進行限流,不再排隊等待。

冷啟動限流演算法,即預熱/冷啟動方式。當系統長期處於低水位的情況下,當流量突然增加時,直接把系統拉公升到高水位可能瞬間把系統壓垮。通過"冷啟動",讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值上限,給冷系統乙個預熱的時間,避免冷系統被壓垮。

sentinel中通常冷啟動的過程系統允許通過的 qps 曲線如下圖所示:

冷啟動的兩種模式,令牌桶和漏斗大同小異,只不過在流量較大時,冷啟動過程 令牌桶走勢類似於階梯向上直到設定的限流值,漏洞走勢類似於幾個斜線向上之道設定的限流值。

推薦閱讀

限流策略 令牌桶與漏斗桶的實現

redis 服務端和客戶端的安裝啟動 產看當前redis版本 redis server v bash usr local bin redis server no such file or directory redis cli v bash usr local bin redis cli no su...

redis令牌桶限流

每個ip 1秒內只能傳送一次請求 pom檔案 org.springframework.bootgroupid spring boot starter data redis reactiveartifactid 2.1.3.releaseversion dependency 啟動引導類定義 keyre...

php令牌桶限流

前端每次請求從令牌桶取走令牌,後端勻速向桶內投遞令牌,如果前端取到令牌,則說明這次請求有效,否則讓前端再次請求或者等待。避免了大量請求下伺服器壓力過大導致的崩潰問題。令牌桶演算法 class token catch redi ception exception 令牌初始化 public functi...