自适应熔断限流揭秘

原创 Chasen 拍码场

前言

自适应熔断与限流是在分布式系统中常用的机制,用于保护系统免受服务雪崩效应与突发流量影响。它能够根据系统的负载情况和性能指标自动调整限流策略,以确保系统能提供稳定可靠的服务,目前在业内已经有了不少的探索与实践。

熔断限流使用场景

限流

限流主要的应用场景为应对流量激增的场景(如活动促销,外部流量攻击等)。如下图,当系统流量激增时,如不加以限制,可能会导致系统负载被打满,致使服务溃,最终导致服务不可用。

 通过限流,仅允许部分流量的请求可以通过,其余请求会直接快速失败,即便突发流量出现时,服务始终仅承载部分请求,系统负载可控,保证了服务能稳定可用。

熔断

熔断主要的应用场景为依赖的服务出现故障时防止出现服务雪崩(如下游超时,db故障等)。如下图,当下游服务故障导致超时,由于长时间不响应会导致上游服务请求产生阻塞,导致系统资源增加(常见的如tomcat线程池、连接池等),如持续故障,则请求阻塞会持续增加导致上游系统线程池资源耗尽,导致上游服务不可用,并且会向上产生级联故障,最终因底层服务的故障导致整个链路的服务雪崩。

通过熔断可以在下游发生故障之后,针对下游的调用进行快速失败,这样就避免了系统资源因下游故障而耗尽,使系统保持可用,同时熔断后也会定期进行下游探测,当下游恢复后,会退出熔断,自动恢复下游调用。

传统熔断限流存在的问题

传统熔断限流主要是客户端模式如hystrix, sentinel静态流控功能,存在着一些弊端:

配置滞后,人工评估易存在疏漏;通常都是系统出现故障后,才进行介入,实际可能已经对业务产生了不好的影响。

阈值难以设定,配置成本高;通常阈值的确定需要结合生产压测的实施才能准确设定,但实际在生产进行压测的成本很高,并且规则中变量众多,有一定的上手门槛。

阈值设置存在过时的问题;由于系统是在不断的迭代中的,因此阈值也可能随着版本的迭代而逐渐不适用,从而使系统失去了保护。

跨语言支持不佳;已有的组件仅对java生态支持较好,但对于pythongo等语言生态的支持有限。

信也自适应熔断限流的优势

可作为兜底策略;自适应策略有较高的启发值,因此可作为兜底策略提前配置开启。

使用门槛低;采用的是自适应的策略,无复杂的配置项,不需要进行压测,仅需选择开启与关闭即可,且策略主要根据系统的负载情况进行决策,随着版本迭代,也不会失效。

0成本接入,支持跨语言;采用mesh的方式实现,具体的限流与熔断介入是在边车上进行的,因此应用无需客户端接入,能应用在各种语言生态的系统上。

自适应熔断限流策略

自适应限流

策略核心逻辑:资源水位线自适应,通过当前CPU与目标值的误差调整QPS,使CPU趋近于目标值。

核心算法PID算法

业内实践:淘宝noah、蚂蚁mosn

算法概述PID算法利用反馈来检测偏差信号,并通过偏差信号来控制被控量。而控制器本身就是比例、积分、微分三个环节的加和。使用广泛,在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。算法明细见下图,其中Kp:比例增益,用于控制调节幅度;Ki:积分时间常数,用于补偿误差;Kd:微分时间常数,用于抑制波动;e(t)cpu与基准线的误差;u(t):调整的qps;其中基准线取的是80%

自适应熔断

策略核心逻辑:通过计算实际被下游拒绝的概率来控制请求是否熔断

核心算法SRE算法

业内实践Bkratosgo-zero、小米、QQ音乐微服务等

