日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

電子工程師 ? 來源:博客 ? 作者:fredalxin ? 2021-05-27 15:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

Part1自適應限流

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

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

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

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

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

Part2TCP Vegas

vegas是一種主動調(diào)整cwnd的擁塞控制算法,主要是設置兩個閾值alpha 和 beta,然后通過計算目標速率和實際速率的差diff,再比較差diff與alpha和beta的關(guān)系,對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相關(guān)擁塞控制算法,主要是根據(jù)請求延時,及其直接影響到的排隊長度來進行限流窗口的動態(tài)調(diào)整。

alpha , beta & threshold

vegas算法實現(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());

這里首先定義了一個初始化值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),為什么這么計算其實稍加領(lǐng)悟一下即可。

我們把系統(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ù)的相關(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)錯誤直接應用減函數(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編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責任編輯:haq

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

    關(guān)注

    30

    文章

    4977

    瀏覽量

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

    關(guān)注

    0

    文章

    34

    瀏覽量

    23012

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

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

    Java并發(fā)編程的“基石”——多線程概念初識

    萬卡集群中,每秒都有數(shù)百個任務在排隊、掛起、搶占資源。如果調(diào)度器出現(xiàn)毫秒級的延遲或死鎖,意味著價值數(shù)百萬的算力在空轉(zhuǎn)。因此,算力調(diào)度系統(tǒng)對并發(fā)、低延遲和絕對穩(wěn)定性的要求,達到了苛刻的極點。這正是
    發(fā)表于 04-16 18:50

    寬溫自適應超級電容的技術(shù)突破有哪些

    寬溫自適應超級電容在電解質(zhì)、電極材料、結(jié)構(gòu)設計、能量密度提升及極端環(huán)境應用等方面實現(xiàn)了技術(shù)突破。
    的頭像 發(fā)表于 12-10 17:19 ?863次閱讀

    配電房自適應濾波聲紋傳感器:智能監(jiān)測的新維度

    文章由山東華科信息技術(shù)有限公司提供在配電房的日常運維中,設備運行聲音的細微變化往往蘊含著潛在故障的早期信號。自適應濾波聲紋傳感器作為新代智能監(jiān)測設備,通過動態(tài)捕捉與分析設備聲紋特征,為電力系統(tǒng)
    的頭像 發(fā)表于 11-18 09:17 ?547次閱讀
    配電房<b class='flag-5'>自適應</b>濾波聲紋傳感器:智能監(jiān)測的新維度

    AMD Versal自適應SoC內(nèi)置自校準的工作原理

    本文提供有關(guān) AMD Versal 自適應 SoC 內(nèi)置自校準 (BISC) 工作方式的詳細信息。此外還詳述了 Versal 的異步模式及其對 BISC 的影響。
    的頭像 發(fā)表于 10-21 08:18 ?4442次閱讀

    高壓放大器驅(qū)動:基于FPGA的SPGD自適應光學控制平臺的探索

    實驗名稱: 基于FPGA的SPGD自適應光學控制平臺整體設計 測試目的: 在分析優(yōu)化式自適應光學系統(tǒng)平臺的基礎(chǔ)上,結(jié)合SPGD算法原理以及項目實際需求,對SPGD自適應光學控制平臺進行方案設計,確定
    的頭像 發(fā)表于 10-11 17:48 ?997次閱讀
    高壓放大器驅(qū)動:基于FPGA的SPGD<b class='flag-5'>自適應</b>光學控制平臺的探索

    五大電磁干擾自適應抑制系統(tǒng)軟件:動態(tài)智能應對復雜電磁環(huán)境核心方案

    五大電磁干擾自適應抑制系統(tǒng)軟件:動態(tài)智能應對復雜電磁環(huán)境核心方案
    的頭像 發(fā)表于 09-17 16:39 ?1065次閱讀
    五大電磁干擾<b class='flag-5'>自適應</b>抑制系統(tǒng)軟件:動態(tài)智能<b class='flag-5'>應對</b>復雜電磁環(huán)境核心方案

    電磁干擾自適應抑制系統(tǒng):動態(tài)智能應對復雜電磁環(huán)境核心方案

    五大電磁干擾自適應抑制系統(tǒng):動態(tài)智能應對復雜電磁環(huán)境核心方案
    的頭像 發(fā)表于 09-17 16:38 ?597次閱讀
    電磁干擾<b class='flag-5'>自適應</b>抑制系統(tǒng):動態(tài)智能<b class='flag-5'>應對</b>復雜電磁環(huán)境核心方案

    電磁干擾自適應抑制系統(tǒng)平臺全面解析

    電磁干擾自適應抑制系統(tǒng)平臺全面解析
    的頭像 發(fā)表于 09-17 16:12 ?860次閱讀
    電磁干擾<b class='flag-5'>自適應</b>抑制系統(tǒng)平臺全面解析

    電磁干擾自適應抑制系統(tǒng)平臺全面解析

    、核心功能、關(guān)鍵技術(shù)、應用場景及發(fā)展趨勢五維度展開解析: 應用案例 北京華盛恒輝、北京五木恒潤的電磁干擾自適應抑制系統(tǒng)已落地應用,成效顯著,為系統(tǒng)推廣與普及提供有力支撐。 、系統(tǒng)架構(gòu):分層設計覆蓋全流程 系統(tǒng)采用
    的頭像 發(fā)表于 09-17 16:11 ?647次閱讀

    谷歌如何打造卓越自適應應用

    Android 用戶的 Google 應用以及更多應用的更新,還有 6 月份的 Pixel Drop。我們還總結(jié)了所有 Google I/O 的相關(guān)更新,幫助 Android 開發(fā)者構(gòu)建出色的自適應 Android 應用。
    的頭像 發(fā)表于 07-30 16:39 ?1200次閱讀

    基于模糊自適應PID控制的永磁同步電機伺服系統(tǒng)研究

    控制策略,針對永礁同步電機的對象特點,設計PD參數(shù)的不同隸屬度畫數(shù)。與常規(guī)PD仿真對比顯示,該模糊自適應PID控制響應速度快,穩(wěn)態(tài)精度,抗撫動性能大大加強。 純分享帖,點擊下方附件免費獲取完整
    發(fā)表于 07-29 16:16

    基于FPGA LMS算法的自適應濾波器設計

    自適應濾波是近幾十年發(fā)展起來的信號處理理論的的新分支。隨著人們在該領(lǐng)域研究的不斷深入,自適應處理的理論和技術(shù)日趨完善,其應用領(lǐng)域也越來越廣泛。自適應濾波在通信、控制、語言分析和綜合、地震信號處理
    的頭像 發(fā)表于 07-10 11:25 ?3666次閱讀
    基于FPGA LMS算法的<b class='flag-5'>自適應</b>濾波器設計

    無刷直流電機自適應模糊直接轉(zhuǎn)矩控制研究

    針對無刷直流電機( BLDCM)轉(zhuǎn)矩脈動較大和傳統(tǒng) P1速度環(huán)調(diào)節(jié)能力差的問題,提出了自適應模糊直接轉(zhuǎn)矩控制的策略。集成了轉(zhuǎn)矩直接控制和模糊控制自適應強的優(yōu)點,可以有效抑制轉(zhuǎn)矩脈動和加快轉(zhuǎn)矩響應速度
    發(fā)表于 07-09 14:20

    無刷直流電機自適應模糊PID控制系統(tǒng)

    摘要:針對無刷直流電機傳統(tǒng)PID控制存在精度低、抗于抗能力差及模糊控制穩(wěn)態(tài)精度不高等問題,研究了自適應模糊PID控制方法。論文分析了直流無刷電機的工作原理,建立了直流無刷電機自適應模期PID
    發(fā)表于 07-09 14:18

    CYW43907使用AP功能時是否具有自適應功能?

    我們想在我們的產(chǎn)品中使用這種芯片來獲得 CE 注冊證書,CE 需要自適應功能,但是我們在數(shù)據(jù)表和源包中找不到任何消息。functions 要執(zhí)行如下: 啟動時自動掃描并選擇干擾較小的頻道,遇到干擾
    發(fā)表于 07-09 08:21
    玛沁县| 丰镇市| 娄烦县| 洛隆县| 扬中市| 南岸区| 青河县| 吉隆县| 思茅市| 雷山县| 西充县| 赤城县| 邯郸市| 乐陵市| 沁源县| 六盘水市| 肥乡县| 三门县| 金堂县| 林口县| 扬州市| 河源市| 阳西县| 海门市| 仙居县| 和静县| 石家庄市| 庐江县| 贵阳市| 蒙自县| 定结县| 泊头市| 小金县| 汉中市| 金沙县| 日照市| 阿拉善盟| 阿尔山市| 阳谷县| 清水县| 阿拉善盟|