什么是hystrix

hystrix是一种高可用性保障的框架,由国外最大的视频网站netflix开发。集成了各种高可用相关的功能,确保系统在hystrix保护下,除了一些物理上导致的主机问题,一般软件的故障都会保证系统整体的一个运行。

高可用架构

一个高可用架构应该包含如下这些内容:

  • 资源隔离,在系统中每个模块都有自己应该得到的线程资源,不至于某一个代码循环逻辑出现bug后,启动大量线程每一个都死循环,占用所有的线程资源,最终导致资源耗尽而崩溃。
  • 限流,避免大量的并发流量同时进入系统,如果并发请求过高的话,为了保证系统可用性,就可以拒绝一部分流量。
  • 熔断,系统中某一块出故障之后就不让用户访问到这里,避免大量的请求直接失败导致系统崩溃之类的。
  • 降级,比如当msyql崩溃,那么当用户请求时就先返回缓存中的少量数据,或者返回固定的值之类的。
  • 运维监控,监控+告警+优化,监控系统中的各种异常情况,有问题就及时告警,不短的优化系统中的参数配置代码之类的。

hystrix设计原则

  • 对依赖服务调用时出现调用失败和调用延迟进行控制和容错保护
  • 在复杂的系统中,阻止一个系统的故障在整个系统中蔓延
  • 提供fail-fast(快速失败)和快速恢复的支持
  • 阻止任何一个依赖服务耗尽资源,比如tomcat中的所有线程资源
  • 避免请求排队和积压,采用限流和fail-fast来控制故障
  • 提供fallback优雅降级来应对故障
  • 使用资源隔离技术比如bulkhead(舱壁隔离技术),swimlane(泳道隔离),cricuit breaker(短路技术),来限制任何一个依赖服务的故障影响
  • 近实时的监控、报警以及运维的操作来提高故障发现速度
  • 通过近实时的属性和配置热修改功能来提高故障处理和恢复速度
  • 保护依赖服务所有的故障情况,而不仅仅是网络故障情况

hystrix如何实现它的目标

  1. 通过HystrixCommand和HystrixObservableCommand来封装对外部依赖的访问请求,这个访问请求一般会运行在独立的线程中,进行资源隔离
  2. 对于超出我们设定阈值的服务调用,直接进行超时,不允许长时间阻塞,这个超时时间默认是99.5%的访问时间,但是一般我们可以自己设置一下
  3. 对每一个依赖的服务维护一个独立的线程池,或者是semaphore,当线程池已满时,直接拒绝对这个服务的调用
  4. 对依赖服务的调用成功次数,失败次数,超时次数,拒绝次数进行统计
  5. 如果一段时间内对一个依赖服务调用的失败次数超过了阈值,则自动进行熔断,一定时间内对该服务的调用直接降级,一段时间后再自动尝试恢复
  6. 当一个服务出现失败、拒绝、超时、短路等异常情况,自动调用fallback降级机制,
  7. 对属性和配置的修改提供近实时的支持