Padrão de BulkheadBulkhead pattern

Isole os elementos de uma aplicação em conjuntos, de modo a que se um falhar, os outros continuam a funcionar.Isolate elements of an application into pools so that if one fails, the others will continue to function.

Este padrão tem o nome Bulkhead porque assemelha-se às 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 do navio ficar comprometido, apenas as secções danificadas se enchem com água, impedindo que o navio se 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

Uma aplicação baseada na cloud pode incluir vários serviços, em que cada serviço tem um ou mais consumidores.A cloud-based application may include multiple services, with each service having one or more consumers. Uma carga excessiva ou falha num serviço irá 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 poderá enviar pedidos para vários serviços em simultâneo, utilizando os recursos para cada pedido.Moreover, a consumer may send requests to multiple services simultaneously, using resources for each request. Quando o consumidor envia um pedido para um serviço que está configurado incorretamente ou não responde, os recursos utilizados pelo pedido do cliente não podem ser libertados atempadamente.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. À medida que os pedidos para o serviço continuam, os recursos podem esgotar-se.As requests to the service continue, those resources may be exhausted. Por exemplo, o conjunto de ligações do cliente poderá esgotar-se.For example, the client's connection pool may be exhausted. Nessa altura, os pedidos pelo consumidor a outros serviços são afetados.At that point, requests by the consumer to other services are affected. Eventualmente, o consumidor deixa de poder enviar pedidos para outros serviços, não apenas para o serviço original sem resposta.Eventually the consumer can no longer send requests to other services, not just the original unresponsive service.

O mesmo problema de esgotamento de recursos afetará os serviços com vários consumidores.The same issue of resource exhaustion affects services with multiple consumers. Um grande número de pedidos provenientes de um cliente poderá 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 já não conseguem consumir o serviço, provocando um efeito de falhas em cascata.Other consumers are no longer able to consume the service, causing a cascading failure effect.

SoluçãoSolution

Particione os serviços em diferentes grupos, com na base na carga do consumidor e nos requisitos de disponibilidade.Partition service instances into different groups, based on consumer load and availability requirements. Este design ajuda a isolar falhas e permite-lhe suportar a funcionalidade dos serviços para alguns consumidores, 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 particionar recursos para garantir que os recursos utilizados para chamar um serviço não afetam os recursos utilizados para chamar outro serviço.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, no caso de um consumidor que chama vários serviços, pode ser-lhe atribuído um conjunto de ligações para cada serviço.For example, a consumer that calls multiple services may be assigned a connection pool for each service. Se um serviço falhar, só afeta o conjunto de ligações para esse serviço, permitindo que o consumidor continue a utilizar os 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.

As vantagens deste padrão incluem:The benefits of this pattern include:

  • Isola os consumidores e serviços de falhas em cascata.Isolates consumers and services from cascading failures. Um problema que afeta um consumidor ou serviço pode ser isolado dentro do seu próprio bulkhead, impedindo a falha total da aplicação.An issue affecting a consumer or service can be isolated within its own bulkhead, preventing the entire solution from failing.
  • Permite-lhe preservar alguma funcionalidade em caso de falha de serviços.Allows you to preserve some functionality in the event of a service failure. Outros serviços e funcionalidades da aplicação continuarão a funcionar.Other services and features of the application will continue to work.
  • Permite-lhe implementar os serviços que oferecem uma qualidade diferente de serviço para aplicações de consumo.Allows you to deploy services that offer a different quality of service for consuming applications. Um conjunto de consumidores de alta prioridade pode ser configurado para utilizar serviços de alta prioridade.A high-priority consumer pool can be configured to use high-priority services.

O diagrama seguinte mostra bulkheads estruturados em torno de conjuntos de ligações 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 provocar algum outro problema, o conjunto de ligações é isolado, pelo que apenas as cargas de trabalho que utilizam o conjunto de threads atribuído ao serviço A sã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. As cargas de trabalho que utilizam o serviço B e C não são afetadas e podem continuar a trabalhar sem interrupção.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 a chamar um único serviço.The next diagram shows multiple clients calling a single service. Cada cliente tem atribuída uma instância de serviço separada.Each client is assigned a separate service instance. O Cliente 1 tem efetuado demasiados pedidos e sobrecarregou a respetiva instância.Client 1 has made too many requests and overwhelmed its instance. Uma vez que cada instância de serviço está isolada das outras, os outros clientes podem continuar a fazer 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 do negócio e requisitos técnicos da aplicação.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 gestão.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 a repetição, o disjuntor automático e padrões de limitação para fornecer um processamento de falhas mais sofisticado.Consider combining bulkheads with retry, circuit breaker, and throttling patterns to provide more sophisticated fault handling.
  • Ao particionar consumidores em bulkheads, considere a utilização de processos, conjuntos de threads e semáforos.When partitioning consumers into bulkheads, consider using processes, thread pools, and semaphores. Os projetos como o Netflix Hystrix e Polly oferecem uma estrutura para criar bulkheads de consumidor.Projects like Netflix Hystrix and Polly offer a framework for creating consumer bulkheads.
  • Ao particionar serviços em bulkheads, considere implementá-los em máquinas virtuais, contentores ou processos separados.When partitioning services into bulkheads, consider deploying them into separate virtual machines, containers, or processes. Os contentores oferecem um bom equilíbrio de isolamento de recursos com sobrecarga consideravelmente baixa.Containers offer a good balance of resource isolation with fairly low overhead.
  • Os serviços que comunicam por mensagens assíncronas podem ser isolados através 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 a processarem mensagens na fila, ou um único grupo de instâncias que utilizam um algoritmo para remover da fila e distribuir o processamento.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 pretender distribuir inquilinos por partições, poderia colocar cada inquilino numa partição separada ou colocar vários inquilinos numa 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.
  • Monitorize o desempenho e SLA de cada partição.Monitor each partition’s performance and SLA.

Quando utilizar este padrãoWhen to use this pattern

Utilize este padrão para:Use this pattern to:

  • Isolar os recursos utilizados para consumir um conjunto de serviços de back-end, especialmente se a aplicação tiver a capacidade de fornecer algum nível de funcionalidade, mesmo quando um dos serviços não está a responder.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.
  • Isolar consumidores críticos de consumidores padrão.Isolate critical consumers from standard consumers.
  • Proteger a aplicação contra falhas em cascata.Protect the application from cascading failures.

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

  • Uma utilização menos eficiente dos recursos não for aceitável no projeto.Less efficient use of resources may not be acceptable in the project.
  • A complexidade adicionada não for necessáriaThe added complexity is not necessary

ExemploExample

O ficheiro de configuração Kubernetes seguinte cria um contentor isolado para executar um único serviço, com os 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"