关于自动限流的思考

关于,自动,限流,思考 · 浏览次数 : 27

小编点评

## 自动限流方案解析 **目标:** 保证系统不因流量过载而挂。 **主要解决方案:** * **自动限流:** * 接口多,无法全面覆盖,自动配置或手动配置。 * 阈值无法准确评估,动态调整阈值。 * 阈值无法长期有效,实时评估阈值。 * **自动限流 + 人工限流:** * 混合模式,结合人工配置和自动配置。 * 人工限流用于重点接口,自动限流用于其他接口。 **具体方案:** * **接口多,无法全面覆盖:** * 自动配置限流规则,系统根据应用的流量情况自动配置限流阈值。 * **限流阈值无法准确评估:** * 使用历史流量峰值和压测结果等方式评估限流阈值。 * 阈值动态调整以应对环境变化。 * **限流阈值无法长期有效:** * 使用实时评估的阈值,以确保系统始终处于正常状态。 * 当资源使用率超过预警值时,自动触发系统全面限流。 **落地实践:** * 使用自动限流和人工限流结合的方式,可防止不可控性。 * 定期测试自动限流的准确性,及时进行调整。 * 建立反馈机制,收集用户反馈并进行模型优化。 **注意:** * 自动限流的具体阈值需要根据具体场景进行调整。 * 人工限流需要开发人员进行配置。 * 混合模式需要确保一致性和可靠性。

正文

目标

保证系统不因流量过载而挂。

现状:人工限流

正常的微服务限流工具都需要人工配置:支持应用负责人事先配置限流规则(接口 + 调用方 + 限流阈值),流量在阈值以下可以正常响应,超过阈值的流量会快速失败。这种方案存在如下问题:

问题 1. 接口多,无法全面覆盖

要想保证系统不因流量过载而挂,那就需要对所有中高频接口进行流量管控,不然任意接口的流量上升都可能成为 “压倒骆驼的最后一根稻草”。假设存在 a 个应用,按每个应用平均 b 个中高频接口,每个接口对应 c 个调用方,限流规则配置那数量为 (axbxc),稍微有点规模的部门这个数量就能上万,要想全面覆盖靠人工基本不可行。

问题 2. 限流阈值无法准确评估

当前限流阈值评估主要有 2 类:

  1. 历史流量峰值:比如近 7 天系统正常提供服务的流量峰值。但是这个值偏低,容易产生误杀。
  2. 压测:通过压测演练得出接口的容量上限。但是压测的方式很难模拟真实的线上环境,无论是数据质量,流量的参数质量,依赖方的性能,亦或同应用内不同接口的流量分布都很难与真实环境保持一致。

问题 3. 限流阈值无法长期有效

限流阈值会随着环境的变化而变化。例如流程中新增了一个依赖、或者数据库的数据量增多、热点数据增多、其他接口流量上升占用了更多系统资源、底层的基础设施发生变化等都会导致真实容量降低,限流阈值失效。在这种情况下,持续评估阈值来匹配系统的最新状态根本无法通过人工进行保证。

解决方案:自动限流

针对如上问题解法如下:

  • 问题 1. 接口多,无法全面覆盖
  • 解:系统自动配置
  • 问题 2. 限流阈值无法准确评估
  • 解:系统自动评估
  • 问题 3. 限流阈值无法长期有效
  • 解:系统动态调整

具体方案如下:

系统资源到达使用率到达预警线的时候, 系统自动触发系统进行全面限流, 各接口的限流值根据应用当前的流量状态以及历史的流量状态而定。

  1. 什么时候限流:应用的容量取决于系统的资源瓶颈,当资源的使用率到达某一水平的时候才需要限流。资源包括数据库、缓存、应用服务器等。
  2. 谁来限:系统自动
  3. 限哪些接口:由于同一个应用不同接口都共享了数据库、缓存等、应用服务器等资源,接口之间的容量会相互影响,所以需要全部接口都限制才能保证资源的使用率不再上升。
  4. 各接口限多少?在资源使用率到达瓶颈的时候,所有的接口性能都会下降,对应的限流阈值也应该下调。具体的限流计算有两种方式:
    1. 可以把系统在当前状态下各接口能够正常完成的请求量作为限流的参考值,来保证资源利用率不在上升。比如接口 A 接受到的请求速率为 100,其中 50 排队,20 报错,30 正常完成,那么该接口限流值可以参考 30(为排除正常抖动,具体的值可以通过滑动窗口进行平滑)。
    2. 可以把上一同比周期的同时间(比如昨天的同一时间)的各接口的请求量作为限流的参考值。 可以看着一种回滚:我不知道问题出在哪个接口,但是按照上个周期同时刻的流量来是没问题的。

落地实践:

