vlambda博客
学习文章列表

Hystrix 构建高可用微服务(一)

了解Hystrix 是什么?


在分布式系统中,会有很多小的服务,每个服务之间相互依赖、相互调用,其中某个服务可能会调用很多其他依赖的服务,有的时候这些被依赖服务出现故障也是很正常的。

Hystrix 可以让我们对分布式系统中的服务进行合理的调用控制,加入一些调用延迟或者依赖故障容错降级机制

Hystrix 可以实现依赖服务之间的资源隔离,可以有效的防止某个依赖服务出现故障而导致整个系统的瘫痪;

Hystrix 还提依赖服务故障时的 fallback 容错降级机制。

总结,通过Hystrix 这些机制能够有效的帮助我们提升分布式系统的可用性和稳定性。

Hystrix 的设计机制

  • 对依赖服务调用时出现的调用延迟和调用失败进行控制和容错保护

  • 在复杂的分布式系统中,阻止某一个依赖服务的故障在整个系统中蔓延。比如某一个服务故障了,导致其它服务也跟着故障。

  • 提供 fail-fast(快速失败)和快速恢复的支持。

  • 提供 fallback 优雅降级的支持。

  • 支持近实时的监控、报警以及运维操作。

资源隔离举例如下:

假如我们有一个分布式系统,服务 A 依赖于服务 B,服务 B 依赖于服务 C/D/E。在这样一个成熟的系统内,比如说最多可能只有 100 个线程资源。正常情况下,40 个线程并发调用服务 C,各 30 个线程并发调用 D/E。

调用服务 C,只需要 20ms,现在因为服务 C 故障了,比如延迟,或者挂了,此时线程会 hang 住 2s 左右。40 个线程全部被卡住,由于请求不断涌入,其它的线程也用来调用服务 C,同样也会被卡住。这样导致服务 B 的线程资源被耗尽,无法接收新的请求,甚至可能因为大量线程不断的运转,导致自己宕机。这种影响势必会蔓延至服务 A,导致服务 A 也跟着挂掉。

Hystrix 可以对故障服务进行资源隔离,比如限制服务 B 只有 40 个线程调用服务 C。当此 40 个线程被 hang 住时,其它 60 个线程依然能正常调用工作。从而确保整个系统不会被拖垮。





Hystrix 更加细节的设计原则

  • 阻止任何一个依赖服务耗尽所有的资源,比如 tomcat 中的所有线程资源。

  • 避免请求排队和积压,采用限流和 fail fast 来控制故障。

  • 提供 fallback 降级机制来应对故障。

  • 使用资源隔离技术,比如 bulkhead(舱壁隔离技术)、swimlane(泳道技术)、circuit breaker(断路技术)来限制任何一个依赖服务的故障的影响。

  • 通过近实时的统计/监控/报警功能,来提高故障发现的速度。

  • 通过近实时的属性和配置热修改功能,来提高故障处理和恢复的速度。

  • 保护依赖服务调用的所有故障情况,而不仅仅只是网络故障情况。