首页 > 其他分享 >关于自动限流的思考

关于自动限流的思考

时间:2023-08-03 12:13:08浏览次数:28  
标签:阈值 系统 流量 限流 自动 接口 思考

目标

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

现状:人工限流

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

问题 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),并使系统重新切换到正常状态。

备注

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

作者:京东零售 马坚

来源:京东云开发者社区

标签:阈值,系统,流量,限流,自动,接口,思考
From: https://www.cnblogs.com/Jcloud/p/17602942.html

相关文章

  • RPA开发复杂流程-为什么使用编码自动化而不是低代码?
    答:编码自动化可以让任何熟悉编码或脚本的人都能体验到更高的生产力、更好的复杂性管理、更高的协作和可审查性、改进的可读性和更高的性能。 ......
  • 特征学习——特征工程自动化,无非类似CNN最后一层softmax前的输出层就是特征表征层,但那
    通过representationlearning,我们可以把一些抽象的知识转化为具体的数值的形式,例如我们使用word2vec对“上下文”的模糊的概念进行了具象的表达,生成的wordvector包含了这种先验知识(具体的表现形式就是常出现在上下文里的单词其向量的距离很接近,实际上理解word2vec是基于embedding......
  • canvas实现视频播放并支持自动播放
    背景:在工作中很多时候会遇到大屏首页需要酷炫的动态背景,很多时候酷炫的动效用css和js比较难于实现。此时就会产生两种方案,第一种是采用gif,第二种会采用video方案。但是第一种方案有时候导出的gif图片往往会比较大,在首屏加载有时候会不太理想,资源比较大在加载时会出现一卡一卡......
  • 公共字段自动填充_代码开发_1
         ......
  • 公共字段自动填充_问题分析和实现思路
       ......
  • Drone自动化构建学习
    使用Drone进行自动化构建提到CI/CD,最有名的当然是jenkins,但是它好像太复杂了,不管是装在主机,还是装在docker里,都很难使用,更何况很多插件还很难下载。上手难度这么大,当然就不利于新手学习了,于是转而使用Drone,它可是相当轻量的产品了,本身就支持以容器提供服务。虽然只是简单的过程,......
  • 九、BAT脚本如何自动执行 adb shell 以后的命令
    @echooffechosu>temp.txtecho其它命令>>temp.txtadbshell<temp.txtdeltemp.txt求问BAT脚本如何自动执行adbshell以后的命令_百度知道http://zhidao.baidu.com/question/496847483.html把adb命令写在temp.txt里面。然后一次性执行......
  • [转载]Vbox中自动挂载共享文件夹的读取
    转载自Ubuntu中文论坛本文只解决在使用共享文件夹时勾选自动挂载的选项自动挂载被勾选后,虚拟机会自动在目录/media下建立"sf_NAME"的挂载点,其中NAME为在Windows的Vbox中设置的共享文件夹的名称./media目录为Linux为了挂载外部存储设备而设立的目录问题就出在这个挂......
  • 使用expect实现shell自动交互
    安装expectsudoaptinstallexpect要执行的脚本#!/bin/bash#cpao.shssh-keygen-f"/home/lyq/.ssh/known_hosts"-R"192.168.1.10"scpsd.shao_app.elfbrdc*[email protected]:/[email protected]交互输入脚本#!/usr/bin/expect#ca.tcls......
  • 软件测试|web自动化测试神器playwright教程(十二)
    前言在日常工作中,我们经常是基于某个测试环境地址去测试某个项目,所以应该把它单独拿出来做为一个全局的配置。其他网址可以使用不同的后缀,只使用相对地址。常见情景比如我们的社区,不同的类别只需要改变我们的后缀即可,如下图:首页地址为:https://ceshiren.com/,我们选择查看热门......