什么是服务降级?


一、什么是服务降级?

服务降级是一种提高系统稳定性和可用性的策略,简单来说,就是当服务器压力增加时,根据业务需求判断,从而不对外提供部分非核心服务的功能。

简单举个例子,在秒杀系统中,如果秒杀过程中服务器出现宕机或者部分依赖服务不可用了,做与不做服务降级有什么区别:

  • 做服务降级:用户点击抢购后,页面直接返回”系统繁忙,请稍后重试/商品已售空”,用户就能知道是系统崩了/自己没抢到导致的
  • 不做服务降级:用户点击抢购后,页面会一直在loading或者显示报错页面,影响用户体验

二、服务降级有哪些方式?

服务降级一般可以分为主动降级和被动降级,具体区别为:

  • 主动降级:指通过人工或者定时任务方式来进行降级。一般用在可以预知哪些场景会容易出现问题,比如在秒杀系统中,核心服务是下单支付,那么我们就可以把一些非核心服务(如评论、收藏服务等)关掉,这样就可以减少计算资源,保证核心服务的稳定运行
  • 被动降级:指通过限流、超时、故障等策略来进行降级。一般出现在依赖的数据库、第三方服务调用响应慢时,且该服务不是核心服务时会自动降级
    • 限流策略降级:为了避免高并发流量压垮系统导致不可用问题,会通过限流策略会限制一部分用户请求,如在秒杀系统中,设置了10件库存,那就可以在接受了1000次或更多次请求后,就拦截后续用户请求,提示已售空/系统繁忙
    • 超时策略降级:为了防止数据库访问、第三方服务调用出现超时导致系统接口时延高的问题,会通过超时策略在超时后做一些降级,如在秒杀系统中,页面除了核心的下单支付功能外,还有推荐banner滚动等,那么我们可以在超时后返回一批默认的数据(而不是报错/阻塞)
    • 熔断策略降级:如果依赖的数据库/第三方服务挂了,那么我们就要根据异常返回错误码来触发熔断策略了,从而进行降级,如在秒杀系统中,页面除了核心的下单支付功能外,还有推荐banner滚动等,那么我们可以在内部调用多次失败后,后续的请求就直接返回一批默认的数据(而不会再去调用从而导致失败)

三、服务降级工具

目前市面上主流的服务降级工具主要有Alibaba SentinelSpring Cloud Hystrix

1、Alibaba Sentinel

Alibaba Sentinel是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维护来帮助用户保护服务的稳定性。

2、Spring Cloud Hystrix

Spring Cloud Hystrix是一个库,它提供了服务与服务之间的容错功能,主要体现在延迟容错和容错,从而做到控制分布式系统中的联动故障。Spring Cloud Hystrix通过隔离服务的访问点,阻止联动故障,并提供故障的解决方案,从而提高了这个分布式系统的弹性。

3、Sentinel和Hystrix的区别

Alibaba Sentinel侧重于多样化的流量控制、熔断降级、系统负载保护、实时监控和控制台等
Spring Cloud Hystrix侧重于以隔离和熔断为主的容错机制,超时或被熔断的调用将会快速失败,并可以提供fallback机制


下面是在Spring Sentinel官方文档中,关于Sentinel与Hystrix的对比

Alibaba Sentinel Hystrix
隔离策略 信号量隔离 线程池隔离/信号量隔离
熔断降级策略 基于响应时间或失败比率 基于失败比率
实时指标实现 滑动窗口 滑动窗口(基于RxJava)
规则配置 支持多种数据源 支持多种数据源
扩展性 多个扩展点 插件的形式
基于注解的支持 支持 支持
限流 基于QPS,支持基于调用关系的限流 有限的支持
流量整形 支持慢启动、匀速器模式 不支持
系统负载保护 支持 不支持
控制台 开箱即用,可配置规则、查看秒级监控、机器发现等 不完善
常见框架的适配 Servlet、Spring Cloud、Dubbo、gRPC等 Servlet、Spring Cloud Netflix

文章作者: GaryLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 GaryLee !
  目录