色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

應(yīng)對(duì)高并發(fā)的手段之一自適應(yīng)限流

電子工程師 ? 來(lái)源:博客 ? 作者:fredalxin ? 2021-05-27 15:52 ? 次閱讀

作為應(yīng)對(duì)高并發(fā)的手段之一,限流并不是一個(gè)新鮮的話題了。從Guava的Ratelimiter到Hystrix,以及Sentinel都可作為限流的工具。

Part1自適應(yīng)限流

一般的限流常常需要指定一個(gè)固定值(qps)作為限流開(kāi)關(guān)的閾值,這個(gè)值一是靠經(jīng)驗(yàn)判斷,二是靠通過(guò)大量的測(cè)試數(shù)據(jù)得出。但這個(gè)閾值,在流量激增、系統(tǒng)自動(dòng)伸縮或者某某commit了一段有毒代碼后就有可能變得不那么合適了。并且一般業(yè)務(wù)方也不太能夠正確評(píng)估自己的容量,去設(shè)置一個(gè)合適的限流閾值。

而此時(shí)自適應(yīng)限流就是解決這樣的問(wèn)題的,限流閾值不需要手動(dòng)指定,也不需要去預(yù)估系統(tǒng)的容量,并且閾值能夠隨著系統(tǒng)相關(guān)指標(biāo)變化而變化。

自適應(yīng)限流算法借鑒了TCP擁塞算法,根據(jù)各種指標(biāo)預(yù)估限流的閾值,并且不斷調(diào)整。大致獲得的效果如下:

55d0f872-be45-11eb-9e57-12bb97331649.jpg

從圖上可以看到,首先以一個(gè)降低的初始并發(fā)值發(fā)送請(qǐng)求,同時(shí)通過(guò)增大限流窗口來(lái)探測(cè)系統(tǒng)更高的并發(fā)性。而一旦延遲增加到一定程度了,又會(huì)退回到較小的限流窗口。循環(huán)往復(fù)持續(xù)探測(cè)并發(fā)極限,從而產(chǎn)生類似鋸齒狀的時(shí)間關(guān)系函數(shù)。

Part2TCP Vegas

vegas是一種主動(dòng)調(diào)整cwnd的擁塞控制算法,主要是設(shè)置兩個(gè)閾值alpha 和 beta,然后通過(guò)計(jì)算目標(biāo)速率和實(shí)際速率的差diff,再比較差diff與alpha和beta的關(guān)系,對(duì)cwnd進(jìn)行調(diào)節(jié)。偽代碼如下:

diff = cwnd*(1-baseRTT/RTT)

if (diff 《 alpha)

set: cwnd = cwnd + 1

else if (diff 》= beta)

set: cwnd = cwnd - 1else

set: cwnd = cwnd

其中baseRTT指的是測(cè)量的最小往返時(shí)間,RTT指的是當(dāng)前測(cè)量的往返時(shí)間,cwnd指的是當(dāng)前的TCP窗口大小。通常在tcp中alpha會(huì)被設(shè)置成2-3,beta會(huì)被設(shè)置成4-6。這樣子,cwnd就保持在了一個(gè)平衡的狀態(tài)。

Part3netflix-concuurency-limits

concuurency-limits是netflix推出的自適應(yīng)限流組件,借鑒了TCP相關(guān)擁塞控制算法,主要是根據(jù)請(qǐng)求延時(shí),及其直接影響到的排隊(duì)長(zhǎng)度來(lái)進(jìn)行限流窗口的動(dòng)態(tài)調(diào)整。

alpha , beta & threshold

vegas算法實(shí)現(xiàn)在了VegasLimit類中。先看一下初始化相關(guān)代碼:

private int initialLimit = 20;

private int maxConcurrency = 1000;

private MetricRegistry registry = EmptyMetricRegistry.INSTANCE;

private double smoothing = 1.0;

private Function《Integer, Integer》 alphaFunc = (limit) -》 3 * LOG10.apply(limit.intValue());

private Function《Integer, Integer》 betaFunc = (limit) -》 6 * LOG10.apply(limit.intValue());

private Function《Integer, Integer》 thresholdFunc = (limit) -》 LOG10.apply(limit.intValue());

private Function《Double, Double》 increaseFunc = (limit) -》 limit + LOG10.apply(limit.intValue());

private Function《Double, Double》 decreaseFunc = (limit) -》 limit - LOG10.apply(limit.intValue());

這里首先定義了一個(gè)初始化值initialLimit為20,以及極大值maxConcurrency1000。其次是三個(gè)閾值函數(shù)alphaFunc,betaFunc以及thresholdFunc。最后是兩個(gè)增減函數(shù)increaseFunc和decreaseFunc。函數(shù)都是基于當(dāng)前的并發(fā)值limit做運(yùn)算的。

alphaFunc可類比vegas算法中的alpha,此處的實(shí)現(xiàn)是3*log limit。limit值從初始20增加到極大1000時(shí)候,相應(yīng)的alpha從3.9增加到了9。

betaFunc則可類比為vegas算法中的beta,此處的實(shí)現(xiàn)是6*log limit。limit值從初始20增加到極大1000時(shí)候,相應(yīng)的alpha從7.8增加到了18。

thresholdFunc算是新增的一個(gè)函數(shù),表示一個(gè)較為初始的閾值,小于這個(gè)值的時(shí)候limit會(huì)采取激進(jìn)一些的增量算法。這里的實(shí)現(xiàn)是1倍的log limit。mit值從初始20增加到極大1000時(shí)候,相應(yīng)的alpha從1.3增加到了3。

這三個(gè)函數(shù)值可以認(rèn)為確定了動(dòng)態(tài)調(diào)整函數(shù)的四個(gè)區(qū)間范圍。當(dāng)變量queueSize = limit × (1 ? RTTnoLoad/RTTactual)落到這四個(gè)區(qū)間的時(shí)候應(yīng)用不同的調(diào)整函數(shù)。

變量queueSize

其中變量為queueSize,計(jì)算方法即為limit × (1 ? RTTnoLoad/RTTactual),為什么這么計(jì)算其實(shí)稍加領(lǐng)悟一下即可。

我們把系統(tǒng)處理請(qǐng)求的過(guò)程想象為一個(gè)水管,到來(lái)的請(qǐng)求是往這個(gè)水管灌水,當(dāng)系統(tǒng)處理順暢的時(shí)候,請(qǐng)求不需要排隊(duì),直接從水管中穿過(guò),這個(gè)請(qǐng)求的RT是最短的,即RTTnoLoad;反之,當(dāng)請(qǐng)求堆積的時(shí)候,那么處理請(qǐng)求的時(shí)間則會(huì)變?yōu)椋号抨?duì)時(shí)間+最短處理時(shí)間,即RTTactual = inQueueTime + RTTnoLoad。而顯然排隊(duì)的隊(duì)列長(zhǎng)度為總排隊(duì)時(shí)間/每個(gè)請(qǐng)求的處理時(shí)間及queueSize = (limit * inQueueTime) / (inQueueTime + RTTnoLoad) = limit × (1 ? RTTnoLoad/RTTactual)。再舉個(gè)栗子,因?yàn)榧僭O(shè)當(dāng)前延時(shí)即為最佳延時(shí),那么自然是不用排隊(duì)的,即queueSize=0。而假設(shè)當(dāng)前延時(shí)為最佳延時(shí)的一倍的時(shí)候,可以認(rèn)為處理能力折半,100個(gè)流量進(jìn)來(lái)會(huì)有一半即50個(gè)請(qǐng)求在排隊(duì),及queueSize= 100 * (1 ? 1/2)=50。

動(dòng)態(tài)調(diào)整函數(shù)

調(diào)整函數(shù)中最重要的即增函數(shù)與減函數(shù)。從初始化的代碼中得知,增函數(shù)increaseFunc實(shí)現(xiàn)為limit+log limit,減函數(shù)decreaseFunc實(shí)現(xiàn)為limit-log limit,相對(duì)來(lái)說(shuō)增減都是比較保守的。

看一下應(yīng)用動(dòng)態(tài)調(diào)整函數(shù)的相關(guān)代碼:

private int updateEstimatedLimit(long rtt, int inflight, boolean didDrop) {

final int queueSize = (int) Math.ceil(estimatedLimit * (1 - (double)rtt_noload / rtt));

double newLimit;

// Treat any drop (i.e timeout) as needing to reduce the limit

// 發(fā)現(xiàn)錯(cuò)誤直接應(yīng)用減函數(shù)decreaseFunc

if (didDrop) {

newLimit = decreaseFunc.apply(estimatedLimit);

// Prevent upward drift if not close to the limit

} else if (inflight * 2 《 estimatedLimit) {

return (int)estimatedLimit;

} else {

int alpha = alphaFunc.apply((int)estimatedLimit);

int beta = betaFunc.apply((int)estimatedLimit);

int threshold = this.thresholdFunc.apply((int)estimatedLimit);

// Aggressive increase when no queuing

if (queueSize 《= threshold) {

newLimit = estimatedLimit + beta;

// Increase the limit if queue is still manageable

} else if (queueSize 《 alpha) {

newLimit = increaseFunc.apply(estimatedLimit);

// Detecting latency so decrease

} else if (queueSize 》 beta) {

newLimit = decreaseFunc.apply(estimatedLimit);

// We‘re within he sweet spot so nothing to do

} else {

return (int)estimatedLimit;

}

}

newLimit = Math.max(1, Math.min(maxLimit, newLimit));

newLimit = (1 - smoothing) * estimatedLimit + smoothing * newLimit;

if ((int)newLimit != (int)estimatedLimit && LOG.isDebugEnabled()) {

LOG.debug(“New limit={} minRtt={} ms winRtt={} ms queueSize={}”,

(int)newLimit,

TimeUnit.NANOSECONDS.toMicros(rtt_noload) / 1000.0,

TimeUnit.NANOSECONDS.toMicros(rtt) / 1000.0,

queueSize);

}

estimatedLimit = newLimit;

return (int)estimatedLimit;

}

動(dòng)態(tài)調(diào)整函數(shù)規(guī)則如下:

當(dāng)變量queueSize 《 threshold時(shí),選取較激進(jìn)的增量函數(shù),newLimit = limit+beta

當(dāng)變量queueSize 《 alpha時(shí),需要增大限流窗口,選擇增函數(shù)increaseFunc,即newLimit = limit + log limit

當(dāng)變量queueSize處于alpha,beta之間時(shí)候,limit不變

當(dāng)變量queueSize大于beta時(shí)候,需要收攏限流窗口,選擇減函數(shù)decreaseFunc,即newLimit = limit - log limit

平滑遞減 smoothingDecrease

注意到可以設(shè)置變量smoothing,這里初始值為1,表示平滑遞減不起作用。如果有需要的話可以按需設(shè)置,比如設(shè)置smoothing為0.5時(shí)候,那么效果就是采用減函數(shù)decreaseFunc時(shí)候效果減半,實(shí)現(xiàn)方式為newLimitAfterSmoothing = 0.5 newLimit + 0.5 limit

作者丨fredalxin

來(lái)源丨fredal.xin/netflix-concuurency-limits

原文標(biāo)題:見(jiàn)過(guò)自適應(yīng)的限流神奇嗎?

文章出處:【微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70229
  • 限流
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    22693

原文標(biāo)題:見(jiàn)過(guò)自適應(yīng)的限流神奇嗎?

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    永磁同步電機(jī)自適應(yīng)高階滑模Type-2模糊控制

    針對(duì)永磁同步電機(jī)數(shù)學(xué)模型不確定問(wèn)題,提出自適應(yīng)高階滑模Type-2模糊控制方法。采用積分滑模面二階滑模控制律,保持傳統(tǒng)滑模控制的魯棒性并實(shí)現(xiàn)不含不確定高階輸入輸出有限時(shí)間穩(wěn)定;不需要預(yù)先確定干擾
    發(fā)表于 03-27 11:54

    基于事件相機(jī)的統(tǒng)幀插值與自適應(yīng)去模糊框架(REFID)

    )的解決方案。團(tuán)隊(duì)提出了種基于事件相機(jī)的統(tǒng)幀插值與自適應(yīng)去模糊框架(REFID)。該框架基于雙向遞歸網(wǎng)絡(luò),結(jié)合事件流和圖像信息,自適應(yīng)地融合來(lái)自不同時(shí)間點(diǎn)的信息,從而能夠在模糊的輸
    的頭像 發(fā)表于 03-14 11:48 ?600次閱讀
    基于事件相機(jī)的統(tǒng)<b class='flag-5'>一</b>幀插值與<b class='flag-5'>自適應(yīng)</b>去模糊框架(REFID)

    GLAD應(yīng)用:大氣像差與自適應(yīng)光學(xué)

    ^-1^ 。 自適應(yīng)模型中,假設(shè)所有的驅(qū)動(dòng)器都是樣的并且均勻分布在個(gè)正方形的口徑中,用戶可以自定義驅(qū)動(dòng)器影響函數(shù)的空間寬度。對(duì)于空間波長(zhǎng)大于用戶自定義空間寬度的成分,自適應(yīng)默認(rèn)完
    發(fā)表于 03-10 08:55

    AMD Versal自適應(yīng)SoC器件Advanced Flow概覽(下)

    在 AMD Vivado Design Suite 2024.2 版本中,Advanced Flow 自動(dòng)為所有 AMD Versal 自適應(yīng) SoC 器件啟用。請(qǐng)注意,Advanced Flow
    的頭像 發(fā)表于 01-23 09:33 ?543次閱讀
    AMD Versal<b class='flag-5'>自適應(yīng)</b>SoC器件Advanced Flow概覽(下)

    基于自適應(yīng)優(yōu)化的高速交叉矩陣設(shè)計(jì)

    提出了種基于自適應(yīng)優(yōu)化的交叉矩陣傳輸設(shè)計(jì),采用AHB協(xié)議并引入自適應(yīng)突發(fā)傳輸調(diào)整和自適應(yīng)優(yōu)先級(jí)調(diào)整的創(chuàng)新機(jī)制。通過(guò)動(dòng)態(tài)調(diào)整突發(fā)傳輸?shù)拈L(zhǎng)度和優(yōu)先級(jí)分配,實(shí)現(xiàn)了對(duì)數(shù)據(jù)流的有效管理,提升了
    的頭像 發(fā)表于 01-18 10:24 ?331次閱讀

    AMD Versal自適應(yīng)SoC器件Advanced Flow概覽(上)

    在最新發(fā)布的 AMD Vivado Design Suite 2024.2 中,引入的新特性之一是啟用了僅適用于 AMD Versal 自適應(yīng) SoC 器件的 Advanced Flow 布局布線
    的頭像 發(fā)表于 01-17 10:09 ?553次閱讀
    AMD Versal<b class='flag-5'>自適應(yīng)</b>SoC器件Advanced Flow概覽(上)

    英特爾與Stellantis Motorsports攜手推進(jìn)自適應(yīng)控制技術(shù)

    達(dá)成合作,雙方將共同推進(jìn)自適應(yīng)控制技術(shù)在下代逆變器中的應(yīng)用。 此次合作的核心在于提高賽車在競(jìng)技比賽環(huán)境中的性能和效率。通過(guò)采用英特爾的自適應(yīng)控制技術(shù),Stellantis Motorsports將能夠更精準(zhǔn)地控制逆變器的工作狀
    的頭像 發(fā)表于 01-09 10:29 ?414次閱讀

    空間光調(diào)制器自適應(yīng)激光光束整形

    調(diào)制器(SLM)在控制和調(diào)制激光方面具有無(wú)限的可能: ?自適應(yīng)光學(xué) ?超分辨顯微鏡 ?光鑷 ?激光材料處理 ?量子光學(xué) SLM光束整形: 將個(gè)高斯光束轉(zhuǎn)換成高帽輪廓 VirtualLab
    發(fā)表于 12-12 10:33

    步進(jìn)電機(jī)如何自適應(yīng)控制?步進(jìn)電機(jī)如何細(xì)分驅(qū)動(dòng)控制?

    步進(jìn)電機(jī)是種將電脈沖信號(hào)轉(zhuǎn)換為角位移或線位移的電機(jī),廣泛應(yīng)用于各種自動(dòng)化控制系統(tǒng)中。為了提高步進(jìn)電機(jī)的性能,自適應(yīng)控制和細(xì)分驅(qū)動(dòng)控制是兩種重要的技術(shù)手段、步進(jìn)電機(jī)的
    的頭像 發(fā)表于 10-23 10:04 ?1431次閱讀

    TDP1204和TMDS1204如何使用自適應(yīng)均衡

    電子發(fā)燒友網(wǎng)站提供《TDP1204和TMDS1204如何使用自適應(yīng)均衡.pdf》資料免費(fèi)下載
    發(fā)表于 09-11 10:28 ?0次下載
    TDP1204和TMDS1204如何使用<b class='flag-5'>自適應(yīng)</b>均衡

    TUSB1146的自適應(yīng)均衡帶來(lái)的益處

    電子發(fā)燒友網(wǎng)站提供《TUSB1146的自適應(yīng)均衡帶來(lái)的益處.pdf》資料免費(fèi)下載
    發(fā)表于 09-03 10:56 ?0次下載
    TUSB1146的<b class='flag-5'>自適應(yīng)</b>均衡帶來(lái)的益處

    并發(fā)物聯(lián)網(wǎng)云平臺(tái)是什么

    并發(fā)物聯(lián)網(wǎng)云平臺(tái)是種能夠處理大量設(shè)備同時(shí)連接并進(jìn)行數(shù)據(jù)交換的云計(jì)算平臺(tái)。這種平臺(tái)通常被設(shè)計(jì)用來(lái)應(yīng)對(duì)來(lái)自數(shù)以萬(wàn)計(jì)甚至數(shù)十億計(jì)的物聯(lián)網(wǎng)設(shè)備的并發(fā)
    的頭像 發(fā)表于 08-13 13:50 ?472次閱讀

    并發(fā)系統(tǒng)的藝術(shù):如何在流量洪峰中游刃有余

    尤為重要。用戶對(duì)在線服務(wù)的需求和期望不斷提高,系統(tǒng)的并發(fā)處理能力成為衡量其性能和用戶體驗(yàn)的關(guān)鍵指標(biāo)之一并發(fā)系統(tǒng)不僅僅是大型互聯(lián)網(wǎng)企業(yè)的專利,對(duì)于任何希望在市場(chǎng)中占據(jù)
    的頭像 發(fā)表于 08-05 13:43 ?459次閱讀
    <b class='flag-5'>高</b><b class='flag-5'>并發(fā)</b>系統(tǒng)的藝術(shù):如何在流量洪峰中游刃有余

    ALINX受邀參加AMD自適應(yīng)計(jì)算峰會(huì)

    近日,AMD 自適應(yīng)計(jì)算峰會(huì)(AMD Adaptive Computing Summit, 即 AMD ACS)在深圳舉行,聚焦 AMD 自適應(yīng) SoC 和 FPGA 產(chǎn)品最新動(dòng)態(tài),以及設(shè)計(jì)工具和開(kāi)發(fā)環(huán)境的前沿技巧,是全球硬件開(kāi)發(fā)者和工程師們深入交流與學(xué)習(xí)的優(yōu)質(zhì)平臺(tái)。
    的頭像 發(fā)表于 08-02 14:36 ?867次閱讀

    如何在自己的固件中增加wifi自適應(yīng)性相關(guān)功能,以通過(guò)wifi自適應(yīng)認(rèn)證測(cè)試?

    目前官方提供了自適應(yīng)測(cè)試固件 ESP_Adaptivity_v2.0_26M_20160322.bin 用于進(jìn)行 wifi 自適應(yīng)認(rèn)證測(cè)試. 請(qǐng)問(wèn)如何在自己的固件中增加 wifi 自適應(yīng)性相關(guān)功能,以通過(guò) wifi
    發(fā)表于 07-12 08:29
    主站蜘蛛池模板: 口内射精颜射极品合集 | 女教师杨雪的性荡生活 | 国产盗摄TP摄像头偷窥 | 国产精品18久久久久久欧美 | 一起洗澡的老师免费播放 | 前后灌满白浆护士 | 欧美丰满少妇久久无码精品 | 中文字幕亚洲欧美在线视频 | 忘忧草在线社区WWW日本-韩国 | 暖暖 免费 高清 日本在线 | 91久久精品一区二区三区 | 国产不卡视频在线观看 | 英国video性精品高清最新 | 国产午夜视频在永久在线观看 | 邪恶肉肉全彩色无遮琉璃神社 | 黄页网址大全免费观看 | 洗濯屋H纯肉动漫在线观看 羲义嫁密着中出交尾gvg794 | 色综合久久综合网观看 | 国产成人精品久久一区二区三区 | 亚洲蜜芽在线观看精品一区 | 久久婷婷五月综合色丁香 | 午夜黄视频 | 九九热精品在线 | 国产午夜电影在线观看不卡 | 99影视久久电影网久久看影院 | mm625亚洲人成电影网 | 国产精品夜夜春夜夜爽久久小 | YELLOW在线观看高清视频免费 | 亚洲国产精品一区二区三区在线观看 | 日韩国产精品欧美一区二区 | 老师掀开短裙让我挺进动态 | 国产人妻XXXX精品HD电影 | 色婷婷欧美在线播放内射 | xxx军人3p大gay | 91久久偷偷做嫩草影院免费看 | 久久精品视频3 | 亚洲精品AV一区午夜福利 | 果冻传媒在线播放 免费观看 | 大陆老熟女60岁 | 国产色婷婷亚洲99麻豆 | gay台湾无套男同志xnxⅹ |

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品