Skip to content

限流降级

限流降级是保护服务的重要手段,限流防止服务被过载请求打垮,降级保证核心功能可用。限流降级是系统自我保护的第一道防线。

限流

为什么需要限流

保护服务:服务容量有限,超过容量的请求会导致服务响应变慢或崩溃。

保护依赖:服务依赖的第三方服务有容量限制,超过限制会被封禁。

防止雪崩:服务故障时,限流可以减少故障服务的请求,避免雪崩。

限流算法

固定窗口:将时间分成固定大小的窗口,每个窗口内限制请求数。简单但窗口边界问题。

滑动窗口:将时间分成更小的单元,记录每个单元的请求数。平滑无边界问题。

令牌桶:以恒定速率放入令牌,请求消耗令牌。可以应对突发流量。

漏桶:以恒定速率处理请求,平滑输出。

限流维度

QPS 限流:每秒请求数限流,适用于短时间请求。

并发限流:并发请求数限流,适用于长连接请求。

用户限流:根据用户 ID 限流,防止个别用户占用过多资源。

IP 限流:根据 IP 限流,防止恶意攻击。

限流策略

直接拒绝:请求超过限流阈值时直接拒绝,返回错误码或错误信息。

排队等待:请求超过限流阈值时排队等待,有请求完成则处理排队请求。

Warm Up:限流阈值从较小值逐渐增加到目标值,避免系统启动时大量请求导致故障。

匀速排队:请求以匀速通过,平滑处理请求。

降级

为什么需要降级

服务故障时,保证核心功能可用,降低用户体验损失。

资源不足时,释放非核心功能的资源,确保核心功能正常运行。

降级策略

默认值:返回默认值,如空列表、空对象、固定值。

缓存:返回缓存的响应,如 Redis 缓存的响应。

本地兜底:执行本地逻辑,如查询本地数据库。

快速失败:直接返回错误,不执行任何逻辑。

关闭非核心功能:暂时关闭非核心功能,释放资源。

降级级别

一级降级:核心功能降级,如订单创建失败返回友好提示。

二级降级:重要功能降级,如推荐服务故障返回热门商品。

三级降级:非核心功能降级,如评论服务故障直接关闭评论功能。

自动降级

超时降级:请求超时自动降级,返回默认值。

异常降级:请求异常(如异常率超过阈值)自动降级。

限流降级:请求被限流自动降级,返回限流提示。

限流降级的实现

Sentinel

Sentinel 是阿里开源的流量防卫组件,提供限流、熔断降级、系统保护。

Sentinel 的限流:QPS 限流、并发线程数限流、热点参数限流。

Sentinel 的降级:慢调用比例、异常比例、异常数。

Sentinel 的优势:性能高、实时监控、规则动态配置。

Hystrix

Hystrix 是 Netflix 开源的熔断降级库,已停止维护。

Hystrix 的特性:熔断器、线程池隔离、信号量隔离、请求缓存、请求合并。

Resilience4j

Resilience4j 是受 Hystrix 启发的容错库,提供熔断器、限流、重试、舱壁隔离。

Resilience4j 的优势:轻量级、模块化、性能高、维护活跃。

限流降级的最佳实践

分层限流:网关层限流(粗粒度)、应用层限流(细粒度),形成多级防护。

限流阈值设置:根据压测结果设置限流阈值,留有余量。

降级逻辑要简单:降级逻辑不应依赖其他服务,避免降级失败。

降级逻辑要有默认值:降级时返回默认值,保证核心功能可用。

监控限流降级:监控限流降级触发情况,分析限流降级原因,调整策略。

定期演练:定期进行限流降级演练,验证降级逻辑的有效性。

限流降级是保护服务的重要手段,合理使用限流降级,可以提高系统的稳定性和可用性。