算法概述SRE算法是Google提出的一种弹性熔断算法,称之为Handing Overload,不同于传统熔断算法,SRE算法没有半开的状态,也没有完全开启的状态,通过计算下游服务的拒绝率来控制流量的发送,在保护自身不被下游拖垮的同时,尽可能释放请求到下游,最大化保证业务的完整性。算法明细见下图,其中requests: 一个时间窗口的请求总量;Accepts: 成功请求数量;K: 倍率,越小表示越激进,越小表示越容易被丢弃请求,K建议区间[1.5, 2]

自适应熔断限流整体方案

指标采集与转储;首先利用otel进行熔断限流指标的采集,采集过程中otel会定期通过自适应熔断限流平台进行节点发现,只有开启了熔断限流功能的实例才会进行指标采集。采集到指标会批量推送至kafka中,由数据转储模块进行指标消息消费,并针对监控数据进行预处理后存入redis中。

自适应计算引擎;根据开启的规则进行自适应熔断限流触发的扫描,根据默认的熔断限流自适应策略从redis中获取对应的监控指标进行熔断限流触发判定,判断规则中也针对误触发做了许多的条件限制,比如会过滤掉非流量导致的负载升高场景等。针对触发的规则会生成自适应调节记录,并下发熔点限流指令,同时会周期性的进行自适应策略计算更新熔断限流的阈值,直至满足恢复的条件,满足恢复条件后会下发熔断限流恢复指令进行恢复,触发与恢复都会通过谛听监控平台进行告警通知。

规则转换:规则转换模块会监听下发熔断限流指令来构建EnvoyFilter CRD,将熔断限流指令转换成边车测的流控规则,熔断限流指令转换为EnvoyFilter后会通过mesh的控制面IstioD采用XDS协议下发给边车。

边车:根据下发的流控XDS配置执行入口(限流)或出口(熔断)的流控。

问题与优化

1XDS下发性能问题

添加EnvoyFilter后触发同namespace下所有PodxDS推送,在自适应调节过程会频繁变更EnvoyFilter导致推送频率过高,mesh控制面Istio的负载也会大幅上升,因此针对Istio的源码进行了性能优化,在推送XDS时进行label匹配,仅会对label匹配的实例推送XDS配置。

2、自适应熔断在envoy上实现问题

由于在envoy上实现自适应熔断并无开源经验可借鉴,SRE熔断算法需要类似与基于概率的方式限流,envoy原生并没有概率限流的策略。经过研究与测试,采用超长token投递频率结合限流生效比例的方式模拟出概率限流的效果,经多次压测验证,误差稳定在2%范围内,满足实际熔断要求。

3API监控指标维度爆炸问题

由于自适应熔断场景对熔断目标的粒度要求高,需要是API维度,由于熔断场景主要针对的是出口调用的场景,且熔断发生时下游并未返回报文,因此无法使用spring ServletRequest.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE)来获取接口路径,这种情况下当路径中存在变量时,会出现维度爆炸的问题。因此通过研发模板匹配EnvoyFilter,当接口开启熔断功能时会下发模板匹配EnvoyFilter,当向下游发起调用时会先通过模板匹配EnvoyFilter进行接口匹配,自适应熔断仅会作用在模板匹配通过的接口请求。

 此外还做了许多的难点攻克与优化,如算法调优、istio监控指标定制、      envoy精细化限流失准问题和api server性能问题等。

自适应熔断限流平台

自适应熔断限流设置

自适应限流设置没有复杂的规则参数设置,仅需选择功能开关的开启或关闭,并且支持实例级别的灰度。

自适应熔断设置支持API维度与站点维度,API与站点列表是根据监控信息自动提取的,且无额外规则参数设置,用户仅需关注开关的开启与关闭。

自适应熔断限流详情与快照

自适应限流记录详情中除了包含触发的基础的站点实例信息外还包含了触发恢复的原因、条件描述,及触发与恢复前后的监控指标快照,通过快照可以方便的进行问题排查与分析。如图上所示,当流量导致CPU飙升后,自适应限流会介入,使CPU负载降低直至趋近于设定的目标水位线,从而保障了服务的可用性。同时由于部分请求快速失败了,导致整体吞吐量实的提升。