为防止自动限流的不可控性,可同时使用自动限流和人工限流两种方式,具体方法如下:

  1. 系统分为正常状态和戒严状态:正常状态下使用人工限流,戒严状态下使用自动限流。
  2. 正常情况下系统使用人工限流,开发人员可以针对重点接口进行限流配置。
  3. 当限流值失效或者未配置限流的时候导致系统资源到达预警值时,系统进入戒严状态,此时系统由自动限流接管,并通知开发人员。
  4. 开发人员收到通知后进行排查,确定导致资源利用率上升的原因,并针对相关接口进行人工限流值的调整(可以参考到达瓶颈前的 qps),并使系统重新切换到正常状态。

备注

该方案还需更多场景验证,如有疏漏还请指出,欢迎有兴趣的小伙伴共同探讨。

作者:京东零售 马坚

来源:京东云开发者社区

与关于自动限流的思考相似的内容:

关于自动限流的思考

目标 保证系统不因流量过载而挂。 现状:人工限流 正常的微服务限流工具都需要人工配置:支持应用负责人事先配置限流规则(接口 + 调用方 + 限流阈值),流量在阈值以下可以正常响应,超过阈值的流量会快速失败。这种方案存在如下问题: 问题 1. 接口多,无法全面覆盖 要想保证系统不因流量过载而挂,那就需

华为云CodeArts Req需求管理工具,7大特性限时免费体验

摘要:一图了解什么是华为云CodeArts Req 本文分享自华为云社区《华为云CodeArts Req需求管理工具,7大特性限时免费体验》,作者:华为云PaaS服务小智。 一图了解什么是华为云CodeArts Req。 点击关注,第一时间了解华为云新鲜技术~

零基础写框架:从零设计一个模块化和自动服务注册框架

关于从零设计 .NET 开发框架 作者:痴者工良 教程说明: 仓库地址:https://github.com/whuanle/maomi 文档地址:https://maomi.whuanle.cn 作者博客: https://www.whuanle.cn https://www.cnblogs.co

关于对于Java中Entity以及VO,以及DTO中Request对象序列化的学习

关于 Serializable的探讨 前提引入 是由于软件测试上有同学提到说,什么该字段在程序刚运行时,导致jvm激增,所以吸引了我的注意 回顾代码 MybatisPlus Generator自动生成的entity中就经常带有这个, 而且我在开发代码的时候VO,以及DTO常常是直接复制对应的enti

【前端求助帖】关于使用element-plus select 模板嵌套popover中使用select选择后,上一个select自动关闭的问题

先看下效果 主页代码如下 项目使用的是Vue3+vite, 下载后,直接pnpm i安装依赖, pnpm dev 就是可以跑起来 打开弹框

数值计算:前向和反向自动微分(Python实现)

自动微分技术(称为“automatic differentiation, autodiff”)是介于符号微分和数值微分的一种技术,它是在计算效率和计算精度之间的一种折衷。自动微分不受任何离散化算法误差的约束,它充分利用了微分的链式法则和其他关于导数的性质来准确地计算它们。我们可以选择定义一种新的数据类型来存储[u,u′]和[v,v′]这类数对。我们可以在这些数对上定义一种代数运算,这些代数运算编码了一些经典的操作。

VSCode中打开NodeJS项目自动切换对应版本的配置

这几年搞了不少静态站点,有的是Hexo的,有的是VuePress的。由于不同的主题对于NodeJS的版本要求不同,所以本机上不少NodeJS的版本。 关于如何管理多个NodeJS版本,很早之前就写过用nvm来管理的相关文章,这里就不赘述了,有需要的可以看这篇[Node.js环境搭建](https:/

物理机和虚拟机上CPU睿频的区别

# 物理机和虚拟机上CPU睿频的区别 ## 关于睿频 ``` 睿频是指当启动一个运行程序后,处理器会自动加速到合适的频率, 而原来的运行速度会提升 10%~20% 以保证程序流畅运行的一种技术。 一般max的睿频不能超过特别长的时间. 他的能耗和TDP的影响都比较大. 睿频与很多环境和硬件相关: 1

【FAQ】统一扫码服务常见问题及解答

1.隐私政策是怎么样的?收集哪些信息? 关于Scan Kit的隐私政策及收集的信息,请查看SDK隐私安全说明。 Android:SDK隐私安全说明 iOS:SDK隐私安全说明 2.如何使用多码识别?多码模式下如何实现指定条码?多码模式的坐标支持返回坐标么?多码模式下实现自动放大? 1)统一扫码服务支

记一次 .NET 某医疗器械 程序崩溃分析

一:背景 1.讲故事 前段时间有位朋友在微信上找到我,说他的程序偶发性崩溃,让我帮忙看下怎么回事,上面给的压力比较大,对于这种偶发性崩溃,比较好的办法就是利用 AEDebug 在程序崩溃的时候自动抽一管血出来,看看崩溃点是什么,其实我的系列文章中,关于崩溃类的dump比较少,刚好补一篇上来,话不多说