design-patterns - Hystrix 使用的 Bulkhead 模式是什么?

标签 design-patterns distributed-system hystrix

Hystrix 是一个用于复杂分布式系统中延迟和容错的 Netflix API,使用 Bulkhead Pattern线程隔离技术。有人可以详细说明一下吗?

最佳答案

一般

一般来说,隔板模式的目标是避免系统某一部分出现故障而导致整个系统瘫痪。该术语来自于船舶,其中船舶被分成单独的水密舱,以避免单个船体破裂导致整艘船被淹没;它只会淹没一个舱壁。

隔板模式的实现可以采取多种形式,具体取决于您想要保护系统免受哪种故障的影响。我只会在这个答案中讨论 Hystrix 处理的故障类型。

我认为舱壁图案是由 Michael T. Nygard 所著的Release It!一书普及的。

Hystrix 解决什么问题

Hystrix 中的隔板实现限制对组件的并发调用数量。这样,等待组件回复的资源(通常是线程)的数量就受到限制。

假设您有一个基于请求的多线程应用程序(例如典型的 Web 应用程序),该应用程序使用三个不同的组件:ABC 。如果对组件C的请求开始挂起,最终所有请求处理线程都将挂起,等待C的答复。这将使应用程序完全无响应。如果对 C 的请求处理缓慢,如果负载足够高,我们也会遇到类似的问题。

Hystrix 的隔板模式实现限制了对组件的并发调用数量,并且在这种情况下可以保存应用程序。假设我们有 30 个请求处理线程,并且对 C 的并发调用限制为 10 个。那么最多 10 个请求处理线程在调用 C 时可以挂起,其他 20 个线程仍然可以处理请求并使用组件 AB

Hystrix 的方法

Hystrix' 有两种不同的隔离方法:线程隔离和信号量隔离。

线程隔离

标准方法是将所有对组件C的请求移交给一个单独的线程池,该线程池具有固定数量的线程,并且没有(或很小)请求队列。

信号量隔离

另一种方法是让所有调用者在向 C 发出请求之前获得许可(超时时间为 0)。如果无法从信号量获取许可,则不会传递对 C 的调用。

差异

线程池方法的优点是传递给C的请求可以超时,这是使用信号量时不可能实现的。

关于design-patterns - Hystrix 使用的 Bulkhead 模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30391809/

相关文章:

apache-flink - 如何使用修改后的运算符放置来强制 Apache Flink?

java - Hystrix circuitBreaker.sleepWindowInMilliseconds 不工作

c++ - 单例行为相关查询

go - ZeroMQ 在断开连接的对等点上进行循环故障转移

java - 从静态方法返回多个值的最佳数据结构

javascript - Node.js分布式共享内存解决方案

spring - javanica @HystrixCommand 和 spring @Cacheable 执行顺序

design-patterns - 关于 MVP 和 MVVM 的一些混淆

mysql - 表特定查询与单个通用查询