高可用系统常用利器(一) - 服务降级 Hystrix

0、前言

互联网高并发系统一般QPS、TPS都比较高,当流量比较大的时候,有三种常见手段可以保证系统高可用和稳定:

  • 缓存
  • 服务降级与熔断
  • 服务限流

缓存的目的是减少数据库的压力和提升系统访问速度,使用缓存要需要考虑缓存穿透、缓存失效以及高并发情况下DB与缓存不一致的问题;服务降级与熔断是用来解决核心服务受到非核心服务的影响的一种手段,比如用户下单页面的优惠券展示,当优惠券展示的服务挂掉后,可以将这个服务屏蔽掉,不要影响用户正常的下单;有些场景是不可以用缓存和服务降级来解决,比如用户下单、抢购等,这个时候就需要用到服务限流,服务限流是用来在一定时间内限制访问服务的请求量,达到保护系统的手段。
本篇主要讲解服务降级中Hystrix技术栈的使用。

一、什么是Hystrix

在互联网分布式应用中,常常会将核心业务抽取出来当做独立的服务供别的服务使用。举个栗子,电商系统中会拆分成订单、库存、评论、C端展示等多个服务,每个服务都会有专门的RD进行维护。

用户下单的时候,首先会去订单服务中调用创建订单接口,创建订单接口又会去调用库存服务去查询用户选用的商品库存是否充足,如果
库存服务因为网络、bug等问题挂掉后,会导致创建订单的线程一直等待挂起,如果此时有大量请求进入系统会导致大量线程挂起,从而使整个系统瘫痪。

解决措施之一就是如果库存服务不可用后,可以用熔断的思想,使其快速失败返回一个库存不足的response,这样避免调用方服务不可用(可以通过代码容错进行实现,设置RPC接口的调用超时时间)。

又比如用户下单页面优惠券展示,在调用优惠券查询接口时发生故障,会导致用户下单无法继续。这个时候就可以用降级的思想,使优惠券查询接口直接返回空,这样用户端最多就看不到所能使用的优惠券,但是可以正常下单,不影响核心业务的使用。

但是不能一次调用超时就直接熔断或降级,如何设置次数、发生熔断的时间、发生熔断之后的后续操作等都需要有个服务进行处理,而Hystrix就提供了一种服务降级与熔断的实现。

Hystrix的介绍

Hystrix是netflix开源的一个容灾框架,解决当外部依赖故障时拖垮业务系统、甚至引起雪崩的问题
(wiki see:https://github.com/Netflix/Hystrix/wiki)。
Hystrix是豪猪的意思。豪猪是一种全身是刺的动物,netflix使用Hystrix意味着Hystrix能够像豪猪的刺一样保护你的应用。Hystrix是Netflix(网飞公司)开源的一款容错系统。该框架为分布式环境提供了弹性、增加了延迟容忍和容错。

Hystrix提供了如下操作:

  • 降级:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回兜底数据;
  • 隔离(线程池隔离和信号量隔离):限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
  • 融断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复;
  • 缓存:提供了请求缓存、请求合并实现;
  • 支持实时监控、报警、控制(修改配置)。

二、Hystrix的原理

下面简单介绍下Hystrix提供的降级、熔断和缓存的实现原理。

2.1 工作主流程
  • 1、通过继承HystrixCommand / HystrixObservableCommand,生成Hystrix命令;
  • 2、执行命令
    • execute() — 同步,直接返回结果,execute()=queue().get();
    • queue() — 异步,返回Future,queue()=toObservable().toBlocking().toFuture();
    • observe() —请求返回一个观察者,观察者需要注册行为监听器,处理返回结果。(在调用observe时就已经触发请求);
    • toObservable() — 返回一个延迟的观察者,在注册监听器的动作完成后才会触发请求。
  • 3、判断缓存中是否已经有返回数据;
  • 4、判断断路器是否开启;如果开启,则进入步骤8,否则进入步骤5;
  • 5、判断Thread Pool/Semaphore 是否已满
    如果并发量已满,则执行步骤8,否则进入步骤6
  • 6、执行;如果执行失败,Hystrix将会执行走向步骤8,并抛弃最终返回的结果;如果执行结束,Hystrix会返回结果并提供日志和度量数据
  • 7、计算回路健康度
    Hystrix报告成功、失败、拒绝的结果给断路器(circuit breaker),circuit breaker维护一个滚动的计数器计算统计数据。circuit breaker使用这些数据去决定是否将状态置为开启
  • 8、执行fallback
    4/5/6不满足以及异常都会进入fallback,实现HystrixCommand.getFallback()或HystrixObservableCommand.resumeWithFallback()

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值