Hystrix 是一个用于复杂分布式系统中延迟和容错的 Netflix API,使用 Bulkhead Pattern线程隔离技术。有人可以详细说明一下吗?
最佳答案
一般
一般来说,隔板模式的目标是避免系统某一部分出现故障而导致整个系统瘫痪。该术语来自于船舶,其中船舶被分成单独的水密舱,以避免单个船体破裂导致整艘船被淹没;它只会淹没一个舱壁。
隔板模式的实现可以采取多种形式,具体取决于您想要保护系统免受哪种故障的影响。我只会在这个答案中讨论 Hystrix 处理的故障类型。
我认为舱壁图案是由 Michael T. Nygard 所著的Release It!一书普及的。
Hystrix 解决什么问题
Hystrix 中的隔板实现限制对组件的并发调用数量。这样,等待组件回复的资源(通常是线程)的数量就受到限制。
假设您有一个基于请求的多线程应用程序(例如典型的 Web 应用程序),该应用程序使用三个不同的组件:A、B 和 C 。如果对组件C的请求开始挂起,最终所有请求处理线程都将挂起,等待C的答复。这将使应用程序完全无响应。如果对 C 的请求处理缓慢,如果负载足够高,我们也会遇到类似的问题。
Hystrix 的隔板模式实现限制了对组件的并发调用数量,并且在这种情况下可以保存应用程序。假设我们有 30 个请求处理线程,并且对 C 的并发调用限制为 10 个。那么最多 10 个请求处理线程在调用 C 时可以挂起,其他 20 个线程仍然可以处理请求并使用组件 A 和 B。
Hystrix 的方法
Hystrix' 有两种不同的隔离方法:线程隔离和信号量隔离。
线程隔离
标准方法是将所有对组件C的请求移交给一个单独的线程池,该线程池具有固定数量的线程,并且没有(或很小)请求队列。
信号量隔离
另一种方法是让所有调用者在向 C 发出请求之前获得许可(超时时间为 0)。如果无法从信号量获取许可,则不会传递对 C 的调用。
差异
线程池方法的优点是传递给C的请求可以超时,这是使用信号量时不可能实现的。
关于design-patterns - Hystrix 使用的 Bulkhead 模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30391809/