什么是Hystrix使用的舱壁模式?

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

一般

一般来说,隔板模式的目标是避免系统某一部分的故障使整个系统失效。 这个术语来源于船舶被划分在不同的水密舱室中,以避免单个船体的突破,使整个船舶泛滥; 它只会淹没一个舱壁。

舱壁模式的实现可以采取多种forms,具体取决于您希望保护系统的故障types。 我只会讨论Hystrix在这个答案中处理的错误types。

我认为舱壁图案是由释放它的书推广 Michael T. Nygard。

什么hystrix解决

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

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

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

Hystrix的方法

Hystrix'有两种不同的方法来实现隔壁,线程隔离和信号隔离。

线程隔离

标准的方法是将所有对组件C的请求移交给具有固定数量的线程和没有(或小的)请求队列的独立线程池。

信号隔离

另一种方法是让所有的呼叫者在请求C之前获得一个许可(0超时)。 如果不能从信号中获取许可证,则对C的调用不能通过。

差异

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

Interesting Posts