Padrão de bulkheadBulkhead pattern

Isole os elementos de um aplicativo em pools para que, se um falhar, os outros continuem a funcionar.Isolate elements of an application into pools so that if one fails, the others will continue to function.

Esse padrão é denominado Bulkhead (tabique) porque é parecido com as partições seccionadas do casco de um navio.This pattern is named Bulkhead because it resembles the sectioned partitions of a ship's hull. Se o casco de um navio for comprometido, somente a seção danificada se encherá de água, impedindo que o navio afunde.If the hull of a ship is compromised, only the damaged section fills with water, which prevents the ship from sinking.

Contexto e problemaContext and problem

Um aplicativo baseado em nuvem pode incluir vários serviços, cada um deles tendo um ou mais consumidores.A cloud-based application may include multiple services, with each service having one or more consumers. Carga excessiva ou falha em um serviço afetará todos os consumidores do serviço.Excessive load or failure in a service will impact all consumers of the service.

Além disso, um consumidor pode enviar solicitações a vários serviços ao mesmo tempo usando recursos para cada solicitação.Moreover, a consumer may send requests to multiple services simultaneously, using resources for each request. Quando o consumidor envia uma solicitação para um serviço que está configurado incorretamente ou não está respondendo, os recursos usados pela solicitação do cliente não podem ser liberados de maneira oportuna.When the consumer sends a request to a service that is misconfigured or not responding, the resources used by the client's request may not be freed in a timely manner. Conforme as solicitações ao serviço continuam, esses recursos podem ser esgotados.As requests to the service continue, those resources may be exhausted. Por exemplo, o pool de conexão do cliente pode ser esgotado.For example, the client's connection pool may be exhausted. Neste ponto, as solicitações do consumidor a outros serviços são afetadas.At that point, requests by the consumer to other services are affected. Por fim, o consumidor não poderá mais enviar solicitações a outros serviços, não apenas ao serviço que originalmente não estava respondendo.Eventually the consumer can no longer send requests to other services, not just the original unresponsive service.

O mesmo problema de esgotamento de recursos afeta serviços com vários consumidores.The same issue of resource exhaustion affects services with multiple consumers. Um grande número de solicitações originadas de um cliente pode esgotar os recursos disponíveis no serviço.A large number of requests originating from one client may exhaust available resources in the service. Outros consumidores não são conseguem mais consumir o serviço, causando um efeito de falha em cascata.Other consumers are no longer able to consume the service, causing a cascading failure effect.

SoluçãoSolution

Particione instâncias de serviço em grupos diferentes conforme a carga do consumidor e nos requisitos de disponibilidade.Partition service instances into different groups, based on consumer load and availability requirements. Esse design ajuda a isolar falhas e permite que você mantenha a funcionalidade do serviço para alguns clientes mesmo durante uma falha.This design helps to isolate failures, and allows you to sustain service functionality for some consumers, even during a failure.

Um consumidor também pode dividir os recursos para garantir que os recursos usados para chamar um serviço não afetem os recursos usados para chamar outro.A consumer can also partition resources, to ensure that resources used to call one service don't affect the resources used to call another service. Por exemplo, um pool de conexão para cada serviço poderá ser atribuído a um consumidor que chame vários serviços.For example, a consumer that calls multiple services may be assigned a connection pool for each service. Se um serviço começar a falhar, isso afetará somente o pool de conexão atribuído a esse serviço, permitindo que o consumidor continue usando outros serviços.If a service begins to fail, it only affects the connection pool assigned for that service, allowing the consumer to continue using the other services.

Os benefícios desse padrão incluem:The benefits of this pattern include:

  • Isolar os consumidores e os serviços para que não haja falhas em cascata.Isolates consumers and services from cascading failures. Um problema que afeta um consumidor ou um serviço pode ser isolado em seu próprio bulkhead, impedindo que a solução inteira falhe.An issue affecting a consumer or service can be isolated within its own bulkhead, preventing the entire solution from failing.
  • Permitir que você preserve algumas funcionalidades em caso de falha de serviço.Allows you to preserve some functionality in the event of a service failure. Outros serviços e recursos do aplicativo continuarão a funcionar.Other services and features of the application will continue to work.
  • Permitir que você implante os serviços que oferecem uma qualidade de serviço diferente para aplicativos de consumo.Allows you to deploy services that offer a different quality of service for consuming applications. Um pool de consumidor de alta prioridade pode ser configurado para usar serviços de alta prioridade.A high-priority consumer pool can be configured to use high-priority services.

