4种典型限流实践保障应用高可用|云效工程师指北

简介:4种典型限流实践保障应用高可用,本文总结了一份AHAS限流实践指南,如果你的系统有被恶意用户攻击的风险,或者系统中某个应用出现异常可能会造成雪崩效应,那么这篇文章会对你有所帮助。

大家好,我叫黄博文,花名延枚,目前负责云效旗下产品Flow流水线的设计和开发。在微服务架构下,服务越来越多,服务之间的调用也会越来越复杂。如何保障服务的高可用性就成为了一个挑战。之前我参与过的某个产品就曾出过故障,原因是某个API调用突然间增加了数十倍,导致服务负载过高,影响了用户使用。如果当时能够有一种机制能快速对这个异常的API进行限流或熔断,就能避免服务陷入不稳定的状况。云效自身使用阿里云 AHAS (Application High Availability Service)来保障应用的高可用,本文总结了一份AHAS限流实践指南,如果你的系统有被恶意用户攻击的风险,或者系统中某个应用出现异常可能会造成雪崩效应,那么这篇文章会对你有所帮助。

一个完善的应用高可用解决方案,首先需要对应用的接口进行监控,能够实时统计当前应用接口的QPS情况。其次要能够针对不同API和场景配置各种限流和熔断规则,比如如果某个API QPS超过300了就需要对超过的调用做限流处理。能够提供限流的工具很多,流行的有guava RateLimiter、Hystrix等。但这些工具上手成本较高,搭建起整个体系并不简单。

如何快速建立应用的限流体系?这就要介绍阿里云提供的应用高可用服务 AHAS (Application High Availability Service)。AHAS 是经阿里巴巴内部多年高可用体系沉淀下来的云产品,基于阿里开源流控降级组件 Sentinel,以流量与容错为切入点,从流量控制、不稳定调用隔离、熔断降级、热点流量防护、系统自适应过载保护、集群流控、服务防抖动等多个维度来帮助保障服务和网关的稳定性,同时提供秒级的流量监控分析功能。AHAS 不仅在阿里内部淘宝、天猫等电商领域有着广泛的应用,在互联网金融、在线教育、游戏、直播行业和其他大型政央企行业也有着大量的实践。

限流限的是什么

限流的目的是为了避免系统承受过大的流量导致不可用。那么这些流量会来自哪里呢?

按照访问的方式,可以分为:

  1. HTTP的同步调用。比如你在通过浏览器访问一个站点的页面时候,就会产生这种流量。
  2. 后台任务调用。这个取决于业务形态,比如一个站点向用户开放了定时执行任务的能力,那么用户每多配置一个这种任务,就会对系统造成更多的流量。

按照访问的意图,可以分为:

  1. 正常业务增长。比如用户增加了,做了运营活动等等,都会导致整体的业务量增加。
  2. 恶意用户的恶意行为。比如某个用户对站点进行DDOS攻击,或者对于上面提到的那种提供定时执行任务能力的网站而言,恶意的配置大量的定时任务,从而间接对系统造成巨大的负载,等等。

按照访问的来源,可以分为:

  1. 终端用户。这些用户是最终使用者,其总访问量会随着正常业务的增长而增长。
  2. 系统调用。比如有其他系统基于你的能力构建自己的产品,那么就要和这些系统进行约定,访问的最大频率是多少,并把这些频率的值落地在限流策略中。

了解了流量的来源之后,我们就知道应该限制什么了。

  1. 限制整个系统的使用频率,这个在实际的使用中,通常会换算成单机的使用频率,保证单机不被压垮。同时配合告警,出现瓶颈时候,通过紧急扩容来解决问题。
  2. 限制单个用户(或者单个租户,取决于你的业务形态)的使用频率。
  3. 限制上游不同的系统调用的使用频率。
  4. 针对上述的限制,都需要能够支持HTTP的同步调用和后台任务调用。

接下来我们从保证系统整体可用性、防止个别用户滥用、隔离上游系统异常调用以及全方位限流4个方面,具体讲解如何使用阿里云AHAS实现限流。

保证系统整体可用性

