0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

应对高并发的手段之一自适应限流

电子工程师 来源:博客 作者:fredalxin 2021-05-27 15:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作为应对高并发的手段之一,限流并不是一个新鲜的话题了。从Guava的Ratelimiter到Hystrix,以及Sentinel都可作为限流的工具。

Part1自适应限流

一般的限流常常需要指定一个固定值(qps)作为限流开关的阈值,这个值一是靠经验判断,二是靠通过大量的测试数据得出。但这个阈值,在流量激增、系统自动伸缩或者某某commit了一段有毒代码后就有可能变得不那么合适了。并且一般业务方也不太能够正确评估自己的容量,去设置一个合适的限流阈值。

而此时自适应限流就是解决这样的问题的,限流阈值不需要手动指定,也不需要去预估系统的容量,并且阈值能够随着系统相关指标变化而变化。

自适应限流算法借鉴了TCP拥塞算法,根据各种指标预估限流的阈值,并且不断调整。大致获得的效果如下:

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

从图上可以看到,首先以一个降低的初始并发值发送请求,同时通过增大限流窗口来探测系统更高的并发性。而一旦延迟增加到一定程度了,又会退回到较小的限流窗口。循环往复持续探测并发极限,从而产生类似锯齿状的时间关系函数。

Part2TCP Vegas

vegas是一种主动调整cwnd的拥塞控制算法,主要是设置两个阈值alpha 和 beta,然后通过计算目标速率和实际速率的差diff,再比较差diff与alpha和beta的关系,对cwnd进行调节。伪代码如下:

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就保持在了一个平衡的状态。

Part3netflix-concuurency-limits

concuurency-limits是netflix推出的自适应限流组件,借鉴了TCP相关拥塞控制算法,主要是根据请求延时,及其直接影响到的排队长度来进行限流窗口的动态调整。

alpha , beta & threshold

vegas算法实现在了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。其次是三个阈值函数alphaFunc,betaFunc以及thresholdFunc。最后是两个增减函数increaseFunc和decreaseFunc。函数都是基于当前的并发值limit做运算的。

alphaFunc可类比vegas算法中的alpha,此处的实现是3*log limit。limit值从初始20增加到极大1000时候,相应的alpha从3.9增加到了9。

betaFunc则可类比为vegas算法中的beta,此处的实现是6*log limit。limit值从初始20增加到极大1000时候,相应的alpha从7.8增加到了18。

thresholdFunc算是新增的一个函数,表示一个较为初始的阈值,小于这个值的时候limit会采取激进一些的增量算法。这里的实现是1倍的log limit。mit值从初始20增加到极大1000时候,相应的alpha从1.3增加到了3。

这三个函数值可以认为确定了动态调整函数的四个区间范围。当变量queueSize = limit × (1 − RTTnoLoad/RTTactual)落到这四个区间的时候应用不同的调整函数。

变量queueSize

其中变量为queueSize,计算方法即为limit × (1 − RTTnoLoad/RTTactual),为什么这么计算其实稍加领悟一下即可。

我们把系统处理请求的过程想象为一个水管,到来的请求是往这个水管灌水,当系统处理顺畅的时候,请求不需要排队,直接从水管中穿过,这个请求的RT是最短的,即RTTnoLoad;反之,当请求堆积的时候,那么处理请求的时间则会变为:排队时间+最短处理时间,即RTTactual = inQueueTime + RTTnoLoad。而显然排队的队列长度为总排队时间/每个请求的处理时间及queueSize = (limit * inQueueTime) / (inQueueTime + RTTnoLoad) = limit × (1 − RTTnoLoad/RTTactual)。再举个栗子,因为假设当前延时即为最佳延时,那么自然是不用排队的,即queueSize=0。而假设当前延时为最佳延时的一倍的时候,可以认为处理能力折半,100个流量进来会有一半即50个请求在排队,及queueSize= 100 * (1 − 1/2)=50。

动态调整函数

调整函数中最重要的即增函数与减函数。从初始化的代码中得知,增函数increaseFunc实现为limit+log limit,减函数decreaseFunc实现为limit-log limit,相对来说增减都是比较保守的。

看一下应用动态调整函数的相关代码:

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

// 发现错误直接应用减函数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;

}

动态调整函数规则如下:

当变量queueSize 《 threshold时,选取较激进的增量函数,newLimit = limit+beta

当变量queueSize 《 alpha时,需要增大限流窗口,选择增函数increaseFunc,即newLimit = limit + log limit

当变量queueSize处于alpha,beta之间时候,limit不变

当变量queueSize大于beta时候,需要收拢限流窗口,选择减函数decreaseFunc,即newLimit = limit - log limit

平滑递减 smoothingDecrease

注意到可以设置变量smoothing,这里初始值为1,表示平滑递减不起作用。如果有需要的话可以按需设置,比如设置smoothing为0.5时候,那么效果就是采用减函数decreaseFunc时候效果减半,实现方式为newLimitAfterSmoothing = 0.5 newLimit + 0.5 limit

作者丨fredalxin

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

原文标题:见过自适应的限流神奇吗?

文章出处:【微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73136
  • 限流
    +关注

    关注

    0

    文章

    34

    浏览量

    22929

