一、什么是服务降级?
服务降级是一种提高系统稳定性和可用性的策略,简单来说,就是当服务器压力增加时,根据业务需求判断,从而不对外提供部分非核心服务的功能。
简单举个例子,在秒杀系统中,如果秒杀过程中服务器出现宕机或者部分依赖服务不可用了,做与不做服务降级有什么区别:
- 做服务降级:用户点击抢购后,页面直接返回”系统繁忙,请稍后重试/商品已售空”,用户就能知道是系统崩了/自己没抢到导致的
- 不做服务降级:用户点击抢购后,页面会一直在loading或者显示报错页面,影响用户体验
二、服务降级有哪些方式?
服务降级一般可以分为主动降级和被动降级,具体区别为:
- 主动降级:指通过人工或者定时任务方式来进行降级。一般用在可以预知哪些场景会容易出现问题,比如在秒杀系统中,核心服务是下单支付,那么我们就可以把一些非核心服务(如评论、收藏服务等)关掉,这样就可以减少计算资源,保证核心服务的稳定运行
- 被动降级:指通过限流、超时、故障等策略来进行降级。一般出现在依赖的数据库、第三方服务调用响应慢时,且该服务不是核心服务时会自动降级
- 限流策略降级:为了避免高并发流量压垮系统导致不可用问题,会通过限流策略会限制一部分用户请求,如在秒杀系统中,设置了10件库存,那就可以在接受了1000次或更多次请求后,就拦截后续用户请求,提示已售空/系统繁忙
- 超时策略降级:为了防止数据库访问、第三方服务调用出现超时导致系统接口时延高的问题,会通过超时策略在超时后做一些降级,如在秒杀系统中,页面除了核心的下单支付功能外,还有推荐banner滚动等,那么我们可以在超时后返回一批默认的数据(而不是报错/阻塞)
- 熔断策略降级:如果依赖的数据库/第三方服务挂了,那么我们就要根据异常返回错误码来触发熔断策略了,从而进行降级,如在秒杀系统中,页面除了核心的下单支付功能外,还有推荐banner滚动等,那么我们可以在内部调用多次失败后,后续的请求就直接返回一批默认的数据(而不会再去调用从而导致失败)
三、服务降级工具
目前市面上主流的服务降级工具主要有Alibaba Sentinel和Spring 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 |