将应用程序的元素隔离到池中,这样,如果一个元素发生故障,其他元素可继续工作。
此模式之所以称为“隔舱”(Bulkhead),是因为它类似于船体的分段区。 如果船体受到破坏,只有受损的分段才会进水,从而可以防止船只下沉。
基于云的应用程序可以包含多个服务,其中每个服务具有一个或多个使用者。 服务过载或发生故障会影响服务的所有使用者。
此外,一个使用者可以使用每个请求的资源同时向多个服务发送请求。 当使用者向配置不当或无响应的服务发送请求时,可能无法及时释放客户端请求所用的资源。 随着不断地向服务发送请求,这些资源可能会耗尽。 例如,客户端的连接池可能会耗尽。 此时,使用者向其他服务发出的请求会受到影响。 最终,使用者不再能够向其他服务(而不仅仅是原始的无响应服务)发送请求。
资源耗尽问题同样会影响具有多个使用者的服务。 源自一个客户端的大量请求可能耗尽服务中的可用资源。 其他使用者不再能够使用该服务,从而导致连锁故障效应。
根据使用者负载和可用性要求,将服务实例分区成不同的组。 此设计有助于隔离故障,即使在发生故障期间,也能为某些使用者保留服务功能。
使用者也可以将资源分区,确保用于调用一个服务的资源不会影响用于调用另一个服务的资源。 例如,对于调用多个服务的使用者,可为其分配每个服务的连接池。 如果某个服务开始发生故障,只有分配给该服务的连接池才会受到影响,因此,使用者可继续使用其他服务。
此模式的优势包括:
下图显示了围绕调用单个服务的连接池构建的隔舱。 如果服务 A 发生故障或导致其他某种问题,该连接池将被隔离,因此,只有使用分配给服务 A 的线程池的工作负荷才受影响。 使用服务 B 和 C 的工作负载不受影响,可继续工作而不会中断。
下图显示了调用单个服务的多个客户端。 为每个客户端分配了独立的服务实例。 客户端 1 发出了过多的请求,使其实例近乎瘫痪。由于每个服务实例相互隔离,其他客户端可继续发出调用。
使用此模式可以:
此模式可能不适用于以下情况: