在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

應對高并發(fā)的手段之一自適應限流

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

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

Part1自適應限流

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

而此時自適應限流就是解決這樣的問題的,限流閾值不需要手動指定,也不需要去預估系統(tǒng)的容量,并且閾值能夠隨著系統(tǒng)相關指標變化而變化。

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

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

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

Part2TCP Vegas

vegas是一種主動調(diào)整cwnd的擁塞控制算法,主要是設置兩個閾值alpha 和 beta,然后通過計算目標速率和實際速率的差diff,再比較差diff與alpha和beta的關系,對cwnd進行調(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指的是測量的最小往返時間,RTT指的是當前測量的往返時間,cwnd指的是當前的TCP窗口大小。通常在tcp中alpha會被設置成2-3,beta會被設置成4-6。這樣子,cwnd就保持在了一個平衡的狀態(tài)。

Part3netflix-concuurency-limits

concuurency-limits是netflix推出的自適應限流組件,借鑒了TCP相關擁塞控制算法,主要是根據(jù)請求延時,及其直接影響到的排隊長度來進行限流窗口的動態(tài)調(diào)整。

alpha , beta & threshold

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

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());

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

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

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

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

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

變量queueSize

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

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

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

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

看一下應用動態(tài)調(diào)整函數(shù)的相關代碼:

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)錯誤直接應用減函數(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;

}

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

當變量queueSize 《 threshold時,選取較激進的增量函數(shù),newLimit = limit+beta

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

當變量queueSize處于alpha,beta之間時候,limit不變

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

平滑遞減 smoothingDecrease

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

作者丨fredalxin

來源丨fredal.xin/netflix-concuurency-limits

原文標題:見過自適應的限流神奇嗎?

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

責任編輯:haq

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

    關注

    30

    文章

    4788

    瀏覽量

    68617
  • 限流
    +關注

    關注

    0

    文章

    34

    瀏覽量

    22525

原文標題:見過自適應的限流神奇嗎?

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