自适应熔断记录详情与自适应限流详情类似,也是由基础信息与监控指标快照组成,通过快照可以发现当下游出现大量超时后,自适应熔断开始介入,大部分请求被快速失败,避免了服务被下游拖垮。

但与传统熔断不同的是,自适应熔断始终尽可能的往下游释放请求,当下游超时有所恢复时,流量也能快速实现恢复,在保证自身服务不被下游拖垮的同时,最大化的保证了业务的完整性。

最后

目前我们已经完成了自适应限流与熔断的阶段性落地,完成了部分站点的试点与开启,后续也会进一步的探索,如自适应限流细化到接口层面,仅针对导致负载上升的接口进行自适应限流;进一步细化指标粒度,提升自适应策略触发与恢复的灵敏度等;使服务保障机制向更精准、更高效、更稳定的方向发展。

作者介绍

Chasen,现任基础框架研发专家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/10081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码无界,创新无限!华为云开发者日 · 广州站来了!

5月23日,2024年首场华为云开发者日HDC.Cloud Day将在广州盛大举行。这场技术派对将为开发者们带来一场无与伦比的技术盛宴。在这里,开发者们将有机会现场聆听行业专家的精彩分享,深度了解众多前沿产品的最新技术和功能,并与行业专…

Sass语法介绍-运算

04 【Sass语法介绍-运算】 1.前言 运算是一种通过已知量可能的组合,获得新的量的行为。Sass 中也为我们提供了各种各样的运算,以便我们更好的处理样式代码。本节我们将学习 Sass 中的数字运算、关系运算、除法运算、颜色运算、字符串运算等等… 2.什么…

OSPF虚链路

原理概述 通常情况下,一个OSPF网络的每个非骨干区域都必须与骨干区域通过ABR路由器直接连接,非骨干区域之间的通信都需要通过骨干区域进行中转。但在现实中,可能会因为各种条件限制,导致非骨干区域和骨干区域无法直接连接&#x…

[muduo网络库]——muduo库三大核心组件之 Poller/EpollPoller类(剖析muduo网络库核心部分、设计思想)

接着上文,[muduo网络库]——muduo库三大核心组件之Channel类(剖析muduo网络库核心部分、设计思想),本章我们来学习muduo网络库中第二大核心组件Poller/EpollPoller类。 先回顾一下三大核心组件之间的关系。 接着我们进入正题。 P…

解决VScode -正在本地下载 VS Code 服务器

不知道怎么回事再次连接服务器的时候一直卡在这里了,查看输出信息发现一直卡在下载处,报错信息如图1,输出信息如图2。 1.报错信息 图1 报错信息 图2 输出信息 2.尝试 【已解决】设置SSH主机:VS Code-正在本地下载 VS Code 服务器…

代码随想录算法训练营第二十五天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目链接/文章讲解: 代码随想录 视频讲解: 你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树_哔哩哔哩_bilibili 解题思路 在上一题的删除二叉树节点中,我们通过在…

无线收发模块家电控制实验

zkhengyang可申请加入数字音频系统研究开发交流答疑群(课题组) 当然可以先用固定电平发送,可以实现,0/1数据发送,接收。 可以使用51单片机来编码码,解码,或者任何MCU或者SOC,DSP,FPGA。 注意G…

初识指针(4)<C语言>

前言 前面的文章,已经对指针的基础概念以及运用有了初步了解,我们可以进一步探究指针比较深入的知识,下文将主要介绍:使用指针数组模拟二维数组、字符指针变量、数组指针、二维数组传参的本质、函数指针、typedef关键字等。 目录…

F. Circle Perimeter

思路&#xff1a;线性时间复杂度就可以解决&#xff0c;不用二分&#xff0c;我们枚举横坐标&#xff0c;然后看当前横坐标情况下多少个纵坐标满足条件。 代码&#xff1a; void solve(){int r;cin >> r;int y r, ans 0;for(int x 0;x < r;x ){ //枚举横坐标x&am…