配置限流时,我们需要建立一个通用的限流规则保障核心接口的稳定性,避免单点瓶颈引发全局问题。

一个流控规则包含以下内容:

  • 接口名称:即对哪个接口进行流控。
  • 来源应用:设置为default,即对所有调用方都一视同仁,对整个系统的调用进行限流。关于这个配置的用法,会在后面的“针对其他上游系统调用的限流”部分展开讨论。
  • 单机QPS阈值:单机的QPS容量,超过阈值后会被限流
  • 流控效果:当接口调用超过QPS阈值后的处理措施

我们也可以配置触发限流后的接口返回值。对于Web接口而言,通常被限流的接口会返回429 Too Many Requests错误码,告知调用方请求太频繁。

对一个接口进行限流时,难点是填写具体的QPS阈值。我们可以在性能测试环境对应用进行压测,压出单机下某个接口的QPS极限值,然后将阈值定为极限值的某个比例,比如极限值的90%。比如某个接口单机可承受极限为200QPS,那么阈值可定为200*90%= 180。

防止个别用户滥用

这个场景下,需要先梳理出来系统的核心业务入口,通常是service层的一个入口函数,针对每个入口函数预设单个用户合理的使用频率,然后就可以利用AHAS的热点参数流控能力,来并进行限制。

在入口函数上添加注解:

@SentinelResource(value = "biz1")
public Result doBussinessLogic(String uid, int type) {// uid参数索引为0,type参数索引为1。// some logic here...
}

代码中需要做两件事情

  1. 从请求中提取出需要防护的维度,比如上面代码中的uid,即用户的标识。并保证该标识作为业务入口函数的入参传入。
  2. 给该函数添加@SentinelResource注解。其中的value="biz1"为这个资源的标识,会用在控制台配置中进行引用。

然后在控制台进行配置。假设我们希望,在服务级别每分钟单用户最多调用20次,服务共有5个实例。则可以进行如下配置。意思是在第0个参数,也就是用户,这个维度上进行限流,单机最多每60s进行4次调用,则集群维度就是每分钟最多20次调用。

目前AHAS还不支持直接进行集群维度的配置,实际使用中需要简单的换算下。

详细说明,请参考:
配置热点规则 - 应用高可用服务 AHAS - 阿里云 。

隔离上游系统异常调用

对于一个应用的接口来说,通常会被上游多个系统调用。上面虽然介绍了如何对单个接口进行整体限流,但实际场景中,我们会需要对不同的上游系统采用不同的限流阈值。比如上游调用方A是主链路,希望QPS阈值能高一些,上游调用方B为旁支链路,QPS阈值可以低一些。那么我们需要在Web容器启动时注入抽取租户特征值的拦截器。根据来源应用标识来对不同来源给予不同的阈值。

@Configuration
public class InterceptorConfiguration extends WebMvcConfigurerAdapter {@PostConstructpublic void setOriginParser() {WebCallbackManager.setRequestOriginParser(httpServletRequest -> httpServletRequest.getHeader("income"));}
}

WebCallbackManager.setRequestOriginParser 接受一个参数为HttpServletRequest的回调,我们需要通过HttpServletRquest对象中的内容来区分调用方A和B。比如应用A和B在调用接口时会传入不同的header income,那么就可以通过该header来区分来源应用A和B。最后在流控规则中建立起对A和B不同限流阈值。如下图所示。

全方位限流,不限于HTTP

AHAS可以快速的把Web接口纳入到流控之中。但如果我们应用的一些代码不属于Web接口,但也想启用流控,那么仍然可以使用AHAS提供的热点规则的能力。以下是个示例。

    @SentinelResource(blockHandler = "blockHandlerExecuteTask")public Boolean executeTask(Long taskId) throws Exception {return taskService.executeTask(taskId);}public Boolean blockHandlerExecuteTask(Long taskId, BlockException ex) {throw new RuntimeException("execute task exceed");}

重启应用后,在接口详情页的自定义埋点tab中,就可以看到AHAS收集的自定义埋点接口数据,接口名称组成为类名:方法名的格式。

接着可以给这个埋点接口配置限流规则,开启防护。

