日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

KLimiter自適應(yīng)限流器

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

【KLimiter自適應(yīng)限流器】KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器

文章圖片

KLimiter自適應(yīng)限流器
謹(jǐn)尋 大淘寶技術(shù)
2024年09月30日 18:58 浙江







隨著互聯(lián)網(wǎng)業(yè)務(wù)的快速發(fā)展 , 系統(tǒng)架構(gòu)日益復(fù)雜 , 對(duì)下游資源(如數(shù)據(jù)庫(kù))的保護(hù)成為系統(tǒng)穩(wěn)定性的重要環(huán)節(jié) 。 傳統(tǒng)的限流方式往往依賴(lài)于人為設(shè)定的固定閾值 , 難以應(yīng)對(duì)動(dòng)態(tài)變化的業(yè)務(wù)需求 , 容易造成資源浪費(fèi)或系統(tǒng)過(guò)載 。 為此 , 本文介紹了KLimiter自適應(yīng)限流器 , 它可以基于下游資源(如db)水位 , 對(duì)多個(gè)不同優(yōu)先級(jí)的上游入口進(jìn)行自適應(yīng)調(diào)流 。



背景


通常情況下 , 我們對(duì)下游資源(如db)的保護(hù) , 是通過(guò)對(duì)上游接口限流進(jìn)行的;多個(gè)接口的峰值時(shí)間點(diǎn)按約定錯(cuò)峰 , 并給予一定流量限制 , 可以保護(hù)下游資源在安全水位內(nèi) 。



這種做法有以下缺點(diǎn):

  • 隨著業(yè)務(wù)迭代 , 上游接口接入方越來(lái)越多 , 形形色色的接口也越開(kāi)越多 , 這就導(dǎo)致上游接口的峰值時(shí)間錯(cuò)中復(fù)雜 , 難以評(píng)估;
  • 上游接口的峰值時(shí)間有時(shí)候是由口頭/書(shū)面約定而成 , 沒(méi)有強(qiáng)制的系統(tǒng)制約 , 這就導(dǎo)致多個(gè)接口峰值可能會(huì)出現(xiàn)如下疊加情況 , 最終讓下游資源水位超過(guò)安全閾值 。

  • 為了避免問(wèn)題2的出現(xiàn) , 多數(shù)系統(tǒng)的做法是將上游接口的限流閾值設(shè)置得更低或是對(duì)下游資源進(jìn)行擴(kuò)容 , 來(lái)保障下游水位安全;但是這種做法又會(huì)導(dǎo)致下游長(zhǎng)期的資源浪費(fèi) 。


所以 , 本文實(shí)現(xiàn)了一種限流工具 , 能夠基于下游資源的水位自適應(yīng)調(diào)節(jié)上游接口流量;即保護(hù)的是下游資源水位 , 但是保護(hù)的方式是調(diào)節(jié)影響該資源的上游接口流量 。


介紹

KLimiter為了實(shí)現(xiàn)上述訴求 , 并且支持不同入口優(yōu)先級(jí)不同 , 本文的限流工具有如下能力:
  • 秒級(jí)監(jiān)測(cè)多個(gè)下游資源的水位;
  • 自適應(yīng)調(diào)節(jié)多個(gè)入口的流量 , 將下游資源水位維持在閾值之下;
  • 多個(gè)入口可設(shè)置不同的優(yōu)先級(jí) , 優(yōu)先降低低優(yōu)先級(jí)的入口流量到一定比例 。


概要設(shè)計(jì)

?限流方案

基于流量比例進(jìn)行限流 , 比如另入口流量比例為70% , 那么將阻斷30%的請(qǐng)求 。


?名詞解釋

