常见的限流降级方案

简介: 【1月更文挑战第21天】

在现实情况下,当面对极端的业务场景时,瞬时的业务流量会带来大大超出系统真实容量的压力。通常采取的策略就是限流降级,以保障承诺容量下的系统稳定;同时还有业务层面的开关预案执行,峰值时刻只保障核心业务功能,非核心业务功能就关闭。


首先,我们先梳理清楚限流和降级的概念,明白它们会发挥怎样的作用,这样才便于理解后续的解决方案。


  • 限流,它的作用是根据某个应用或基础部件的某些核心指标,如 QPS 或并发线程数,来决定是否将后续的请求进行拦截。比如我们设定 1 秒 QPS 阈值为 200,如果某一秒的 QPS 为 210,那超出的 10 个请求就会被拦截掉,直接返回约定的错误码或提示页面。
  • 降级,它的作用是通过判断某个应用或组件的服务状态是否正常,来决定是否继续提供服务。以 RT 举例,我们根据经验,一个应用的 RT 在 50ms 以内,可以正常提供服务,一旦超过 50ms,可能就会导致周边依赖的报错或超时。所以,这时我们就要设定一个策略,如果应用的 RT 在某段时间内超过 50ms 的调用次数多于 N 次,那该应用或该应用的某个实例就必须降级,不再对外提供服务,可以在静默一定时间后(比如 5s 或 10s)重新开启服务。


常见的限流解决方案

第一类,接入层限流。

作为业务流量的入口,我们限流的第一道关卡往往会设置在这里,而且接入层限流往往也是最有效的。这里又有两类解决方案,根据接入层所使用的技术方案而定。


1.Nginx 限流

Nginx 或其开源产品是最常用的 Web 服务器,比如 TEngine。对于一个 Web 类应用,如 Web 页面或 H5 页面,我们通常会将限流策略增加到这一层,会设置 QPS、并发数以及 CPU 的 Idle 作为限流指标。Nginx 有对应的函数接口,可以获取到以上指标信息,然后通过 Lua 脚本实现限流的逻辑,并作为 TEngine 的插件安装即可。


2.API 路由网关模式

对于客户端模式的接入,使用了 API 路由网关模式,一方面可以更方面地管理客户端与服务端的链接,另一方面也可以通过配置的方式管理服务接口,这里的服务管理会复用到微服务架构的配置中心,并实现相应的路由策略。对于 QPS 和并发限流,直接在配置中心中进行配置即可。


第二类,应用限流。

这一类的限流策略跟上面 API 路由网关模式的限流相似,同样是依赖配置中心管理,限流逻辑会配套服务化的框架完成。


第三类,基础服务限流。

要针对数据库、缓存以及消息等基础服务组件的限流而设定。同样,限流逻辑会配套分布式数据库中间件,缓存或消息的框架来实现。


  • 资源和策略。资源是我们要进行限流的对象,可能是一个应用,或者一个方法,也可能是一个接口或者 URL,体现了不同的限流粒度和类型。策略就是限流的规则,比如下面我们要提到的 QPS 和并发数限流。
  • 时间精度。主要指对于 QPS、并发数或 CPU 的阈值判断。比如对于 QPS,我们就会设定一个 QPS 时间精度(假设 3s),如果低于阈值则不启用策略,如果超过阈值就启动限流策略。
  • 指标计数。对于并发限制请求,会统计当前的并发数,1 次请求进入到限流模块加 1,等请求结束退出时减 1,当前正在处理的请求数就是并发数。对于 QPS 限流,统计 QPS 不能按照秒统计,因为第 1s,系统可能就被打挂了,所以 QPS 得按照毫秒级别去统计,统计的级别越小,性能损耗越大。所以定在 10ms~100ms 的级别去统计会更平滑一些,比如将 1s 切成 10 份,每一份 100ms,一个请求进来肯定会落在某一份上,这一份的计数值加 1。计算当前的 QPS,只需要将当前时间所在份的计数和前面 9 份的计数相加,内存里面需要维护当前秒和前面 2 秒的数据。
  • 限流方式。对于 Nginx 就针对总的请求进行限流即可,但是粒度会比较粗。对于应用层,因为配置中心的灵活性,其限流就可以做得更细化。比如可以针对不同来源限流,也可以针对去向限流,粒度上可以针对类级别限流,也可以针对不同的方法限流,同时还可以针对总的请求情况限流,这些灵活策略都可以在微服务的配置中心实现。
  • Spring AOP。对于 Java 应用,绝大多数公司都会用到 Spring 框架,包括我们上面讲到的分布式数据库等组件,也一样会依赖 Spring 框架,比如我们用到的 MyBatis 开源组件。而 Spirng 框架中的关键技术点,就是 IoC 和 AOP,我们在限流方案的实现上,也会利用到相关技术。
  • Web 类型的限流。对于 Web 类型 URL 接口限流,我们就利用 Servlet 的 Filter 机制进行控制即可。
  • 控制台。上面我们讲了各种配置和策略,如果都是通过人工来操作是不现实的,这时就需要开发对应的限流降级的控制台,将上述的各种配置和策略通过界面的方式进行管理,同时在配置完成之后,能够同步到对应的服务实例上。比如对于 Nginx,当一个策略配置完成后,就要同步到指定的服务器上生成新的配置文件并 Reload。对于配置中心模式的策略,也就是 Spring AOP 模式的限流,在控制台上配置完成后,就要将配置值同步更新到配置中心里,同时再通过运行时的依赖注入,在线上运行的业务代码中生效。