只需3步,使用Stable Diffusion无限生成AI数字人视频(附安装包)

基本方法 搞一张照片&#xff0c;搞一段语音&#xff0c;合成照片和语音&#xff0c;同时让照片中的人物动起来&#xff0c;特别是头、眼睛和嘴。 语音合成 语音合成的方法很多&#xff0c;也比较成熟了&#xff0c;大家可以选择自己方便的&#xff0c;直接录音也可以&#…

Codeforces Round 944 (Div. 4) A - G

div.4只写部分题解了&#xff0c;都比较基础&#xff0c;数学偏多一点&#xff0c;几乎没有算法&#xff0c;有不懂的欢迎评论区提问&#xff01; A. My First Sorting Problem #include<bits/stdc.h> using namespace std ; typedef long long ll ; const int maxn 2…

org.hsqldb.jdbcDriver 类,导致 ClassNotFoundException 异常如何解决?

确保JDBC驱动包存在&#xff1a;检查系统是否已经安装了HSQLDB JDBC驱动。如果没有安装或驱动没有正确放置在类路径中&#xff0c;需要下载并添加它。你可以从 HSQLDB官网 下载JDBC驱动包。 添加JDBC驱动到类路径&#xff1a;将下载的HSQLDB JDBC驱动&#xff08;通常是一个JA…

2024年,Web开发新趋势!

随着我们迈入新的一年&#xff0c;现在正是审视2024年网页开发领域开始流行哪些趋势的绝佳时机。回顾2023年的一系列更新&#xff0c;以下是来年一些热门话题的概览。 自主托管有回归的趋势 近些年&#xff0c;自主托管一直是网页开发者和公司托管其应用程序的默认方式。开发…

【Linux系统编程】第十六弹---冯诺依曼体系结构与操作系统

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、冯诺依曼体系结构 2、操作系统原理 2.1、什么是操作系统&#xff1f; 2.2、用图解释操作系统 2.3、理解操作系统 总结 …

centos7.9系统rabbitmq3.8.5升级为3.8.35版本

说明 本文仅适用rabbitmq为RPM安装方式。 升级准备 查看环境当前版本&#xff1a; # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # rabbitmqctl status Status of node rabbitmq01 ... RuntimeOS PID: 19333 OS: Linux Uptime (seconds): 58 Is under …

在Tiled中制作动画瓦片图

什么是瓦片图&#xff1f;瓦片图是指用图块把游戏场景评出来 工具安装链接&#xff1a;Tiled | Flexible level editor 资源下载教程 资源下载&#xff1a;Mystic Woods - 16x16 Pixel Art Asset Pack by Game Endeavor 解压后得到一些资源 新建图块集合 Tiled的安装就不介绍…

【MySQL】——课程平台的创建设计

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

element-plus表单上传,唯一替换文件校验,封装方法统一管理

<el-formref"ruleFormRef":model"ruleForm":rules"rules"label-width"110px" ><el-form-item label"语言成绩材料" prop"languageList"><div class"dis-flex w100"><el-uploadref…

什么是Meme币?——区块链技术的加密货币

Meme代币是一种基于区块链技术的加密货币&#xff0c;旨在为用户提供一种简单、有趣且易于传播的方式来进行数字资产交易和投资。Meme代币通常与特定的主题或故事相关联&#xff0c;通过社交媒体等渠道进行传播和推广&#xff0c;吸引更多的用户参与并增加其价值。 Meme代币的…

英语学习笔记4——Is this your ...?

Is this your …? 词汇 Vocabulary suit /sut/ n. 西装&#xff0c;正装 suit 的配套&#xff1a; shirt n. 衬衫tie n. 领带&#xff0c;领结belt n. 腰带trousers n. 裤子shoes n. 鞋子 school /skuːl/ n. 学校 所有学校 搭配&#xff1a;middle school 初中    hig…