名詞
解釋
例子
限流入口
需要限制流量的入口
如【查詢(xún)xxx的接口】就是一個(gè)限流入口
資源基線(xiàn)
自適應(yīng)限流需要關(guān)注的下游資源實(shí)例;基線(xiàn)包含名稱(chēng)和其水位值
如【 xx庫(kù)】就是一個(gè)資源基線(xiàn) , 本文用xx庫(kù)的操作qps來(lái)描述其水位值
入口影響的基線(xiàn)
限流入口會(huì)影響資源基線(xiàn)
如【xx接口】 , 會(huì)影響到【aa庫(kù)】【bb庫(kù)】這兩個(gè)基線(xiàn)的水位
影響系數(shù)
一個(gè)基線(xiàn)可能由多個(gè)限流入口影響 , 不同的入口在不同的時(shí)刻 , 對(duì)基線(xiàn)影響的占比是不一樣的 , 這個(gè)占比進(jìn)行歸一化后叫做影響系數(shù)
如【 aa庫(kù)】會(huì)由【xx接口】、【yy接口】等多個(gè)入口影響 , 某個(gè)時(shí)刻 , 一次【xx接口】請(qǐng)求對(duì)【 aa庫(kù)】貢獻(xiàn)1qps , 一次【yy接口】請(qǐng)求對(duì)【 aa庫(kù)】貢獻(xiàn)3qps , 則【xx接口】影響系數(shù)為0.25 , 【yy接口】影響系數(shù)為0.75;這個(gè)影響系數(shù)在按優(yōu)先級(jí)調(diào)流時(shí)會(huì)用到
流量比例
本文通過(guò)限制入口的流量比例來(lái)實(shí)現(xiàn)限流 , 而不是限制一個(gè)具體的qps值


入口優(yōu)先級(jí)
本文入口優(yōu)先級(jí) , 定義為期望該入口最多能降低到的流量比例




?設(shè)計(jì)圖解

  • 調(diào)流原理





如圖 , 本文自適應(yīng)限流器會(huì)優(yōu)先保證入口流量高于其設(shè)置的優(yōu)先級(jí)閾值 , 如果該入口不能再降低流量了 , 會(huì)先降低其他優(yōu)先級(jí)更低的入口流量 。 如step1中 , 入口3的流量比例降低到優(yōu)先級(jí)閾值就不能再降了 , 在step2會(huì)讓入口1和入口2去降低原本應(yīng)該由入口3降低的流量比例 。


如果所有入口的流量比例均到了優(yōu)先級(jí)的閾值:

則會(huì)進(jìn)行第二輪調(diào)流 , 第二輪會(huì)一視同仁 , 所有入口一起降 。


  • 代碼模塊





如圖 , 一個(gè)限流入口會(huì)影響多個(gè)資源基線(xiàn) , 一個(gè)資源基線(xiàn)也會(huì)被多個(gè)限流入口影響;自適應(yīng)限流器有2個(gè)后臺(tái)線(xiàn)程 , 分別用于統(tǒng)計(jì)qps和計(jì)算入口的流量比例:
  • qps采集線(xiàn)程:每1s執(zhí)行一次 , 遍歷所有入口和基線(xiàn) , 計(jì)算過(guò)去1s的qps值;
  • 流量比例調(diào)節(jié)線(xiàn)程:每5s執(zhí)行一次 , 基于6.1算法重新計(jì)算所有入口的影響系數(shù) , 基于6.2、6.3算法重新計(jì)算所有入口的流量比例 。



挑戰(zhàn)


1、多個(gè)入口需要有限流的優(yōu)先級(jí) , 比如入口A最多降到90%流量比例 , 入口B最多降到70%流量比例 , 入口C可以降到0;假設(shè)基線(xiàn)期望降低10%的流量 , 理論上A、B、C均降低10%即可 , 但如果A流量比例已經(jīng)是90%了 , 那么原本應(yīng)該由A降低的這部分流量 , 需要由其它入口承擔(dān)降低(其它入口要降低更多的流量) , 那么其他入口需要降低多少流量呢 , 這個(gè)比例需要怎么折算?


2、要解決1 , 需要引入影響系數(shù) , 不同的入口對(duì)基線(xiàn)的影響系數(shù)是不一樣的 , 假設(shè)A系數(shù)是0.4 , B系數(shù)是0.3 , C系數(shù)是0.3 , 那么B、C在降低了原本應(yīng)該降低的10%流量后 , 基線(xiàn)還需要降低0.4 * 10%的水位;但是不同時(shí)間、不同入口的影響系數(shù)必然是在變化的 , 這個(gè)系數(shù)如何計(jì)算呢?