O diagrama a seguir mostra bulkheads estruturados em torno de pools de conexão que chamam serviços individuais.The following diagram shows bulkheads structured around connection pools that call individual services. Se o Serviço A falhar ou causar algum outro problema, o pool de conexão será isolado, assim, somente as cargas de trabalho que usem o pool de threads atribuído ao Serviço A serão afetadas.If Service A fails or causes some other issue, the connection pool is isolated, so only workloads using the thread pool assigned to Service A are affected. Cargas de trabalho que usam os Serviços B e C não são afetadas e podem continuar trabalhando sem interrupções.Workloads that use Service B and C are not affected and can continue working without interruption.

Primeiro diagrama do padrão de Bulkhead

O diagrama seguinte mostra vários clientes chamando um único serviço.The next diagram shows multiple clients calling a single service. Cada cliente é atribuído a uma instância de serviço separada.Each client is assigned a separate service instance. O Cliente 1 fez solicitações demais e sobrecarregou sua instância.Client 1 has made too many requests and overwhelmed its instance. Uma vez que cada instância de serviço é isolada de outras, os outros clientes podem continuar fazendo chamadas.Because each service instance is isolated from the others, the other clients can continue making calls.

Primeiro diagrama do padrão de Bulkhead

Problemas e consideraçõesIssues and considerations

  • Defina partições em torno de requisitos comerciais e técnicos do aplicativo.Define partitions around the business and technical requirements of the application.
  • Ao particionar serviços ou consumidores em bulkheads, considere o nível de isolamento oferecido pela tecnologia, bem como a sobrecarga em termos de custo, desempenho e capacidade de gerenciamento.When partitioning services or consumers into bulkheads, consider the level of isolation offered by the technology as well as the overhead in terms of cost, performance and manageability.
  • Considere combinar bulkheads com nova tentativa, interruptor de circuito e padrões de limitação para proporcionar um tratamento de falhas mais sofisticado.Consider combining bulkheads with retry, circuit breaker, and throttling patterns to provide more sophisticated fault handling.
  • Ao particionar os consumidores em bulkheads, considere usar processos, pools de threads e semáforos.When partitioning consumers into bulkheads, consider using processes, thread pools, and semaphores. Projetos como Netflix Hystrix e Polly oferecem uma estrutura para criar bulkheads do consumidor.Projects like Netflix Hystrix and Polly offer a framework for creating consumer bulkheads.
  • Ao particionar serviços em bulkheads, considere implantá-los em máquinas virtuais, contêineres ou processos separados.When partitioning services into bulkheads, consider deploying them into separate virtual machines, containers, or processes. Contêineres oferecem um bom equilíbrio de isolamento de recursos com uma sobrecarga razoavelmente baixa.Containers offer a good balance of resource isolation with fairly low overhead.
  • Serviços que se comunicam usando mensagens assíncronas podem ser isolados por meio de diferentes conjuntos de filas.Services that communicate using asynchronous messages can be isolated through different sets of queues. Cada fila pode ter um conjunto dedicado de instâncias processando mensagens na fila ou um único grupo de instâncias usando um algoritmo para processamento de remoção da fila e expedição.Each queue can have a dedicated set of instances processing messages on the queue, or a single group of instances using an algorithm to dequeue and dispatch processing.
  • Determine o nível de granularidade dos bulkheads.Determine the level of granularity for the bulkheads. Por exemplo, se você quiser distribuir locatários entre partições, poderá colocar cada locatário em uma partição separada ou colocar vários locatários em uma partição.For example, if you want to distribute tenants across partitions, you could place each tenant into a separate partition, or put several tenants into one partition.
  • Monitore o desempenho e o SLA de cada partição.Monitor each partition’s performance and SLA.

Quando usar esse padrãoWhen to use this pattern

Use esse padrão para:Use this pattern to:

  • Isolar os recursos usados para consumir um conjunto de serviços de back-end, especialmente se o aplicativo puder fornecer algum nível de funcionalidade mesmo quando um dos serviços não estiver respondendo.Isolate resources used to consume a set of backend services, especially if the application can provide some level of functionality even when one of the services is not responding.
  • Isole os consumidores críticos dos consumidores padrão.Isolate critical consumers from standard consumers.
  • Proteja o aplicativo contra falhas em cascata.Protect the application from cascading failures.

Esse padrão pode não ser adequado quando:This pattern may not be suitable when:

  • Uso menos eficiente de recursos pode não ser aceitável no projeto.Less efficient use of resources may not be acceptable in the project.
  • A complexidade adicional não é necessáriaThe added complexity is not necessary

ExemploExample

O seguinte arquivo de configuração Kubernetes cria um contêiner isolado para executar um único serviço, com seus próprios recursos e limites de CPU e memória.The following Kubernetes configuration file creates an isolated container to run a single service, with its own CPU and memory resources and limits.

apiVersion: v1
kind: Pod
metadata:
  name: drone-management
spec:
  containers:
  - name: drone-management-container
    image: drone-service
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "1"