收藏 人收藏

    評論

    相關推薦

    步進電機如何自適應控制?步進電機如何細分驅(qū)動控制?

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

    TDP1204和TMDS1204如何使用自適應均衡

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

    TUSB1146的自適應均衡帶來的益處

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

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

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

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

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

    ALINX受邀參加AMD自適應計算峰會

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

    如何在自己的固件中增加wifi自適應性相關功能,以通過wifi自適應認證測試?

    目前官方提供了自適應測試固件 ESP_Adaptivity_v2.0_26M_20160322.bin 用于進行 wifi 自適應認證測試. 請問如何在自己的固件中增加 wifi 自適應性相關功能,以通過 wifi
    發(fā)表于 07-12 08:29

    鴻蒙OS開發(fā):【次開發(fā),多端部署】(自適應布局)

    針對常見的開發(fā)場景,方舟開發(fā)框架提煉了七種自適應布局能力,這些布局可以獨立使用,也可多種布局疊加使用。
    的頭像 發(fā)表于 05-25 16:36 ?1702次閱讀
    鴻蒙OS開發(fā):【<b class='flag-5'>一</b>次開發(fā),多端部署】(<b class='flag-5'>自適應</b>布局)

    鴻蒙OS開發(fā):【次開發(fā),多端部署】應用(自適應布局)

    針對常見的開發(fā)場景,方舟開發(fā)框架提煉了七種自適應布局能力,這些布局可以獨立使用,也可多種布局疊加使用。
    的頭像 發(fā)表于 05-24 10:34 ?1034次閱讀
    鴻蒙OS開發(fā):【<b class='flag-5'>一</b>次開發(fā),多端部署】應用(<b class='flag-5'>自適應</b>布局)

    請問ST25RU3993-HPEV的自適應防碰撞算法是在板子上面實現(xiàn)的嗎?

    請問ST25RU3993-HPEV的自適應防碰撞算法是在板子上面實現(xiàn)的?還是在STSW-ST25RU001上位機上面實現(xiàn)的?這個算法可否提供?STSW-ST25
    發(fā)表于 03-19 06:50

    什么是自適應光學?自適應光學原理與方法的發(fā)展

    目前,世界上大型的望遠鏡系統(tǒng)都采用了自適應光學技術,自適應光學的出現(xiàn)為補償動態(tài)波前擾動,提高光波質(zhì)量提供了新的研究方向。 60多年來,自適應光學技術獲得蓬勃發(fā)展,現(xiàn)已應用于天文學、空間光學、激光、生物醫(yī)學等領域。
    發(fā)表于 03-11 10:27 ?2067次閱讀

    TCP協(xié)議技術之自適應重傳

    自適應重傳是TCP協(xié)議中的種擁塞控制機制,旨在通過智能的方式處理網(wǎng)絡擁塞,并進行相應的數(shù)據(jù)重傳,以提高網(wǎng)絡的可靠性和性能。
    的頭像 發(fā)表于 02-03 17:03 ?1520次閱讀
    TCP協(xié)議技術之<b class='flag-5'>自適應</b>重傳

    AMD率先推出符合DisplayPort? 2.1 8K視頻標準的FPGA和自適應SoC

    AMD UltraScale+ FPGA 和 AMD Versal 自適應 SoC 產(chǎn)品系列已率先成為業(yè)界符合 VESA DisplayPort 2.1 標準的 FPGA 和自適應 SoC。
    的頭像 發(fā)表于 01-24 09:18 ?470次閱讀

    Versal自適應SoC系統(tǒng)集成和 確認方法指南

    電子發(fā)燒友網(wǎng)站提供《Versal自適應SoC系統(tǒng)集成和 確認方法指南.pdf》資料免費下載
    發(fā)表于 01-03 10:48 ?0次下載
    Versal<b class='flag-5'>自適應</b>SoC系統(tǒng)集成和 確認方法指南

    創(chuàng)想焊縫跟蹤系統(tǒng)在爾必地機器人自適應焊接中的應用案例

    隨著制造業(yè)的不斷發(fā)展,焊接技術在各個領域中得到了廣泛的應用。在焊接過程中,焊縫的質(zhì)量直接影響著產(chǎn)品的性能和壽命。為了提高焊接效率和質(zhì)量,自適應焊接技術逐漸成為焊接領域的研究熱點之一,創(chuàng)想焊縫跟蹤系統(tǒng)
    的頭像 發(fā)表于 01-02 17:37 ?554次閱讀
    創(chuàng)想焊縫跟蹤系統(tǒng)在爾必地機器人<b class='flag-5'>自適應</b>焊接中的應用案例
    主站蜘蛛池模板: 嫩草网| 一级毛片黄色| 天天爱天天色| 国产三级自拍视频| 黄乱色伦短篇小说h| 99久久国产免费中文无字幕| 美女张开腿让男人桶爽| 天天舔天天射天天操| 88xx成人永久免费观看| 色香蕉在线观看| 最新欧美一级视频| 中文字幕在线观看一区二区三区| 四虎影酷| 亚洲国产精品日韩专区avtube| 欧美操穴| 日韩a毛片| 天天干天天爽| 美女扒开内裤无遮挡禁18| 美女网色站| 久久作爱视频| 亚洲高清免费在线观看| www.乱| 69xxxxxxxxxhd日本| 日本免费黄色小视频| 天天干天天透| 种子搜索在线| www黄色大片| 香蕉视频久久久| 久久综合九色综合精品| 国产骚b| 四虎影院欧美| 视频在线观看高清免费看| 中文字幕日本一区波多野不卡| 国产一区二区三区美女在线观看| 2021国产成人精品久久| 日韩免费网站| 久久精品福利| 色婷五月| 欧美一级免费| 四虎影院观看视频| 欧美午夜网|