3、影響系數(shù)確定后 , 基線(xiàn)需要降低的流量比例確認(rèn)后 , 多個(gè)入口在優(yōu)先級(jí)的限制下 , 最終每個(gè)入口需要降低多少流量比例 , 這個(gè)如何計(jì)算呢?


本文設(shè)計(jì)核心即解決以上三個(gè)挑戰(zhàn) 。



詳細(xì)設(shè)計(jì)


?限流入口系數(shù)求解

對(duì)于某個(gè)資源基線(xiàn) , 我們以如下流程計(jì)算其入口在該資源基線(xiàn)下的影響系數(shù) 。
假設(shè)有n個(gè)入口

, 共同影響資源基線(xiàn)y , 我們可以知道這n個(gè)入口的qps

, 以及這個(gè)資源基線(xiàn)的水位L , 就可以得出以下方程:



由于入口流量都為0的時(shí)候 , 基線(xiàn)水位L也為0 , 所以 C=0 , 即得到:



其中

為n個(gè)入口的影響系數(shù);可見(jiàn) , 要得到這n個(gè)影響系數(shù) , 需要n個(gè)這樣的方程;
基于歷史采樣信息 , 我們可以獲得過(guò)去的n個(gè)時(shí)刻

的qps矩陣:

令影響系數(shù)為:

令歷史n個(gè)時(shí)刻的基線(xiàn)水位為:

最終可以得到歷史n個(gè)時(shí)刻的入口qps和水位關(guān)系的方程組:

其為n元1次方程組 , 基于LU分解法(高斯消元法復(fù)雜度

, LU分解法復(fù)雜度

故選擇LU分解法求解)即可求出

, 最終對(duì)它們進(jìn)行歸一化 , 這里的歸一化并非向量的歸一化 , 而是最終描述各個(gè)入口占所有入口對(duì)基線(xiàn)的影響比例:



上述方法即可得出最終的影響系數(shù);
由于LU分解本質(zhì)是高斯消元法 , 需要矩陣A正定 , 否則無(wú)解;另外為負(fù)數(shù)的解也是沒(méi)有實(shí)際意義的 , 所以需要討論劣化場(chǎng)景 。


當(dāng)矩陣非正定 , 或求出的解為負(fù)數(shù)時(shí) , 方程是無(wú)解或解是無(wú)意義的 , 此時(shí)可以將問(wèn)題轉(zhuǎn)換為優(yōu)化問(wèn)題 , 令



由于

是單調(diào)的 , 所以可以用牛頓迭代法(Newton-Raphson)求最接近初始值近似 , 第k次迭代結(jié)果為:

這里

用于控制

均大于0 , 若無(wú)法滿(mǎn)足 , 則停止迭代;
迭代初始值的選取為上一輪流量調(diào)控計(jì)算的系數(shù)結(jié)果 , 即讓本次優(yōu)化結(jié)果更接近于上一輪計(jì)算值 。 為了減少0值的影響 , 上一輪計(jì)算結(jié)果為0的 , 本輪初始值賦1 。


?流量降低算法

本文對(duì)入口定義的優(yōu)先級(jí) , 為期望該入口最多能降低到的流量比例 。
令基線(xiàn)當(dāng)前水位為

, 期望的閾值水位為

, 則可以得到基線(xiàn)需要降低流量比例為:



令當(dāng)前n個(gè)入口

的流量比例為

, 假設(shè)不降低流量的qps為

, 系數(shù)為

, 即有

基線(xiàn)水位降低比例

, 則最終期望的基線(xiàn)水位為

, 即有

于是有入口

的期望流量比例



即需要降低的流量比例



假設(shè)入口

當(dāng)前最多只能降低

的流量比例 , 那么我們可以認(rèn)為原本應(yīng)該由a_i降低的流量比例:

需要在下一輪的流量降低調(diào)整中 , 由其他入口進(jìn)行調(diào)整;下一輪的流量調(diào)整中 , 基線(xiàn)還需要降低的流量比例為:

簡(jiǎn)單描述這個(gè)公式 , 即原本應(yīng)該由

