Hystrix 使用的 Bulkhead Pattern 是啥?

Posted

技术标签:

【中文标题】Hystrix 使用的 Bulkhead Pattern 是啥?【英文标题】:What is Bulkhead Pattern used by Hystrix?Hystrix 使用的 Bulkhead Pattern 是什么? 【发布时间】:2015-08-04 04:30:34 【问题描述】:

Hystrix 是一种用于复杂分布式系统中的延迟和容错的 Netflix API,它使用Bulkhead Pattern 技术进行线程隔离。谁能详细说明一下。

【问题讨论】:

【参考方案1】:

一般

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

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

我认为隔板模式是由 Michael T. Nygard 的Release It!一书普及的。

Hystrix 解决了什么问题

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

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

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

Hystrix 的方法

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

线程隔离

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

信号量隔离

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

区别

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

【讨论】:

另外,在最初的 Hystrix wiki 中现在对这两种方法都有详细的描述:github.com/Netflix/Hystrix/wiki/How-it-Works 断路器和隔板有什么区别? @voipp 断路器是完全不同的东西。它们检测服务何时处于不健康状态并将调用者移动到“快速失败”状态,在这种状态下他们不会调用不健康的服务,而是返回错误代码,直到服务再次正常。这样可以避免使不健康的服务超载以使其可以恢复,并且可以防止级联故障,因为调用者不会减慢速度。【参考方案2】:

这是受 Netflix Hystrix 启发的 Resilience4j 中隔板的 good example with runtime explanation。

下面的示例配置可能会让使用更加清晰。

示例配置:在任何给定时间最多允许 5 个并发调用。让其他调用等待,直到正在进行的 5 个并发调用之一完成或直到最多 2 秒。

我们的想法是不要让任何系统的负载超过它们可以消耗的负载。如果传入负载大于消耗,则等待合理的时间或只是超时并转到备用路径。

【讨论】:

【参考方案3】:

Bulkhead 模式是一种用于隔离和容错的设计模式。

在微服务中,一个服务可能依赖于许多其他服务,如果其中一个依赖的服务宕机或访问超时,调用者可能会耗尽资源,从而无法调用其他正常的服务强>;如果我们使用bulkhead模式通过不同的线程池对服务进行分组和隔离,那么当一个线程池耗尽时,不会影响其他线程组的资源,也不影响其他服务的正常调用。

你可以参考这个:Bulkhead pattern

【讨论】:

这真的是超出公认答案的增值吗,非常全面?

以上是关于Hystrix 使用的 Bulkhead Pattern 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CircuitBreaker 与 TimeLimiter 和 Bulkhead 结合使用?

Spring Boot2+Resilience4j实现容错之Bulkhead

text 图案marker.patt

服务治理-Resilience4j(限流)

Nginx系列Nginx之location

nginx 至location