熔断降级
熔断降级是微服务架构保护服务的重要机制,当服务故障或响应过慢时,快速失败并返回默认值,避免故障扩散导致整个系统雪崩。
为什么需要熔断降级
服务雪崩:服务 A 调用服务 B,服务 B 响应慢或故障,服务 A 的线程池被占满,服务 A 也无法响应,故障向上扩散,最终整个系统不可用。
资源耗尽:服务响应慢,客户端不断重试,服务负载增加,最终资源耗尽。
熔断降级的目标:快速失败,避免等待无响应的服务。返回默认值,保证核心功能可用。自动恢复,服务恢复后自动切换回正常调用。
熔断器模式
熔断器模式源自电路熔断器,当检测到故障率达到阈值时,打开熔断器,快速失败。一段时间后,熔断器进入半开状态,允许少量请求通过,如果请求成功则关闭熔断器,否则继续打开。
熔断器状态:关闭(Closed,正常请求)、打开(Open,快速失败)、半开(Half-Open,尝试恢复)。
熔断器的实现:记录请求的成功和失败次数,计算失败率。失败率超过阈值(如 50%)且请求数超过最小阈值(如 10 次),则打开熔断器。熔断器打开一段时间后(如 1 分钟),进入半开状态,允许少量请求(如 3 次)通过,如果请求成功则关闭熔断器,否则继续打开。
熔断器的核心参数
失败率阈值:失败率达到多少时打开熔断器,如 50%。
最小请求数:请求数达到多少时才开始计算失败率,避免早期请求影响判断,如 10 次。
熔断时长:熔断器打开后多久进入半开状态,如 1 分钟。
半开请求数:半开状态允许通过的请求数,如 3 次。
超时时间:请求超过多久视为失败,如 3 秒。
降级策略
默认值:返回默认值,如空列表、空对象、固定值。
缓存:返回缓存的响应,如 Redis 缓存的响应。
本地兜底:执行本地逻辑,如查询本地数据库。
快速失败:直接返回错误,不执行任何逻辑。
主流熔断器实现
Hystrix
Hystrix 是 Netflix 开源的熔断降级库,已停止维护。
Hystrix 的特性:熔断器、线程池隔离、信号量隔离、请求缓存、请求合并。
Hystrix 的问题:停止维护、性能较差(基于线程池)、配置复杂。
Sentinel
Sentinel 是阿里开源的流量防卫组件,提供熔断降级、限流、系统保护。
Sentinel 的特性:熔断降级(支持慢调用比例、异常比例、异常数)、限流(QPS、并发线程数)、系统保护(CPU、RT、线程数)、实时监控(控制台实时监控)。
Sentinel 的优势:性能高(基于滑动窗口)、实时监控、规则动态配置、生态完善(Spring Cloud Alibaba、Dubbo)。
Sentinel 的模式:匀速排队(QPS 限流)、冷启动(慢慢增加流量)、拒绝策略(直接拒绝、Warm Up)。
Resilience4j
Resilience4j 是受 Hystrix 启发的容错库,提供熔断器、限流、重试、舱壁隔离。
Resilience4j 的特性:轻量级、模块化、性能高、维护活跃。
Resilience4j 的模块:CircuitBreaker(熔断器)、RateLimiter(限流)、Retry(重试)、Bulkhead(舱壁隔离)、Timelimiter(超时限制)。
舱壁隔离
舱壁隔离源自船舱的舱壁,将资源隔离,避免单个服务的问题影响整个系统。
线程池隔离:每个服务使用独立的线程池,线程池满后拒绝请求,避免服务间相互影响。
信号量隔离:每个服务限制并发请求数,并发数达到上限后拒绝请求,实现简单但无法超时。
熔断降级的最佳实践
设置合理的阈值:失败率阈值不宜过高(如 50%),最小请求数不宜过低(如 10 次),避免误判。
设置合理的超时:超时时间应大于服务正常响应时间,避免超时熔断。
设置合理的熔断时长:熔断时长不宜过短(如 1 分钟),避免频繁切换。
降级逻辑要简单:降级逻辑不应依赖其他服务,避免降级失败。
降级逻辑要有默认值:降级时返回默认值,保证核心功能可用。
监控熔断状态:监控熔断器的状态变化,及时发现异常。
定期演练:定期进行熔断演练,验证降级逻辑的有效性。
熔断降级是保护服务的重要手段,理解熔断器的原理和权衡,有助于设计合适的容错方案。