降低的流量比例在其當(dāng)前流量比例的占比 , 再乘上當(dāng)前入口在所有入口中的影響比例 , 得到這次原本應(yīng)該由

降低的流量比例對(duì)基線(xiàn)水位比例的影響 , 這部分流量調(diào)整在下一輪中由其他入口承擔(dān) 。


?流量提高算法

流量提高是站在入口視角來(lái)看的 , 入口的其中一個(gè)基線(xiàn)可以提升的倍數(shù)為

, 那么這個(gè)基線(xiàn)允許入口增加的流量比例為

一個(gè)入口影響的基線(xiàn)可能有多個(gè) , 最終選取能夠提升得最小的一個(gè)值 。


?一些兜底策略

  • 跌零保護(hù)


流量跌0有很多問(wèn)題 , 比如方程求解不穩(wěn)定/不準(zhǔn)確 , 所以流量比例最低只會(huì)到1% , 當(dāng)qps小于5 , 也不再會(huì)降低流量比例 。


  • 降低流量速率


為了減少計(jì)算抖動(dòng)的影響以及流量比例變化過(guò)大的影響 , 流量比例每次最多調(diào)低5% 。


  • 慢啟動(dòng)


為了減少計(jì)算抖動(dòng)的影響以及流量比例變化過(guò)大 , 流量的恢復(fù)是類(lèi)似于TCP擁塞控制算法中的慢啟動(dòng);當(dāng)流量比例很小的時(shí)候 , 流量調(diào)高的比例只允許很小 , 流量比例越高 , 允許調(diào)高的比例則越高 。







  • 波動(dòng)影響


為了減少流量和基線(xiàn)水位抖動(dòng)對(duì)計(jì)算的影響 , 計(jì)算所使用的qps、水位 , 均是用一次計(jì)算調(diào)流周期做的簡(jiǎn)單平均濾波(當(dāng)前計(jì)算調(diào)流周期為5s , 所有的qps、水位值 , 都是歷史5s的平均值) 。



效果


ob基線(xiàn)水位閾值設(shè)置為60 , 入口1優(yōu)先級(jí)為0% , 入口2優(yōu)先級(jí)為50%;可見(jiàn)入口2比例到50%后不再降低 , 只降低入口1;入口1降到0依然不滿(mǎn)足 , 最終入口2也降低到30%左右 , 保持ob基線(xiàn)水位在60左右 。



ob基線(xiàn)閾值回調(diào)到100 , 可見(jiàn)入口流量比例也回升 , 保持ob基線(xiàn)水位在100左右 。



結(jié)語(yǔ)

KLimiter自適應(yīng)限流器通過(guò)動(dòng)態(tài)監(jiān)測(cè)下游資源的水位 , 并根據(jù)多個(gè)入口的不同優(yōu)先級(jí)自適應(yīng)地調(diào)整流量 , 有效解決了傳統(tǒng)限流方式中難以精確控制下游資源水位的問(wèn)題 。 相比現(xiàn)有的自適應(yīng)限流工具 , KLimiter不僅能夠感知下游資源的實(shí)際狀態(tài) , 還能夠在多個(gè)入口之間靈活分配流量 , 確保高優(yōu)先級(jí)的服務(wù)得到更好的保障 。 此外 , KLimiter通過(guò)一系列的優(yōu)化算法和兜底策略 , 確保了限流過(guò)程的穩(wěn)定性和可靠性 。 無(wú)論是應(yīng)對(duì)突發(fā)流量高峰 , 還是日常的流量管理 , KLimiter都能提供強(qiáng)大的支持 , 為系統(tǒng)的穩(wěn)定運(yùn)行保駕護(hù)航 。



參考資料


  • 《奇異矩陣定義》:
  • https://zhuanlan.zhihu.com/p/662240649
  • 《LU分解解線(xiàn)性方程組》:
  • https://zhuanlan.zhihu.com/p/386954541
  • 《高斯消元解線(xiàn)性方程組》:
  • https://wuli.wiki/online/GAUSS.html
  • 《淺說(shuō) Newton-Raphson 方法》
  • https://zhuanlan.zhihu.com/p/696670386

    推薦閱讀