关于自动限流的思考 | 京东云技术团队

京东云开发者
• 阅读 144

目标

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

现状:人工限流

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

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

备注

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

作者:京东零售 马坚

来源:京东云开发者社区

点赞
收藏
评论区
推荐文章
MaxSky MaxSky
3年前
Lumen 中对 Dingo API 异常接管并自定义响应结果
场景描述比如我们需要对API限流抛出的异常进行接管,并重写响应消息,首先应用中间件:phpuseDingo\Api\Routing\Router;$apigroup('middleware''api.throttle',//限流中间件'expires'1,//时间范围,单位“分”'lim
不是海碗 不是海碗
1年前
景区如何限流?竟然可以用人脸检测做到
我们可以通过人脸检测去进行景区限流。在景区门口放置摄像头,摄像头捕捉到游客的人脸图像,然后使用人脸检测技术,识别出图像中是否含有人脸,含有几张人脸,检测一张人脸,就在计数器上1。这样景区就可以通过客流量的统计,当达到最大客流量的时候,就停止进入,实现景区限流。
Chase620 Chase620
3年前
简析限流算法
简析限流算法1.简介限流顾名思义是限制流量,限制流量的目的是为了保障服务稳定运行,避免服务被流量冲垮。当流量超出服务处理能力时,部分请求将会被限流组件拦截。被拦截的请求可能会被丢弃,如果是C端请求,那么这个请求可能会被导向指定的错误页上,而不是生硬的拒绝。这里我们丢
高并发场景下常见的限流算法及方案介绍
现代互联网很多业务场景,比如秒杀、下单、查询商品详情,最大特点就是高并发,而往往我们的系统不能承受这么大的流量,这时候限流熔断就发挥作用了,限制请求数,快速失败,保证系统满负载又不超限。本文为大家介绍几种常见的限流算法及方案
Stella981 Stella981
2年前
Spring Cloud Gateway 扩展支持动态限流
之前分享过一篇《SpringCloudGateway原生的接口限流该怎么玩》(https://my.oschina.net/giegie/blog/1838560),核心是依赖SpringCloudGateway默认提供的限流过滤器来实现原生RequestRateLimiter的不足
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Sentinel 是如何做限流的
限流是保障服务高可用的方式之一,尤其是在微服务架构中,对接口或资源进行限流可以有效地保障服务的可用性和稳定性。之前的项目中使用的限流措施主要是Guava的RateLimiter。RateLimiter是基于令牌桶流控算法,使用非常简单,但是功能相对比较少。而现在,我们有了一种新的选择,阿里提供的Sentinel。Sentinel是阿里巴巴提供
Stella981 Stella981
2年前
Spring Cloud Gateway限流浅析之一段脚本实现令牌桶
前言在一个分布式高并发的系统设计中,限流是一个不可忽视的功能点。如果不对系统进行有效的流量访问限制,在双十一和抢票这种流量洪峰的场景下,很容易就会把我们的系统打垮。而作为系统服务的卫兵的网关组件,作为系统服务的统一入口,更需要考虑流量的限制,直接在网关层阻断流量比在各个系统中实现更合适。SpringCloudGateway的实现
常用限流算法详解
一、有哪些常用的限流算法1.固定窗口限流;2.滑动窗口限流;3.漏桶算法限流;4.令牌桶算法限流。二、4种限流算法介绍1.固定窗口限流举例说明:假设时间窗口大小为5s,则0到5s为第一个窗口,5到10s为第二个窗
京东云开发者 京东云开发者
12个月前
限速神器RateLimiter源码解析 | 京东云技术团队
作者:京东科技李玉亮目录指引限流场景软件系统中一般有两种场景会用到限流:•场景一、高并发的用户端场景。尤其是C端系统,经常面对海量用户请求,如不做限流,遇到瞬间高并发的场景,则可能压垮系统。•场景二、内部交易处理场景。如某类交易任务处理时有速率要求,再如上