123

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

4

3 回答 3

214

一般的

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

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

我认为隔板模式是由《 Release It!》一书普及的!迈克尔·T·尼加德(Michael T. Nygard)。

Hystrix 解决了什么问题

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

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

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

Hystrix 的方法

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

线程隔离

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

信号量隔离

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

差异

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

于 2015-06-06T17:28:45.520 回答
2

这是受 Netflix Hystrix 启发的 Resilience4j 中隔板的运行时解释的一个很好的示例。

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

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

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

于 2019-11-11T20:57:17.637 回答
0

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

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

你可以参考这个:Bulkhead pattern

于 2021-06-28T03:31:25.223 回答