以上就是我们使用AHAS服务时配置限流的常用实践,希望对大家有所帮助。

原文链接

本文为阿里云原创内容,未经允许不得转载。 

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

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

相关文章

超融合中国力量崛起,IDC2022年Q1报告出炉浪潮中国市场位列前三

国际数据公司(IDC)发布《2022Q1中国软件定义存储及超融合市场研究报告》,报告显示:2022年第一季度浪潮超融合销售额同比增长86.3%,近8倍于业内平均增速,市场份额跻身中国前三。 浪潮超融合在政府和金融行业…

阿里巴巴云原生大数据运维平台 SREWorks 正式开源

简介:阿里巴巴云原生大数据运维平台 SREWorks,沉淀了团队近10年经过内部业务锤炼的 SRE 工程实践,今天正式对外开源,秉承“数据化、智能化”运维思想,帮助运维行业更多的从业者采用“数智”思想做好高效运维。 作者 | …

css小技巧

当文字超出时用胜率号代替 <p>这是一段超出内容的话&#xff0c;必须要超出才会出现省略号</p> p{width: 200px;height: 20px;line-height: 20px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis; }让文字的颜色为渐变 <p>我需要成为渐变色…

阿里云 VPC 内网性能测试最佳实践

简介&#xff1a;本文介绍了在阿里云 VPC 内网执行性能测试的方法。相较于传统的公网性能测试&#xff0c;VPC 内网性能测试完全在客户 VPC 环境进行&#xff0c;无需暴露服务到公网&#xff0c;安全性更高&#xff0c;灵活性更强。 作者:风起 背景 随着互联网的快速发展&am…

​在可视化大屏中轻松完成机器学习建模和调参应用实例

Streamlit 是一个开源 Python 库&#xff0c;可帮助开发人员为其系统创建交互式图形用户界面。它专为机器学习和数据科学家团队设计。使用 Streamlit&#xff0c;我们可以快速创建交互式 Web 应用程序并进行部署。前端工作对数据科学家来说并不重要&#xff0c;他们只想要一个小…

router的使用

路由和线路 路由router 表示当前项目全局的路由实例对象 跳转方法&#xff1a;push&#xff0c;replace&#xff0c;go&#xff0c;back 线路route 表示当前路由页面的信息对象 获取动态路由的参数&#xff1a;params router跳转的两种方式 js跳转叫[编程式跳转] <butto…

EventBridge 事件总线及 EDA 架构解析

简介&#xff1a;EventBridge 是事件驱动的具体落地产品&#xff0c;也是 EDA 的最佳实践方式。 作者&#xff1a;肯梦 作为 Gartner 定义的 10 大战略技术趋势之一&#xff0c;事件驱动架构&#xff08;EDA&#xff09;逐渐成为主流技术架构。根据 Gartner 的预估&#xff0…

开发者驱动的软件公司,如何赚取万亿美元?

【CSDN 编者按】在过去二十年中&#xff0c;诞生了两个价值数万亿美元的企业软件行业&#xff1a;SaaS&#xff08;Software as a Service&#xff0c;软件即服务&#xff09;软件和公有云。如今&#xff0c;第三个以开发者为核心的万亿美元软件浪潮正在来袭&#xff0c;企业该…

解决vue路由守卫报错信息

//在router文件中写入&#xff0c;修改报错信息 const originalPush VueRouter.prototype.push VueRouter.prototype.push function push(location, onResolve, onReject) {if (onResolve || onReject) {return originalPush.call(this, location, onResolve, onReject)}retu…

好云推荐官丨飞天加速之星怎样选择云服务器ECS?

编者按&#xff1a;本文来自“好云推荐官”活动的技术博主投稿&#xff0c;作者&#xff08;昵称天狼&#xff09;曾入选首届“飞天加速之星”&#xff0c;获得飞天人气奖。 ​你是否还在苦苦地寻找一家合适的云厂商&#xff0c;寻找合适的服务器来部署你开发的网站、程序&…

2022钉钉发布会|云钉低代码新模式、新能力、新机遇