原文标题:见过自适应的限流神奇吗?

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    配电房自适应滤波声纹传感器:智能监测的新维度

    文章由山东华科信息技术有限公司提供在配电房的日常运维中,设备运行声音的细微变化往往蕴含着潜在故障的早期信号。自适应滤波声纹传感器作为新代智能监测设备,通过动态捕捉与分析设备声纹特征,为电力系统
    的头像 发表于 11-18 09:17 149次阅读
    配电房<b class='flag-5'>自适应</b>滤波声纹传感器:智能监测的新维度

    高压放大器驱动:基于FPGA的SPGD自适应光学控制平台的探索

    实验名称: 基于FPGA的SPGD自适应光学控制平台整体设计 测试目的: 在分析优化式自适应光学系统平台的基础上,结合SPGD算法原理以及项目实际需求,对SPGD自适应光学控制平台进行方案设计,确定
    的头像 发表于 10-11 17:48 666次阅读
    高压放大器驱动:基于FPGA的SPGD<b class='flag-5'>自适应</b>光学控制平台的探索

    五大电磁干扰自适应抑制系统软件:动态智能应对复杂电磁环境核心方案

    五大电磁干扰自适应抑制系统软件:动态智能应对复杂电磁环境核心方案
    的头像 发表于 09-17 16:39 668次阅读
    五大电磁干扰<b class='flag-5'>自适应</b>抑制系统软件:动态智能<b class='flag-5'>应对</b>复杂电磁环境核心方案

    电磁干扰自适应抑制系统:动态智能应对复杂电磁环境核心方案

    五大电磁干扰自适应抑制系统:动态智能应对复杂电磁环境核心方案
    的头像 发表于 09-17 16:38 133次阅读
    电磁干扰<b class='flag-5'>自适应</b>抑制系统:动态智能<b class='flag-5'>应对</b>复杂电磁环境核心方案

    电磁干扰自适应抑制系统平台全面解析

    电磁干扰自适应抑制系统平台全面解析
    的头像 发表于 09-17 16:12 429次阅读
    电磁干扰<b class='flag-5'>自适应</b>抑制系统平台全面解析

    电磁干扰自适应抑制系统平台全面解析

    、核心功能、关键技术、应用场景及发展趋势五维度展开解析: 应用案例 北京华盛恒辉、北京五木恒润的电磁干扰自适应抑制系统已落地应用,成效显著,为系统推广与普及提供有力支撑。 、系统架构:分层设计覆盖全流程 系统采用
    的头像 发表于 09-17 16:11 276次阅读

    基于模糊自适应PID控制的永磁同步电机伺服系统研究

    控制策略,针对永礁同步电机的对象特点,设计PD参数的不同隶属度画数。与常規PD仿真对比显示,该模糊自适应PID控制响应速度快,稳态精度,抗抚动性能大大加强。 纯分享帖,点击下方附件免费获取完整
    发表于 07-29 16:16

    基于FPGA LMS算法的自适应滤波器设计

    自适应滤波是近几十年发展起来的信号处理理论的的新分支。随着人们在该领域研究的不断深入,自适应处理的理论和技术日趋完善,其应用领域也越来越广泛。自适应滤波在通信、控制、语言分析和综合、地震信号处理
    的头像 发表于 07-10 11:25 3094次阅读
    基于FPGA LMS算法的<b class='flag-5'>自适应</b>滤波器设计

    无刷直流电机自适应模糊直接转矩控制研究

    针对无刷直流电机( BLDCM)转矩脉动较大和传统 P1速度环调节能力差的问题,提出了自适应模糊直接转矩控制的策略。集成了转矩直接控制和模糊控制自适应强的优点,可以有效抑制转矩脉动和加快转矩响应速度
    发表于 07-09 14:20

    无刷直流电机自适应模糊PID控制系统

    摘要:针对无刷直流电机传统PID控制存在精度低、抗于抗能力差及模糊控制稳态精度不高等问题,研究了自适应模糊PID控制方法。论文分析了直流无刷电机的工作原理,建立了直流无刷电机自适应模期PID
    发表于 07-09 14:18

    CYW43907使用AP功能时是否具有自适应功能?

    我们想在我们的产品中使用这种芯片来获得 CE 注册证书,CE 需要自适应功能,但是我们在数据表和源包中找不到任何消息。functions 要执行如下: 启动时自动扫描并选择干扰较小的频道,遇到干扰
    发表于 07-09 08:21

    永磁同步电机自适应高阶滑模Type-2模糊控制

    针对永磁同步电机数学模型不确定问题,提出自适应高阶滑模Type-2模糊控制方法。采用积分滑模面二阶滑模控制律,保持传统滑模控制的鲁棒性并实现不含不确定高阶输入输出有限时间稳定;不需要预先确定干扰
    发表于 03-27 11:54

    GLAD应用:大气像差与自适应光学

    ^-1^ 。 自适应模型中,假设所有的驱动器都是样的并且均匀分布在个正方形的口径中,用户可以自定义驱动器影响函数的空间宽度。对于空间波长大于用户自定义空间宽度的成分,自适应默认完
    发表于 03-10 08:55

    基于自适应优化的高速交叉矩阵设计

    提出了种基于自适应优化的交叉矩阵传输设计,采用AHB协议并引入自适应突发传输调整和自适应优先级调整的创新机制。通过动态调整突发传输的长度和优先级分配,实现了对数据流的有效管理,提升了
    的头像 发表于 01-18 10:24 703次阅读

    AMD Versal自适应SoC器件Advanced Flow概览(上)

    在最新发布的 AMD Vivado Design Suite 2024.2 中,引入的新特性之一是启用了仅适用于 AMD Versal 自适应 SoC 器件的 Advanced Flow 布局布线
    的头像 发表于 01-17 10:09 1165次阅读
    AMD Versal<b class='flag-5'>自适应</b>SoC器件Advanced Flow概览(上)