对于降级,主要是针对 RT 来进行判断,它的整个技术方案没有限流这么复杂,且思路上跟限流是相似的,从整个建设过程来看,限流降级的难点和关键还是在于整体技术栈的统一,以及后期对每个应用限流降级资源策略的准确把握和配置。


再来看对应用的限流降级资源策略的把握,这个就需要对应用和业务有深入的了解。比如开发人员要非常清楚哪些接口是核心接口,它的来源和去向有哪些;哪些来源是核心的,哪些是非核心的;如果要限流,需要对哪些接口限流,同时要重点保障哪些接口等等。


所以,限流和降级也是一个动态调测和完善的过程,对于有些动态变化的资源是做不到一劳永逸的


相关文章
|
NoSQL Java 关系型数据库
秒杀场景下如何保证数据一致性?就这个问题我给出了最详细的方案
本文主要讨论秒杀场景的解决方案。 什么是秒杀? 从字面意思理解,所谓秒杀,就是在极短时间内,大量的请求涌入,处理不当时容易出现服务崩溃或数据不一致等问题的高并发场景。 常见的秒杀场景有淘宝双十一、网约车司机抢单、12306抢票等等。
|
消息中间件 SQL 存储
超详细的RabbitMQ入门,看这篇就够了!
RabbitMQ入门,看这篇就够了
217011 68
|
7月前
|
人工智能 安全 网络安全
三大运营商骨干网架构深度剖析:线路建设与用户体验
本文全面解析了中国三大电信运营商(中国电信、中国联通、中国移动)的网络架构及性能特点,涵盖骨干网技术、区域线路实测、应用场景优化及未来发展趋势。具体内容包括:中国电信的双网体系(163骨干网与CN2精品网)、联通的169网络与企业级A网、移动的新一代智能骨干网及其铁通网络现状。通过东亚、东南亚、欧洲等方向的实测数据,对比分析了各运营商在时延、带宽、稳定性等方面的表现,并结合企业组网、个人用户需求及安全成本提供了针对性建议。同时,文章展望了6G、量子通信和AI定义网络的技术前景,为企业和个人在网络选择中平衡性能、成本与风险提供了参考依据。
1273 23
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
9月前
|
Prometheus 监控 Cloud Native
高频面题: 你们线上 QPS 多少?你 怎么知道的?
本文由45岁资深架构师尼恩撰写,针对高级开发和架构师面试中的高频问题提供详细解答。文章涵盖了QPS、TPS、RT等性能指标的定义及计算方法,详解了如何配置Prometheus与Grafana监控系统QPS,并提供了应对高并发场景(如双十一抢购)的系统部署策略。此外,还分享了多个大厂面试真题及解决方案,帮助读者在面试中充分展示技术实力,提升求职竞争力。建议收藏并深入学习,为面试做好充分准备。更多内容可参考《尼恩Java面试宝典》及相关技术圣经系列PDF。
|
Java 数据库连接 Maven
如何使用Sentinel实现流控和降级
通过以上步骤,你可以使用Sentinel实现应用的流量控制和降级操作,以保护系统在高流量或不稳定情况下的稳定性。欢迎关注威哥爱编程,一起学习成长。
412 1
|
12月前
|
Kubernetes 架构师 Java
史上最全对照表:大厂P6/P7/P8 职业技能 薪资水平 成长路线
40岁老架构师尼恩,专注于帮助读者提升技术能力和职业发展。其读者群中,多位成员成功获得知名互联网企业的面试机会。尼恩不仅提供系统化的面试准备指导,还特别针对谈薪酬环节给予专业建议,助力求职者在与HR谈判时更加自信。此外,尼恩还分享了阿里巴巴的职级体系,作为行业内广泛认可的标准,帮助读者更好地理解各职级的要求和发展路径。通过尼恩的技术圣经系列PDF,如《尼恩Java面试宝典》等,读者可以进一步提升自身技术实力,应对职场挑战。关注“技术自由圈”公众号,获取更多资源。
|
IDE Java 编译器
lombok编译遇到“找不到符号的问题”
【9月更文挑战第18天】当使用 Lombok 遇到 “找不到符号” 的问题时,可能是由于 Lombok 未正确安装、编译器不支持、IDE 配置不当或项目构建工具配置错误。解决方法包括确认 Lombok 安装、编译器支持,配置 IDE 和检查构建工具配置。通过这些步骤通常可解决问题,若问题仍存在,建议检查项目配置和依赖,或查看日志获取更多信息。
4809 2
|
算法 Java Sentinel
限流算法(计数器、滑动时间窗口、漏斗、令牌)原理以及代码实现
> 本文会对这4个限流算法进行详细说明,并输出实现限流算法的代码示例。 > 代码是按照自己的理解写的,很简单的实现了功能,还请大佬们多多交流找bug。
1689 0
|
开发者
如何画业务架构图
如何快速上手画业务架构图
10372 2