简介&#xff1a;宜搭重磅发布酷应用工厂、连接器、AIFaaS扩展等新功能&#xff01; 3月22日&#xff0c;以“科技向实&#xff0c;万物生长”为主题的2022钉钉发布会在杭州举行。 阿里巴巴资深技术专家&#xff0c;钉钉宜搭创始人叶周全出席发布会&#xff0c;并在 “人人都…

最佳实践|Spring Boot 应用如何快速接入 Prometheus 监控

简介&#xff1a;SpringBoot 微服务的开发、发布与部署只占其生命周期的一小部分&#xff0c;应用和系统运维才是重中之重。而运维过程中&#xff0c;监控工作更是占据重要位置。那么&#xff0c;为了对系统的状态进行持续地观测&#xff0c;面向Spring Boot应用我们该如何快速…

vue知识总结

vue 定义 以数据驱动视图的渐进式&#xff08;轻量级&#xff09;mvvm框架 响应式原理&#xff1a;Object.defineProperty 指令 html&#xff0c;text&#xff0c;show&#xff0c;if&#xff0c;for&#xff0c;model&#xff0c;slot&#xff0c;once&#xff0c;bind&am…

容器进程调度时是该优先考虑CPU资源还是内存资源?

大家好&#xff0c;我是飞哥&#xff01;前几天看到一个有意思的问题&#xff0c;我前几天在朋友圈分享了&#xff0c;今天再在公众号里给大家发一下。问题是这样的&#xff1a;有 A B 两台服务器&#xff0c;其中 A 服务器 cpu 快满了&#xff0c;内存很空闲。另外一台 B 服务…

基于容器服务 ACK 发行版打造 CNStack 社区版

简介&#xff1a;本文将介绍如何使用 ACK Distro 作为基础镜像打造 CNStack 社区版以及CNStack 社区版中的容器服务 ACK 敏捷版产品如何帮助用户更好的使用容器平台能力。 作者&#xff1a;临石 CNStack 社区版&#xff08;CNStack Community Edition, CNStack CE&#xff09…

阿里云云原生微服务可观测实践

简介&#xff1a;如果说监控可以告诉我们系统出问题了&#xff0c;那么可观测就可以告诉我们系统哪里出问题了&#xff0c;什么原因导致的问题。可观测不但可以判断系统是否正常&#xff0c;还可以在系统出现问题之前&#xff0c;主动发现系统风险。 作者&#xff1a;十眠、水…

“合”而不同,持“智”以恒,幂律智能2022产品升级发布会全程回顾!

今天&#xff0c;“合”而不同&#xff0c;持“智”以恒&#xff0c;幂律智能2022产品升级发布会正式和大家见面。 发布会共分为「嘉宾致辞」、「产品分享」、「客户实例」等部分&#xff0c;多位行业专家、学者大咖等纷纷发来视频&#xff0c;表达对幂律本次活动的祝愿。 清华…

call() , apply() ,bind()的用法

call() , apply() ,bind()的用法 - 作用&#xff1a;改变this指向&#xff0c;可以传递参数 - 语法&#xff1a; A.call(B, 参数1, 参数2)A.apply(B, [ 参数1, 参数2])A.bind(B, 参数1, 参数2)()var name "小王", age 17var obj {name: 小张,age: this.age,myAg…

数智科技护航微出行

锂电池智能化“改为”刀锋智锂、爱龙电气架构、麒麟数智安全管理平台&#xff0c;让数智科技&#xff0c;为电动自行车安全出行套上“紧箍圈”。 电动自行车安全隐患 电动自行车价格便宜、使用方便&#xff0c;已经成为人们日常短途出行的重要交通工具。相关数据显示&#xf…

EMR StarRocks 极速数据湖分析原理解析

简介&#xff1a;数据湖概念日益火热&#xff0c;本文由阿里云开源大数据 OLAP 团队和 StarRocks 数据湖分析团队共同为大家介绍“ StarRocks 极速数据湖分析 ”背后的原理。 【首月99元】EMR StarRocks 数据湖极速分析体验&#xff0c;试用火热进行中&#xff0c;快来申请吧 -…