降级组件对比

Nov 5, 2023


前言

目前业内常见的微服务系统容错降级方案主要有几个:

这里对几个组件简单介绍一下。

Hystrix

Hystrix [hɪst’rɪks] 是Netflix开源的延迟和容错组件,主要是用于隔离远程系统,服务和第三方组件的一些接口故障,包括无法连接,超时,报错等,实现在复杂的分布式系统中的容错和弹性。

Hystrix基于Java开发,目前最新的版本是1.5.18,支持如下功能:

  • 请求限流
  • 服务降级
  • 服务隔离(舱壁模式)
  • 服务熔断
  • 调用缓存

Netflix已经宣布不再开发新功能,仅维护现有功能稳定,并且推荐使用新的高可用框架Resilience4j。

Reselience4j

Resilience4j [rɪˈzɪliəns] 是一个函数式编程设计的容错库,是Hystrix停更之后推荐的高可用容错组件,Resilience4j本身是受Hystrix启发而设计开发的,相比于Hystrix更加轻量,少了很多外部依赖,只依赖Vavr。

Resilience4j提供了一些基于装饰器模式的高阶函数,用于增强函数接口和lambda表达式的方法,用于增强断路器,限流器,重试器和舱壁隔离等。Resilience4j的设计思想是按需取用,因为不同功能都区分了模块,主要提供了如下几个核心功能模块:

  • resilience4j-circuitbreaker:断路模块,支持熔断功能
  • resilience4j-ratelimiter:速率模块,支持限流功能
  • resilience4j-bulkhead:舱壁模块,支持服务隔离
  • resilience4j-retry:重试模块,支持自动重试
  • resilience4j-timelimiter:超时模块,支持超时处理
  • resilience4j-cache:缓存模块,支持调用缓冲

Resilience4j目前还在持续发展,社区也有一定的活跃程度,但是目前国内使用比较少。

Sentinel

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

Sentinel是一个轻量的组件,不依赖任何框架和库,能够运行于Java 8及以上的版本,同时对常见的开源组件有较好的支持,主要的功能包括:

  • 流量控制
  • 熔断降级
  • 系统负载保护

sentinel目前社区活跃,在国内广泛使用,是一个非常受欢迎的容错组件。

组件对比

对比项 Hystrix Resilience4j Sentinel 对比
流量控制 1.基于信号量
2.基于线程数(官方推荐)
支持信号量限流 1. 基于QPS和并发线程数的限制
2. 基于调用关系的流量控制
1. Hystrix对限流的支持功能较弱,比较有限
2. Resilience4j的限流只支持信号量,但限流功能较强
3. Sentinel的限流功能最灵活强大
熔断策略 基于数量的异常比例 1. 基于请求数量的滑动窗口
2. 基于时间的滑动窗口
基于滑动时间窗口 1. Hystrix熔断策略单一
2. Resilience4j的熔断策略最丰富,但是基于请求数量的滑动窗口策略较少使用
3. Sentinel基于滑动时间窗口的熔断策略功能最灵活
服务隔离策略 基于线程池隔离 1. 基于信号量隔离
2. 基于有界队列和固定的线程池隔离
基于信号量隔离 1. Hystrix基于线程池的隔离策略较重,并且需要预先设置好各个服务的线程池数量
2. Resilience4j的隔离策略较灵活丰富
3. Sentinel中规中矩,仅支持信号量隔离
黑白名单 不支持 不支持 基于来源配置黑白名单 黑白名单功能比较少用,只有在极特殊的场景进行动态阻断流量使用
指标监控 支持实时控制台,需要接入springboot框架 支持通过prometheus接入grafana监控 支持开箱即用的实时控制台,并且可以通过控制台动态修改降级规则 1. Sentinel的实时控制台最强大,但是缺少报警功能
2. resilience4j可以通过接入grafana实现报警功能
3. Hystrix的控制台较弱,只能看数据,并且有框架依赖
系统自适应保护 不支持 不支持 支持 Sentinel可以针对系统负载情况进行自适应保护,防止系统出现集群故障
动态规则 基于Archaius的动态配置 不支持 通过控制台动态配置 1. Hystrix基于文件的动态配置,需要通过svn/git等工具进行配置文件管理
2. Sentinel可以通过控制台或者接口进行修改
3. Resilience4j需要定制开发实现动态配置
规则持久化 基于配置文件存储 不支持(写在代码中) Zookeeper
Apollo
Nacos
1. Sentinel的配置持久化支持较好,并且可以自主扩展其他持久化存储
2. Resilience4j需要定制开发实现配置持久化
主流框架适配 spring boot
spring cloud
1. spring boot
2. spring cloud
3. 其他(参考文档
1. spring boot
2. spring cloud
3. 其他(参考文档
1. 实际上几个组件对spring boot/spring cloud体系的集成都是不错的
2. sentinel有更多开源框架的适配
3. sentinel适配spring boot 2.0.x版本的组件已经不再维护,建议升级了
基于插件机制 基于插件机制 通过springboot框架提供的插件机制 支持功能槽扩展
内置SPI机制扩展
1. Hystrix官网提供了插件机制支持扩展和二次开发
2. Resilience4j官方文档没有提及扩展和二次开发的能力
3. Sentinel的扩展能力最强,设计时已经预留基于责任链模式的扩展槽,并且内置提供了SPI机制用于扩展开发
最新稳定版本 1.5.8 1.7.0 1.8.1  

推荐方案

从上面的对比中可以看出,Hystrix由于已经不在发展了,首先抛弃。对比Resilience4j,Sentinel具有社区更活跃,功能更完整,应用更广泛等明显优势,建议使用Sentinel作为容错降级的首选组件。 但是Sentinel目前的功能还不能完全满足需求,主要缺少如下内容:

控制台存在如下问题:

  • 仅支持单机部署,不作为开箱即用的生产环境控制台
  • 控制台只能查看最近5分钟的指标数据,缺乏持久化的能力
  • 不支持权限划分,所有人登录控制台都能修改所有应用的规则
  • 没有开箱即用对接Grafana等报表和监控平台,缺乏有效的报警手段

以上的功能,实际上可以通过SPI机制时间扩展开发。

附:Sentinel版本和springboot版本对应关系:版本说明