Hystrix 使用的 Bulkhead Pattern 是什么?

What is Bulkhead Pattern used by Hystrix?

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

一般

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

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

我认为 bulkhead 模式是在 Michael T. Nygard 的 Release It! 一书中普及的。

Hystrix 解决了什么问题

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

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

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

Hystrix 的方法

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

线程隔离

标准做法是将所有对组件C的请求交给单独的线程池,线程数固定,没有(或很小)请求队列。

信号量隔离

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

差异

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

这是受 Netflix Hystrix 启发的 Resilience4j 中用于舱壁的 good example with runtime explanation

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

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

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

隔板模式是一种隔离和容错的设计模式。

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

你可以参考这个:Bulkhead pattern