限流降级
限流降级是保护服务的重要手段,限流防止服务被过载请求打垮,降级保证核心功能可用。限流降级是系统自我保护的第一道防线。
限流
为什么需要限流
保护服务:服务容量有限,超过容量的请求会导致服务响应变慢或崩溃。
保护依赖:服务依赖的第三方服务有容量限制,超过限制会被封禁。
防止雪崩:服务故障时,限流可以减少故障服务的请求,避免雪崩。
限流算法
固定窗口:将时间分成固定大小的窗口,每个窗口内限制请求数。简单但窗口边界问题。
滑动窗口:将时间分成更小的单元,记录每个单元的请求数。平滑无边界问题。
令牌桶:以恒定速率放入令牌,请求消耗令牌。可以应对突发流量。
漏桶:以恒定速率处理请求,平滑输出。
限流维度
QPS 限流:每秒请求数限流,适用于短时间请求。
并发限流:并发请求数限流,适用于长连接请求。
用户限流:根据用户 ID 限流,防止个别用户占用过多资源。
IP 限流:根据 IP 限流,防止恶意攻击。
限流策略
直接拒绝:请求超过限流阈值时直接拒绝,返回错误码或错误信息。
排队等待:请求超过限流阈值时排队等待,有请求完成则处理排队请求。
Warm Up:限流阈值从较小值逐渐增加到目标值,避免系统启动时大量请求导致故障。
匀速排队:请求以匀速通过,平滑处理请求。
降级
为什么需要降级
服务故障时,保证核心功能可用,降低用户体验损失。
资源不足时,释放非核心功能的资源,确保核心功能正常运行。
降级策略
默认值:返回默认值,如空列表、空对象、固定值。
缓存:返回缓存的响应,如 Redis 缓存的响应。
本地兜底:执行本地逻辑,如查询本地数据库。
快速失败:直接返回错误,不执行任何逻辑。
关闭非核心功能:暂时关闭非核心功能,释放资源。
降级级别
一级降级:核心功能降级,如订单创建失败返回友好提示。
二级降级:重要功能降级,如推荐服务故障返回热门商品。
三级降级:非核心功能降级,如评论服务故障直接关闭评论功能。
自动降级
超时降级:请求超时自动降级,返回默认值。
异常降级:请求异常(如异常率超过阈值)自动降级。
限流降级:请求被限流自动降级,返回限流提示。
限流降级的实现
Sentinel
Sentinel 是阿里开源的流量防卫组件,提供限流、熔断降级、系统保护。
Sentinel 的限流:QPS 限流、并发线程数限流、热点参数限流。
Sentinel 的降级:慢调用比例、异常比例、异常数。
Sentinel 的优势:性能高、实时监控、规则动态配置。
Hystrix
Hystrix 是 Netflix 开源的熔断降级库,已停止维护。
Hystrix 的特性:熔断器、线程池隔离、信号量隔离、请求缓存、请求合并。
Resilience4j
Resilience4j 是受 Hystrix 启发的容错库,提供熔断器、限流、重试、舱壁隔离。
Resilience4j 的优势:轻量级、模块化、性能高、维护活跃。
限流降级的最佳实践
分层限流:网关层限流(粗粒度)、应用层限流(细粒度),形成多级防护。
限流阈值设置:根据压测结果设置限流阈值,留有余量。
降级逻辑要简单:降级逻辑不应依赖其他服务,避免降级失败。
降级逻辑要有默认值:降级时返回默认值,保证核心功能可用。
监控限流降级:监控限流降级触发情况,分析限流降级原因,调整策略。
定期演练:定期进行限流降级演练,验证降级逻辑的有效性。
限流降级是保护服务的重要手段,合理使用限流降级,可以提高系统的稳定性和可用性。